我一直在尝试计算以下算法的Big-O,结果对我来说是O(n^5(。我不知道正确的答案是什么,但我的大多数同事都得到了O(n^2(。
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(,因为它独立于i和j。就其本身而言,它具有O(n(的复杂性。
另外两个循环产生内部执行的平方序列之和(1+4+9+…(。
这个平方和对应于正方形金字塔数,并且具有O(n3(的阶数。
内环的阶数为O(n(,因此我们得到O(n4(。