一般三个嵌套循环的O(n ^ 3)复杂度的数学推导

时间:2016-07-29 02:07:42

标签: c++ algorithm time-complexity big-o code-complexity

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)

三个嵌套循环从开始

开始没有运行n次
 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)。

我的假设是否正确?

三个嵌套循环不从末尾运行n次

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)或如何进一步简化上述求和。

1 个答案:

答案 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)