首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算法复杂度(渐近)

算法复杂度(渐近)
EN

Stack Overflow用户
提问于 2013-07-18 07:29:41
回答 3查看 116关注 0票数 1

有人能证实我这个算法的复杂度是O(n^2)吗?

代码语言:javascript
复制
a = 0
b = 0
c = n
while (b <= c)
{
    for (j = b; j<=c; j++)
    {
        a = j * j -2 * j + 3
    }
    b = b + 3
    c = c + 2
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-18 07:35:51

内部循环执行c - b + 1次。内部循环体a = j * j -2 * j + 3的每次执行都需要恒定(有界的)时间(假设我们处理的是固定宽度的整数类型,否则它将取决于使用的乘法算法和加法,但这很难以乘法更快的方式实现),因此外部循环体的执行是O(d) (Θ(d) a = j * j -2 * j + 3),其中d = c - b + 1

控制外环的变量的更新

代码语言:javascript
复制
b = b + 3
c = c + 2

在每次执行外部循环体时,将差值c - b减去1,因此外部循环被执行了n+1次,您总共得到了O(n²),因为

代码语言:javascript
复制
 n                   n+1
 ∑ (n+2k - (3k) +1) = ∑ j = (n+1)(n+2)/2
k=0                  j=1

它甚至是Θ(n²),除非编译器优化并直接将所有变量设置为它们的最终值。

原问题打字错误的答案:

内部循环

代码语言:javascript
复制
for (j = b; j==c; j++)

要么执行一次- when b == c,要么根本不执行,因此外部循环的主体是O(1)。外部循环中的更新

代码语言:javascript
复制
b = b + 3
c = c + 2

意味着每次执行循环体时,差值c-b都会减少1,因此

代码语言:javascript
复制
b = 0
c = n
while (b <= c)

将执行总次数- n+1O(n)

票数 4
EN

Stack Overflow用户

发布于 2013-07-18 07:59:45

代码语言:javascript
复制
b = b + 3
c = c + 2

使得b在外部循环的每次迭代中都能赶上c。这意味着外部循环运行n+1 = O(n)次,因为它们最初彼此相差n次。

内部循环执行(c -b+ 1)次。我们知道它们最初是n相隔的,并且每次外部循环的迭代都会变得更接近1。

查看内部循环运行的次数,它看起来像这样:(n,n-1,n-2,...,1),总共

代码语言:javascript
复制
1 + 2 + ... + n = (n)(n+1)/2  = O(n^2)
票数 2
EN

Stack Overflow用户

发布于 2013-07-18 08:13:45

每次你的外部循环

代码语言:javascript
复制
while(b <= c)

执行时,b和c变得比以前更接近1。但是,b和c从距离n开始,所以内部for循环从执行n+1开始,然后执行n次,然后执行n-1次,以此类推,直到它最后执行1次,然后程序结束。因此,您的运行时间与

(n+1) +n+ (n-1) + (n-2) + ... +1

你可以查一下递增整数的总和公式,看看这个总和等于

(n+2)(n+1)/2 = O(n^2)

所以你的运行时间是O(n^2)

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

https://stackoverflow.com/questions/17712021

复制
相关文章

相似问题

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