首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算法复杂度的推导

算法复杂度的推导
EN

Stack Overflow用户
提问于 2013-10-15 20:15:07
回答 3查看 136关注 0票数 0

在更新算法复杂性时,我查看了下面的示例:

代码语言:javascript
复制
int x = 0;
     for ( int j = 1; j <= n; j++ )
        for ( int k = 1; k < 3*j; k++ )
             x = x + j;

我知道这个循环最后是O(n^2)。我相信内循环执行3*n次( 3(1+2+...n) ),外循环执行n次。因此,O(3n*n) = O(3n^2) = O(n^2)。

但是,我所看到的源将内部循环的执行扩展到:3(1+2+3+...+n) = 3n^2/2 + 3n/2。有人能解释一下3n^2/2 + 3n/2的执行时间吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-15 20:34:11

对于每个J必须执行内部循环的J*3迭代,所以命令x=x+j最终将执行n*3* (1 +2+3.+ n)次,算术级数之和为n*(n+1)/2,因此将执行命令:

3 * n * (n+1)/2 which is equals to (3*n^2)/2 + (3*n)/2

但是大O不是迭代的次数,而是渐近测度,所以在表达式3*n*(n+1)中,/2需要删除consts (将它们全部设置为0或1),因此我们有1*n*(n+0)/1 = n^2

本例中关于大O计算的小更新:要从3n(n+1)/2中生成大O,可以想象比N更大的O是无穷大的,因此:

代码语言:javascript
复制
infinity + 1 = infinity
3*infinity = infinity
infinity/2 = infinity
infinity*infinity = infinity^2

所以你在这之后,你有N^2

票数 1
EN

Stack Overflow用户

发布于 2013-10-15 20:40:55

从1到m的整数之和为m*(m+1)/2,在给定的问题中,j从1到n,k从1到3*j,因此k上的内环执行3*(1+2+3+4+5+...+n)次,该级数中的每个项都代表j的一个值,从而得到3n(n+1)/2。如果展开,则得到3n^2+3n/2,但整件事情仍然是O(n^2)。你不在乎你的执行时间是否呈二次和线性上升,因为线性被二次二次曲线淹没。

票数 1
EN

Stack Overflow用户

发布于 2014-07-01 05:00:16

使用这样的Sigma表示法可以找到算法的精确性:

这是经验之谈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19390210

复制
相关文章

相似问题

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