问题
计算此算法的复杂性:
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).
答案 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)