嵌套for循环的时间复杂度通过两个循环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) 或如何进一步简化上述求和。