问题描述
我一直在尝试计算以下算法的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
次,{{ 1}}从i
到1
不等。这意味着第二个嵌套的for循环将总共运行n
次,因此总共运行Sigma(i^2) from i=1 to i=n
次。因此,该代码将要运行的总数为n*(n+1)*(2n+1)/6
的顺序,因此我得出结论,该顺序必须为n^5
。这种方法和我计算出的答案有问题吗?
我刚开始使用DSA,这是我的第一个任务,对可能犯的任何基本错误表示歉意。
解决方法
内部循环始终具有相同的迭代次数( n / 2),因为它独立于 i 和 j 。它本身具有 O(n)的复杂度。
另外两个循环导致内部部分执行的平方和(1 + 4 + 9 + ...)。
此平方和对应于square pyramidal number,并具有 O(n 3 )的顺序。
内部循环的顺序为 O(n),因此我们得到 O(n 4 )。