循环分析 - 算法分析

时间:2015-06-24 07:04:32

标签: algorithm loops time-complexity

此问题基于此资源http://algs4.cs.princeton.edu/14analysis

有人可以分解为什么练习6字母b是线性的吗?外环似乎每次增加2倍,所以我认为它是对数...

从链接:

int sum = 0;
for (int n = N; n > 0; n /= 2)
   for (int i = 0; i < n; i++) 
      sum++;

2 个答案:

答案 0 :(得分:3)

这是一个几何系列。 内循环每次迭代外循环运行i次迭代,外循环每次减少一半。

所以,总结起来会给你:

n + n/2 + n/4 + ... + 1

这是geometric seriesr=1/2a=n - 收敛到a/(1-r)=n/(1/2)=2n,所以:

T(n) <= 2n

由于2n位于O(n) - 算法以线性时间运行。

这是一个完美的例子,可以看出复杂性不是通过乘以每个嵌套循环的复杂性(可能会得到O(nlogn)),而是通过实际分析需要多少次迭代来实现。

答案 1 :(得分:0)

是的,很简单 看到n的值每次减少一半,我运行n次。

所以我第一次从1变为n 下次0到n / 2 因此在第k个术语上为0到n / k。

现在内部循环的总时间将运行= Log(n)

所以我的GP是我运行的次数。 用条款

n,n/2,n/4,n/8....0

所以我们可以找到GP的总和

2^(long(n) +1)-1  / (2-1)

2^(long(n)+1) = n
hence n-1/(1) = >O(n)