三重嵌套For循环中的时间复杂性,其中索引相互依赖

时间:2014-09-04 04:51:33

标签: c++ algorithm loops time complexity-theory

我在这里有类似c ++的伪代码:

 for ( i = 1; i ≤ (n – 2); i++)
     for (j = i + 1; j ≤ (n – 1); j ++)
         for (k = j + 1; k ≤ n; k++)
             Print “Hello World”;

我很确定这个特定代码块的时间复杂度是O(n ^ 3),因为它是循环的三重嵌套,它们都是最小的n - 2所以我推广了(n-2)* (n-1)* n

但我一直在努力解决实际的时间复杂度函数。这是我得到了多远,无法继续下去:

从i = 1到n-2的求和,从j =(i + 1)到n-1的求和,从k =(j + 1)到n的求和。

据我所知,最内循环执行n - (j + 1)步,中间循环执行(n-1) - (i + 1)步,外循环执行(n-2)-i步。我只需要一些关于如何简化求和以达到时间复杂度函数的指针。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果感兴趣的话,循环遍历每次3个事物的每个组合,从(1,2,3),(1,2,4),...开始,到(n-2)结束,n-1,n),这是n! /((3!)((n-3)!))=(n)(n-1)(n-2)/ 6 =(n ^ 3 - 3n ^ 2 + 2n)/ 6,这导致O (N ^ 3)。

答案 1 :(得分:1)

不要将循环从1运行到更小或等于某个值。您的代码等于:

for ( i = 0; i < (n – 2); i++)
  for (j = i; j < (n – 1); j ++)
    for (k = j; k < n; k++)
      Print “Hello World”;

所以你的内部循环运行n-j,中间的循环运行n-1-i,外部的循环与n-2相乘。所以你得到(n-j)*(n-1-i)*(n-2)n的复杂程度为O(n)。由于i0运行到(n-1),您可以将其替换为O(n)(因为sum(0,n)= 0 + 1 + .. + N = 0.5 * n ^ 2 = O(n ^ 2))。它与j相同。所以你得到(O(n)-O(n))*(O(n)-1-O(n))*(O(n)-2) = O(n)*(n)*O(n) = O(n^3)

有关您可以将i替换为O(n)的详细信息,请参阅this处的“嵌套循环”。