【发布时间】:2020-08-29 18:12:31
【问题描述】:
我一直在尝试计算以下算法的 Big-O,结果对我来说是 O(n^5)。我不知道正确答案是什么,但我的大多数同事都得到了 O(n^3)。
for(i=1;i<=n;i++)
{
for(j=1 ; j <= i*i ; j++)
{
for(k=1 ; k<= n/2 ; k++)
{
x = y + z;
}
}
}
我所做的是从最里面的循环开始。所以我计算出最里面的循环将运行n/2 次,然后我转到第二个嵌套for 循环,它将运行i^2 次,从最外面的循环将运行i 次,因为i 与1 不同到n。这意味着第二个嵌套 for 循环将总共运行 Sigma(i^2) from i=1 to i=n,因此总共运行 n*(n+1)*(2n+1)/6 次。所以代码运行的总量是n^5的顺序,所以我得出的结论是顺序必须是O(n^5)。这种方法和我计算的答案有问题吗?
我刚开始使用 DSA,这是我的第一个任务,因此对我可能犯的任何基本错误表示歉意。
【问题讨论】:
-
第三个(内部)循环运行
n/2次,每次运行第二个循环。第二个循环运行(2n^3 + 3n^2 + n)/6次。您如何从那里到达“n^5的顺序”? -
我乘以所有循环运行的时间。第一个循环运行
n次,第二个循环运行(2n^3 + 3n^2 + n)/6次,第三个循环运行n/2次。所以乘法时 n 的最大次数是 5。 -
这更适合cs.stackexchange.com。
-
不,第二个运行
i^2次,每次运行第一个运行,(2n^3 + 3n^2 + n)/6次; 不要再乘以n。 -
第二个循环的顺序是
n^3。第三个循环运行n/2次每次第二个循环运行,所以整个事情的顺序是n^4。至于说明何时乘法或加法的确切一般规则......我必须考虑那个。
标签: algorithm time-complexity big-o computer-science complexity-theory