Time complexity of nested for-loop通过求解两个循环O(n2)复杂度进入数学推导。
我尝试了一个练习来推导我如何得到以下三个嵌套循环的例子的O(n3)。
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= n; k++)
print(i * k * j);
求和是 =(n + n + n + .... + n)+(n + n + n + ... + n)+ ... +(n + n + n + ... + n)
= n ^ 2 + n ^ 2 + .... + n ^ 2
n次n ^ 2 = O(n ^ 3)
for(int i = 1; i <= n; i++)
for(int j = i; j <= n; j++)
for(int k = j; k <= n; k++)
print(i *j * k)
以上是一种非常常见的嵌套循环形式,我相信总结如下
=(n +(n-1)+(n-2)+(n-3)+ ... + 1) +((n-1)+(n-2)+(n-3)+ ... + 1) +((n -2)+(n -3)+(n - 4)+ ... + 1) + ... +((n - (n -2))+ 1)
= n(n - 1)/ 2 +(n-1)(n-2)/ 2 +(n-2)(n-3)/ 2 + .... + 1
= 从这里开始,我有点不确定我的逻辑是否正确。我相信 上面的每一个都评估为最大值为n2的多项式,以及我们关注的时间复杂度,上面的等式可以分解为。
= n ^ 2 + n ^ 2 + n ^ 2 + ... + n ^ 2
= n倍n ^ 2 = O(n ^ 3)。
我的假设是否正确?
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
for(int k = 1; k <= j; k++)
print(i *j * k)
如果以上是两个嵌套循环,则求和将为1 + 2 + 3 + 4 + ... + n。但是,对于三个嵌套的出现,我推断它是
= 1 +(1 + 2)+(1 + 2 + 3)+(1 + 2 + 3)+(1 + 2 + 3 + .... + n)
从这里开始,我不知道如何推导O(n ^ 3)或如何进一步简化上述求和。
答案 0 :(得分:1)
使用以下事实:
1+2+3+...+i =i*(i+1)/2
,上述总结可写为:
1*(1+1)/2 + 2*(2+1)/2 + ... + n*(n+1)/2
。
显然i*(i+1) > i^2
因此:
1*(1+1)/2 + 2*(2+1)/2 + ... + n*(n+1)/2 > (1^2+...+ n^2)/2
,我们知道:
1^2+...+n^2 = n^3/3 + n^2/2 + n/6
(可以通过归纳证明这一点。)
因此,原始总和S
大于:
n^3/6 + n^2/4 + n/12
,即O(n^3)
。