【问题标题】:Find time complexity of a given nested loop查找给定嵌套循环的时间复杂度
【发布时间】:2020-12-25 22:36:48
【问题描述】:

下面这个循环的时间复杂度是多少?

int sum = 0;
for(int n = N; n > 0; n/=2)
    for(int i = 0; i < n; i++)
    sum++ 

我发现内部循环运行N + N/2 + N/4 + N/8 + ... + 1 次,但现在我不知道如何继续。如何从这个循环中获得波浪号或大 O?

提前致谢。

【问题讨论】:

  • 提示:N + N/2 + N/4 + ... + 1 = 2*N
  • 为什么等于2*N?
  • 如果答案是 2*N,那么波浪号是 2N,大 O 是 N,但我想知道你是如何得到 2*N 的
  • 我不会向你证明,但直觉很简单。您从 N 开始,与 2N 的差为 N。您添加 N/2,差异缩小到 N/2,添加 N/4,它缩小到 N/4,依此类推。随着您添加更多项,与 2N 的差异会相应缩小,越来越小,但从未完全达到 2N。
  • @belismau 是的,它是O(2N) = O(N) (在复杂性理论中省略了常数因素)

标签: algorithm time-complexity big-o tilde


【解决方案1】:

这个循环的 Big-O 是 O(N),例如迭代次数对 N 的依赖性是线性的。

大约 1/2 + 1/4 + 1/8 + ... https://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_%E2%8B%AF

关于大欧https://www.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/big-o-notation

【讨论】:

  • 那是无限GP系列的总和。
【解决方案2】:

N + N/2 + N/4 + N/8 + ... + 1 形成一个 GP(几何进度),总和为 2N。在用大 O 定义时间复杂度时,我们丢弃了这个常数。所以你的问题的时间复杂度是 O(N)。

【讨论】:

  • 如何将 N + N/2 + N/4 + N/8 + ... + 1 变为 2N?跨度>
  • 第一次外循环的'n'值为N,因此内循环将运行N次,下一次将其除以n/=2的一半bcoz,因此内循环将运行N/2次,下一次time 内循环将运行 N/4 次,依此类推...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2017-02-27
相关资源
最近更新 更多