【问题标题】:complexity of two dependent for loops with outer loop of log n complexity具有 log n 复杂度的外循环的两个依赖 for 循环的复杂度
【发布时间】:2013-09-26 18:19:42
【问题描述】:

问题

计算这个算法的复杂度:

 for(i=n; i>1;i=i/2)
   for(j=i;j<n;j++){
         statement;
   }

我之前在这个话题上做了什么:

第一个循环运行 logn 次。 第二个循环运行 n-i 次, i 从 n 开始,并在每次外循环迭代中更改为 i/2。所以内部循环是这样运行的:

n-n                             0 times

n - n/2                        n/2 times

n - n/4                        3n/4 times

n - n/8                        7n/8 times

n - n/16                     15n/16 times

以此类推直到

n - 1

所以总称是n * ((2^n)-1)/(2^n)

现在这个序列既不是算术也不是几何。所以n/2 * (a+l)的公式不能应用在它上面。我该如何进一步处理这个解决方案,或者如果它是错误的,那么正确的方法是什么。

注意:如果应用n/2*(a+l),则生成的复杂度为-n/(2^n) = O(2^n).

【问题讨论】:

标签: java algorithm complexity-theory


【解决方案1】:

首先计算

A := (n - n)  + (n - n/2) + (n - n/4)  + ... + (n - n / 2^logn) = 
     log n * (n) - n * (1 + 1/2 + 1/4 + 1/8 + .... 1 / 2 ^ logn)
A > log n * (n)  - n * (1 + 1/2 + 1/4 + 1/8 + .... + 1 / 2^infity) =
     logn * n - n = n(logn - 2)
A < log n * (n)

如您所见,我已将您要计算的表达式分配给A。根据最后两个不等式,您的算法的复杂性是thetha(n logn)

这里我使用了众所周知的几何级数(1 + 1/2 + 1/4 + .....) = 2

【讨论】:

  • 第一步你是怎么得到n - n/2^logn这个词的? :)
  • 知道了!外循环下的语句不会运行 n-1 次,因为比较 i>1 将是错误的!因此它将在该时间之前运行一次迭代,即 n-2^logn 次!
  • 第二步是怎么得到logn * n并从序列中减去的?
  • @user2223421 看第一步:你有多少个term? log n。它们中的每一个都带有n的值。
【解决方案2】:

你在正确的轨道上。正如您所提到的,内部循环将运行log n 次。所以,它运行的总次数是:

    (n - n/2) + (n - n/4) + ... (log n) times
  = n*(log n) - (n/2 + n/4 + n/8 + ... up to 1)
  = n*(log n) - n*(1/2 + 1/4 + ...)
 <= n*(log n) - n because (1/2 + 1/4 + ...) is 1 even if we take all terms till infinity (G.P)
  = n(log n - 1), which is O(n*log(n))

请记住,在计算复杂度时,您总是在寻找上限,而不是确切的数字。

【讨论】:

  • 第一步是如何获得登录时间的?
  • 由于外循环将运行log n 次...此外,(n + n/2 + n/4 + ... + up to 1) 必须记录 n 次,因为项数将等于 2 的幂数.明白了吗?
  • 是的 :) 最后一次内部循环将运行它的 i 将等于 logn!
  • @HariShankar 您是如何在第一步中得出(n-n/2), (n-n/4) 等条款的?
  • @user2223421 (n - a1) + (n - a2) + (n - a3)... 10 times = 10*n - (a1 + a2 + a3 + .. + a10),对吗?同理,这里的 10 替换为 log n
【解决方案3】:

语句运行的确切次数是 nlogn - 2n(1-1/2^logn)

【讨论】:

  • 你能解释一下你是怎么得出这个结论的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多