两个依赖for循环的复杂性,具有log n复杂性的外循环

时间:2013-09-21 12:06:45

标签: java algorithm complexity-theory

问题

计算此算法的复杂性:

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

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

第一个循环运行登录时间。 第二个循环运行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).

3 个答案:

答案 0 :(得分:7)

你走在正确的轨道上。正如您所提到的,内部循环将运行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))

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

答案 1 :(得分:5)

首先进行计算

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

的几何级数

答案 2 :(得分:1)

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