我在这里有类似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步。我只需要一些关于如何简化求和以达到时间复杂度函数的指针。
谢谢!
答案 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)
。由于i
从0
运行到(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处的“嵌套循环”。