【问题标题】:Why is this code considered O(N^6) in Big Oh notation?为什么这段代码在 Big Oh 表示法中被认为是 O(N^6)?
【发布时间】:2011-10-09 22:10:52
【问题描述】:

我刚刚在阅读another question,这段代码让我很感兴趣:

for(i = 0; i < n; i++)
{
    for(j = 0; j < i*i; j++)
    {
        for(k = 0; k < i*j; k++)
        {
            pseudo_inner_count++;
            for(l = 0; l < 10; l++);
        }
    }
}

我不明白这怎么可能是 O(N^6)。谁能帮我分解一下?

【问题讨论】:

    标签: c for-loop big-o notation


    【解决方案1】:

    其实是:

    • i 循环迭代 O(N) 次,所以 i 的值是 O(N),所以我们可以说 O(I)=O(N)。
    • j 循环迭代 O(I^2) = O(N^2) 次(单独考虑时,没有外部循环)。
    • k 循环迭代 O(I*J) = O(N*N^2) = O(N^3) 次。
    • l 循环仅迭代 10 次,因此为 O(1)。

    循环是嵌套的,所以我们必须将它们相乘(你明白为什么吗?)。总计为 O(N)*O(N^2)*O(N^3) = O(N^6)。

    【讨论】:

    • 好的,所以最终结果是通过将每个循环的评估相乘而不是通过求和来实现的(正如@Pascal 建议的那样)。其他人可以确认吗?
    • 帕斯卡并没有真正做总和。他将 n * n^2 * n^2 * n 相乘,得到 n^6。它可能看起来像一个和,因为指数加在一起,但这正是指数在数学中的工作方式。
    • @karl:指数定律说我们将指数相加,因为我们相乘的项具有相同的基数。我不明白你是如何得出他在取某些东西的总和的结论。
    • @karlphillip:想想看,乘法才有意义。例如,如果一个内循环执行某个操作 5 次,然后一个外循环执行内循环 10 次,则该操作执行 5*10=50 次。大 O 表示法是相似的,除了你是乘法函数。 [注意:这是一种有用但不严谨的思考方式!]
    • 谢谢大家。这很有帮助。
    【解决方案2】:

    这是

    n 表示第一个循环 n² 用于第二个循环 第三个循环的 n³

    内循环是O(1)

    总数为 O(n⁶)。

    第三个循环是n³的原因是因为当你想到它时j到达n²并且i到达n,所以i*j到达n³。

    【讨论】:

      【解决方案3】:

      我会说:

      • n 代表第一个循环
      • n² 第二个循环 => 总共 n³
      • n² 第三个循环 => 总共 n⁵
      • 又一个 n 循环 => 总共 n⁶

      【讨论】:

      • 我没有投反对票,但我看不出最内层循环在恒定时间内执行时如何为 O(n),无论 n 的值如何。
      • 是的,对我来说这看起来像 O(N^5)
      • 我投了反对票。循环for(l = 0; l &lt; 10; l++); 是 O(1),而不是 O(N)。
      • @karlphillip、@antiome、@bdares,内循环是O(1)。整个事情仍然是O(n^6),因为第三个循环是n^3。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2014-09-12
      • 2013-12-06
      相关资源
      最近更新 更多