【问题标题】:Running time complexity of double for-loops双for循环的运行时间复杂度
【发布时间】:2014-02-04 17:36:40
【问题描述】:

我对以下算法有些困惑。特别是,我不明白为什么第一个是O(n),第二个是O(n ^ 2)。我唯一的直觉可能是第一个算法的内部和外部循环没有“链接”。其次,我可以直观地看到第二种算法是 O(n^2),但是我们如何找到一些常数 c1,c2 来证明 f(n) 是 n^2 的 big-0 和 little-0?

sum = 0;
for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
    sum++;

sum = 0;
for (int i = 0; i < n; i++)
    for (int j = 0; j < i; j++)
        sum++;

【问题讨论】:

  • 如果在第一个算法中嵌套了for循环,那不是O(n)而是O(n^2)
  • 好吧,很有趣 - 也许我的教授在他的答案中犯了一个错误
  • 第一个看起来是O(n^2),第二个看起来是O(n*m)
  • @user2485710 好吧,对于 m = n。
  • @delnan 是的,但这是一个非常奇怪的循环,也许这是老师真正想为学生提供的陷阱/陷阱之一。

标签: algorithm big-o time-complexity


【解决方案1】:

要正式推导出增长顺序,您可以按以下方式进行:

对于 c' 的情况,当i = 0 时,内循环不会执行,因此,解决方案是将不会影响内循环的外循环“迭代”外部化。

【讨论】:

    【解决方案2】:

    这两个都是 O(n2)

    您的代码有一个方便的机制来测量时间复杂度,那就是sum 变量

    使用 n 的不同值来实现它。如果你的sums 画了一条线,那就是线性的。如果他们不这样做,它就不是线性的。我想你会发现在你的第一个算法中,sum 将永远是 n^2

    【讨论】:

      【解决方案3】:

      两个代码块都代表O(n^2)

      第一个块应该是 n^2 复杂度的典型示例。内循环和外循环遍历N次。

      第二个块也是 n^2,即使内部循环比第一个块早于小 i 中断。如果你打印出 i 和 j 你会看到这个循环代表 i 和 j 的组合对......即 (1,0),(2,0),(2,1),(3,0) ,(3,1),(3,2) 等

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多