【问题标题】:Time Complexity on triple Nested For loops where indexes are dependent on each other索引相互依赖的三重嵌套 For 循环的时间复杂度
【发布时间】:2014-09-04 04:51:32
【问题描述】:

我这里有类似 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),因为它是三重嵌套的 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 步.我只需要一些关于如何简化求和以得出时间复杂度函数的指示。

谢谢!

【问题讨论】:

  • C(n,3),因为它列举了从 [1,n] 范围内选择三个不同数字的方法。

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


【解决方案1】:

如果感兴趣,循环遍历 n 个事物的每个组合,一次取 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)。

【讨论】:

  • 非常感谢。这正是我一直在寻找的。我以错误的方式解决了这个问题。
【解决方案2】:

不要将循环从 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 上的“嵌套循环”。

【讨论】:

  • 感谢您的文章。它为我清除了很多东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多