【问题标题】:Algorithm: Finding pattern between n and i?算法:寻找 n 和 i 之间的模式?
【发布时间】:2015-04-02 05:29:43
【问题描述】:

我有以下简单的算法:

int i = 2;
int n = {Domain is all integers >= 2}

while (I < N)
I = I * I;
execute(command);
end-while

我了解执行命令的次数(例如,n=16 将执行 3 次、n=2564 次等)
我想知道用 N 表示执行次数的最佳方式。

【问题讨论】:

  • 定义“最佳方式”的标准。你会如何测量它?或者比较。还是你只想要公式?
  • 查找“对数”。然后再次查找“对数”。

标签: algorithm iteration logarithm


【解决方案1】:

你只需要知道logarithm的简单概念。

但这不仅仅是一个简单的单级对数,一个简单的对数可以解决这样的问题:

2k = n ==> log2(n) = k

但你有:

22k = n ==> log2(log2(n)) = k

所以你的答案是:log2(log2(n))

您的迭代证明是 22k

第一次迭代你有 221 = 4 假设第 k 次迭代你有 22 k 现在你有 k+1 迭代:

22k * 22k = 22 k + 2k = 22k+1 并通过归纳证明: )

【讨论】:

    【解决方案2】:

    如果您只需要公式,那很简单。您需要计算将有多少次迭代......只需分析I 在每次迭代中将如何增长。

    1. I = i^2 = i^(2^1)
    2. I = i^2^2 = i^(2^2)
    3. I = i^2^2^2 = i^(2^3)
    4. I = i^2^2^2^2 = i^(2^4)

    等等。 k-thi^(2^k)

    现在您需要从I 获取k

    log i (I) = log i (i^(2^k)) => (2^k)

    log 2 (2^k) => k

    k = log i (log 2 (I))

    现在,您可以应用 I 始终低于 N,因此迭代次数受 log i (log 2 (N)) 的约束。确切的数字需要根据您的边界条件进行调整。您没有在任何地方初始化I,因此假设I=i 在第一次迭代之前。此外,I &lt;= NI &lt; N 将在确切的权力上有所不同。

    【讨论】:

      【解决方案3】:

      据我所知,这个计算没有公式。由于执行次数与一组数字重复。我已经对这个最多 2 个幂 20 的数字进行了模拟。下面是python代码

      1.for n= 2 Count is  0
      2.for n= 4 Count is  1
      3.for n= 8 Count is  2
      4.for n= 16 Count is  2
      5.for n= 32 Count is  3
      6.for n= 64 Count is  3
      7.for n= 128 Count is  3
      8.for n= 256 Count is  3
      9.for n= 512 Count is  4
      10.for n= 1024 Count is  4
      11.for n= 2048 Count is  4
      12.for n= 4096 Count is  4
      13.for n= 8192 Count is  4
      14.for n= 16384 Count is  4
      15.for n= 32768 Count is  4
      16.for n= 65536 Count is  4
      17.for n= 131072 Count is  5
      18.for n= 262144 Count is  5
      19.for n= 524288 Count is  5
      

      代码

      __author__ = 'Abhilash'
      import math
      i = 2;
      n = 2048
      k=[2,4,8,16,32,64,128,256,512,1024,2048,4096, 8192 , 16384 , 32768 , 65536 , 131072 , 262144 , 524288 ]
      for b in range(0,20):
          print int(math.pow(2,b)),",",
      x=0
      for b in range(0,len(k)):
          n=k[b]
          x=0
          i=2
          while i < n:
              i=i*i
              x=x+1
          print "for n=",n,"
      

      【讨论】:

      • 你能澄清一下吗?当 n=3 时,命令执行一次,(第一次迭代 i = 2,第二次迭代 i = 4,第三次 i = 16),所以如果 n=3.. 2(3^2) = 18 和 3^2 * 3^ 2 = 81...我错过了什么吗?
      猜你喜欢
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2021-06-16
      • 2017-01-08
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多