【问题标题】:How to determine computational complexity for algorithms with nested loops?如何确定具有嵌套循环的算法的计算复杂度?
【发布时间】:2016-01-30 01:19:06
【问题描述】:

在看了这个questionthis article 和其他几个问题之后,我仍然无法找到一种通用的方法来确定循环变量依赖于父循环变量的算法的计算复杂度。例如,

   for (int i = 0; i < n; i++) {
       for (int j = i; j < n; j++) {
           for (int k = i; k < j; k++) {
               //one statement
           }
       }
   }

我知道第一个循环的复杂度为n,但内部循环让我感到困惑。第二个循环似乎执行了n-i 次,第三个循环似乎执行了j-i 次。但是,我不确定如何将其变成常规的 Big-O 语句。我不认为我可以说O(n(n-i)(j-i)),那么我该如何摆脱这里的ij 变量呢?

我知道这是 n^3 数量级的东西,但我该如何显示呢?我需要使用系列吗?

感谢您的帮助!

(如果您想知道,这是来自最大和连续子序列问题的蛮力实现。)

【问题讨论】:

  • 您必须使用嵌套总和写入迭代总数,然后计算总和。请注意,虽然在许多情况下(如您的情况)评估总和只会导致每个循环的迭代总数相乘,但情况并非总是如此;如果内部循环中的迭代次数增加,您不能简单地将它们相乘。
  • for (int j = i; i &lt; n; j++) { 这不会停止
  • @amit 射击!谢谢,我更正了。

标签: algorithm big-o complexity-theory


【解决方案1】:
  • 第一个循环平均命中 N 个项目。
  • 第二个循环平均命中 N / 2 个项目
  • 第三个循环平均命中 N / 4 个项目

O(N * N / 2 * N / 4) 大约是 O((N^3)/8) 大约是 O(N^3)

【讨论】:

  • 感谢@EvilTeach 的回答。您介意更详细地说明如何确定内部循环的平均值吗?
  • 假设 N 是 5。第一行是 0,1,2,3,4 所以 O(N)。第二行是 {0, 1, 2, 3, 4}, {1, 2, 3, 4}, {2, 3, 4}, {3, 4}, {4} 所以 5 + 4 + 3 + 2 + 1 = 15 次迭代,用于第一个循环的 5 次迭代。 15/5 是 3。大约是 5 / 2。记住我们在这里谈论订单。 O(N/2) 与 O(N) 相同。使用它作为一般原则,第三个循环将平均覆盖循环 2 的一半元素,已知约为 O(N/2) 。这大约是 O(N/4)。将 3 个订单相乘产生大约 O(N^3)。这是我的想法。
  • 这有点像在无序的键数组中搜索每个键。有时你会在前几个元素中找到它。有时是最后一次。平均而言,您需要查看大约 1/2 的元素才能找到给定的键。
  • 另一种思考方式是每个循环都在处理大约 O(N) 个元素,因此三个循环产生 O(N^3)。
  • 第三个循环实际上平均命中 N/3 ± O(1) 个项目,但这对于 big-O 无关紧要,因为每个循环实例最多有 N 次迭代。
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 2021-12-24
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
相关资源
最近更新 更多