依赖嵌套for循环的时间复杂度?

时间:2014-02-06 11:18:52

标签: algorithm time-complexity nested-loops logarithm

你能解释一下如何找到时间复杂度吗?

sum=0;
for(k=1;k<=n;k*=2)
  for(j=1;j<=k;j++)
     sum++;

所以,我知道外部循环的时间复杂度为O(logn),但由于内部循环的迭代取决于外部循环的值,因此该算法的复杂性不是O(nlogn)。

这本书说它是O(n)。

我真的不明白它是如何O(n)...有人可以解释一下...... 如果你可以进入细节,我将非常感激btw:D

数学解决方案可以帮助我更好地理解......

3 个答案:

答案 0 :(得分:5)

看看内循环运行了多少次:

1 + 2 + 4 + 8 + 16 +...+ n

请注意,如果n = 32,那么此sum = 31 + 32. ~ 2n 这是因为除了最后一个术语之外的所有术语的总和几乎等于最后一个术语。

因此总体复杂度= O(n)

编辑:

几何级数和(http://www.mathsisfun.com/algebra/sequences-sums-geometric.html)的顺序为:

(2^(logn) - 1)/(2-1) = n-1.

答案 1 :(得分:2)

外循环执行log(Base2)n次。因此它是O(log(Base2)n)。

对于外循环的每次迭代,内循环执行k次。现在在外循环的每次迭代中,k增加到k * 2.

所以内循环迭代的总数= 1 + 2 + 4 + 8 + ... + 2 ^(log(Base2)n)
= 2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ log(Base2)n (geometric series)
= 2 ^((日志(BASE2)的n + 1)-1 /(2-1)
= 2n-1个。
= O(n)的
所以内环是O(n)。 所以总时间复杂度= O(n),如O(n + log(base2)n)= O(n)。

更新:它也是O(nlogn),因为nlogn&gt;&gt; n代表n的大值,但它不是渐近紧的。你可以说它是o(nlogn)[小o]。

答案 2 :(得分:-1)

我相信您应该按照以下步骤正式获取算法的增长复杂度顺序,使用数学(Sigma Notation):

enter image description here