嵌套的for循环复杂性

时间:2013-10-29 12:05:39

标签: time complexity-theory

每个案例(a-d)的增长函数是什么?
我很难找到每个嵌套for循环的运行时间。我想我找到了其中一些,但我不确定。

A)

for(i = 1; i*i <= N; i = 2*i);

b)中

for(i = 1; i <= N; i = 2*i);
    for(j = 1; j <= i; j = j+1);

c)中

for(i = 1; i*i <= N; i=i+1);
    for(j=1; j <= i ; j=j+1);

d)

for(i = 1; i*i <= N; i=i+1)
    for(j = 1; j <= i ; j = 2*j);

2 个答案:

答案 0 :(得分:4)

这就是我得到的:

<强>生长

  1. O(log(sqrt(N)))
  2. O(N)
  3. O(N)
  4. O(log(sqrt(N)!)) = O(sqrt(N)*log(sqrt(N)))使用Stirling's approximation
  5. 确切数字[X]是X的整数部分)

    1. [log([sqrt(N)])]+1
    2. 2^([log(N)]+1)
    3. [sqrt(N)]*[sqrt(N)+1]/2
    4. 不太确定。
    5. 这里有一点检查:我用计数器实现了for循环,这是N=10000000的输出:

      a(N)= 12           a(10*N)= 14
      b(N)= 16777216     b(10*N)= 134217728
      c(N)= 5000703      c(10*N)= 50005000
      d(N)= 33861        d(10*N)= 123631
      

      编辑:根据要求,解释
      首先,考虑一下:

      • 我们正在处理整数,所以你看到的任何实际函数(基本上都是sqrtlog)你应该实际取整数部分。
      • 几乎总是在计算机科学中,log = log base 2

      现在:

      1. i从1变为sqrt(N),但它仅使用“2”的幂。在1之间有log(M)(实际上+1)2的幂和M,所以用M = sqrt(N)得到公式。

      2. i1N的权力为2,与之前一样。对于每个i,都有i个js。如果我们将每个i的js相加:
        1 + 2 + 4 + 8 + 16 + ... + 2^log(N) = 2N - 1 = O(N)

      3. i1转到sqrt(N)。对于每个i,都有i个js。和以前一样,我们总结每个i的js数​​量:
        1 + 2 + 3 + 4 + 5 + ... + sqrt(N) = sqrt(N) * sqrt(N+1) / 2 = O(N)

      4. i1转到sqrt(N)。对于每i j1仅使用2的幂,从ii,因此对于每个log(i),您有log(1) + log(2) + log(3) + log(4) + log(5) + ... + log(sqrt(N))个js。如果你把每一个j的总和加起来:

        log(a) + log(b) = log(a*b)
        对于对数log(1*2*3*4*5*..*sqrt(N)) = log( sqrt(N)! )的属性。将此应用于我们的总和:
        ln(N!) -> N*log(N) - N
        这是结果。鉴于阶乘是大数的问题,你可以使用斯特林的近似值:log(N)来表示大数。

      5. 使用整数部分的差异示例

        考虑2. N的整数部分保持不变,直到for加倍。这意味着,例如,此131072周期为N=65536和N = 131071执行相同数量的操作(N)。当131072变为262144(仅一个)时,操作次数加倍({{1}})。

答案 1 :(得分:1)

您可以使用Sigma Notation正式解决代码片段:

<强> A)

enter image description here

<强> b)中

enter image description here

<强> c)中

enter image description here

<强> d)

enter image description here