【问题标题】:Time complexity for dependant nested for loop?依赖嵌套for循环的时间复杂度?
【发布时间】:2014-02-06 11:18:52
【问题描述】:

你能解释一下如何计算时间复杂度吗?

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

所以,我知道外循环的时间复杂度是 O(logn),但是由于内循环的迭代次数取决于外循环的值,所以这个算法的复杂度不是 O(nlogn)。

书上说是 O(n)。

我真的不明白它是如何 O(n)...有人可以解释一下吗... 如果您能详细说明一下,我将不胜感激:D

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

【问题讨论】:

  • Nitpick:循环 O(n log n),但不是 Theta(n log n)。我不知道是否所有的大学都做出了区分……

标签: algorithm time-complexity nested-loops logarithm


【解决方案1】:

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

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.

【讨论】:

  • 对不起,但我似乎不明白... O(logn) 是如何消除的?也许一些数学解决方案可以帮助我更好地理解......
  • @user2228135 如果你研究这个系列,它会呈几何级数增长。您可以通过标准公式找到该几何级数的总和。
  • 是的,几何级数。例如,如果 n=4,则结果是二进制的 111,它比 1000 小一,即 2n。 (注意:我会从你的回答中删除那个草率的解释)
  • O(lg n) 并没有消失,因为它被总和所包含。计算并不像将外循环和内循环的复杂度相乘那么简单;相反,您需要明确地对一系列 O(lg n) 项求和,并且该总和的计算结果为 O(n)。
  • @KarolyHorvath 编辑了我的答案。
【解决方案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^((log(base2)n+1)-1/(2-1)
=2n-1.
=O(n)
所以内循环是O(n)。 所以总时间复杂度=O(n),因为O(n+log(base2)n)=O(n)。

更新:它也是 O(nlogn) 因为 nlogn>>n 对于 n 的大值,但它不是渐近紧密的。你可以说它是 o(nlogn)[Small o] 。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多