【问题标题】:What is the big-O of this program where nested loops depend on each other?这个程序中嵌套循环相互依赖的大 O 是什么?
【发布时间】:2019-01-24 14:44:04
【问题描述】:

无法弄清楚这段代码的大 O 是什么。外循环是log(n),那么依赖外循环的内循环呢?

for (int i = 1; i < A.length; i = i * 3) {
    for (int j = i; j < A.length; j++) {
        // Simple computation
    }
}

非常感谢任何帮助:)

【问题讨论】:

  • 应该是int i = 1 还是i = i + 3
  • 对不起,我是i = 1

标签: algorithm big-o


【解决方案1】:

如果是A.Length == n,则内循环每次都在n-i 中运行。因此,对于i = 1, 3, 9, ..., n = 3^log_3(n),程序的总复杂度为sum(n - i)。由于i的数量为log_3(n),复杂度为T(n) = n * log_3(n) - (3^(log_3(n)+1)-1) = n * log_3(n) - 3(n-1) = O(nlog(n))

【讨论】:

  • 现在说得通了。谢谢!
【解决方案2】:

因为i = i * 3 意味着i 将永远是0,所以您的代码不会完成。

根据您的评论,它应该是i = 1。因此,在外循环的每次迭代中,问题的大小都会减少 3 倍。这意味着外循环需要 O(log n) 步。

内部循环在最坏的情况下采用O(n) 并运行O(log n) 次。因此,整个运行时间为O(n log n)

请务必检查您的帖子是否有拼写错误,并在未来做一些研究:)。

【讨论】:

  • 完整分析请参见 OmG,但我们得出的结果相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多