索引相互依赖的三重嵌套For循环的时间复杂度 这里有这样的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”;

索引相互依赖的三重嵌套For循环的时间复杂度 这里有这样的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”;,c++,algorithm,loops,time,complexity-theory,C++,Algorithm,Loops,Time,Complexity Theory,我相当确定这个特殊代码块的时间复杂度是O(n^3),因为它是三重嵌套的for循环,它们都是最小的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个步骤。我只需要一些关于如何简化求和以得到时间复杂度函数的指针 谢谢大家! 不要从1

我相当确定这个特殊代码块的时间复杂度是O(n^3),因为它是三重嵌套的for循环,它们都是最小的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个步骤。我只需要一些关于如何简化求和以得到时间复杂度函数的指针


谢谢大家!

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

for ( i = 0; i < (n – 2); i++)
  for (j = i; j < (n – 1); j ++)
    for (k = j; k < n; k++)
      Print “Hello World”;
for(i=0;i<(n-2);i++)
对于(j=i;j<(n-1);j++)
对于(k=j;k
因此,内部循环运行
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)
的详细信息,请参见位于的“嵌套循环”。

如果感兴趣,循环将遍历每次执行3次的n个对象的每个组合,从(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)。

C(n,3),因为这列出了从[1,n]范围中选择三个不同数字的方法。非常感谢。这正是我想要的。我解决这个问题的方法不对。谢谢你的文章。它为我澄清了很多事情。