首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环分析-算法分析

循环分析-算法分析
EN

Stack Overflow用户
提问于 2015-06-24 07:04:32
回答 2查看 165关注 0票数 1

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

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

从链接中:

代码语言:javascript
复制
int sum = 0;
for (int n = N; n > 0; n /= 2)
   for (int i = 0; i < n; i++) 
      sum++;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-24 07:09:23

这是一个几何级数。内部循环每迭代一次运行i迭代,而外部循环每次减少一半。

所以,总结一下,你会发现:

代码语言:javascript
复制
n + n/2 + n/4 + ... + 1

这是几何级数,有r=1/2a=n,它可以收敛到a/(1-r)=n/(1/2)=2n,所以:

代码语言:javascript
复制
T(n) <= 2n

由于2nO(n)中,所以该算法在线性时间内运行。

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

票数 3
EN

Stack Overflow用户

发布于 2015-06-24 07:12:10

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

因此,我第一次从1到n,下一次,从0到n/2,因此,在kth项上,从0到n/k。

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

所以这是一个GP,我运行的次数。有条件

代码语言:javascript
复制
n,n/2,n/4,n/8....0

所以我们可以找到GP的和

代码语言:javascript
复制
2^(long(n) +1)-1  / (2-1)

2^(long(n)+1) = n
hence n-1/(1) = >O(n)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31019864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档