【问题标题】:Big O Notation for two non-nested loops两个非嵌套循环的大 O 表示法
【发布时间】:2025-12-11 11:35:03
【问题描述】:

两个未嵌套的 for 循环的大 O 表示法是什么?

例子:

for(int i=0; i<n; i++){
   System.out.println(i);
}

for(int j=0; j<n; j++){
   System.out.println(j);
}

【问题讨论】:

标签: algorithm loops big-o time-complexity


【解决方案1】:

这将是 O(2n),因为您运行 n+n = 2n 次迭代。

O(2n) 本质上等同于 O(n),因为 2 是一个常数。

【讨论】:

    【解决方案2】:

    线性

    O(n) + O(n) = 2*O(n) = O(n)
    

    不管你有多少非嵌套循环(如果这个数字是一个常数并且不依赖于n),复杂性将是线性的,并且等于循环中的最大迭代次数。

    【讨论】:

    • 那么这是否意味着当您有 2 个嵌套循环 O(n^2) 时,您应该将它们分成 2 个单循环以获取 O(n) 以牺牲一些内存为代价?
    • 如果两个循环的迭代次数不同会怎样?例如,第一个循环迭代m 次,第二个循环迭代nn&gt;&gt;m
    • @santobedi 如果m 不是n 的函数,那么没关系。
    • @SalvadorDali 我的时间复杂度是多少? O(n)O(m+n)O(m)*O(n)mn 是独立的。 m不是n的函数。
    • @santobedi O(max(m,n))
    【解决方案3】:

    从技术上讲,这个算法仍然在 O(n) 时间内运行。

    虽然n 每增加一次迭代次数就会增加 2,但所用时间仍以 线性 速率增加,因此在 O(n) 时间内。

    【讨论】:

      【解决方案4】:

      它将是O(n) + O(n) ==> 实际上是O(n),因为我们不保持恒定值。

      【讨论】:

        【解决方案5】:

        假设一个场景,每个循环最多运行 n

        所以我们可以说每个 for 循环的复杂度是O(n),因为每个循环都会运行 n 次。

        所以你指定这些循环没有嵌套在 第一个循环 O(n)+ 第二个循环 O(n)+ 第三个循环 O(n) 的线性场景中,这会给你3O(n) .

        现在,由于我们主要关注复杂性的可变部分,我们将排除常量部分,并在这种情况下说它是 O(n)

        但在实际情况下,我建议您记住,常数因素也将发挥至关重要的作用,因此永远不要排除它们。

        例如,考虑从整数数组中找到最小整数的时间复杂度,任何人都会说它是O(n),但要找到同一数组中的第二大或最小整数将是 O(2n)。

        但大多数答案会说它是O(n),实际上忽略了常数。 考虑一下如果数组的大小是 1000 万,那么这个常量就不能被忽略。

        【讨论】:

          最近更新 更多