【问题标题】:Why Are Time Complexities Like O(N + N) Equal To O(N)? [duplicate]为什么像 O(N + N) 这样的时间复杂度等于 O(N)? [复制]
【发布时间】:2020-06-25 17:52:36
【问题描述】:

我通常使用一个名为LeetCode 的网站来练习问题。在一个问题的讨论部分的很多答案中,我注意到像 O(N + N) 或 O(2N) 这样的运行时间变成了 O(N)。例如:

int[] nums = {1, 2, 3, 4, 5};

for(int i = 0; i < nums.length; i ++) {
    System.out.println(nums[i]);
}

for(int i = 0; i < nums.length; i ++) {
    System.out.println(nums[i]);
}

这变成了 O(N),即使它迭代了 nums 两次。为什么不是 O(2N) 或 O(N + N)?

【问题讨论】:

  • Big O 通常只指定那些对计算影响最大的参数。所以 N + N 仍然是线性关系。对于多项式,它通常是最大指数的阶。
  • Big O 是对算法的分析,而不是实现。并且通常实现差异可能是一个常数时间因素,比另一个更快或更慢,即使对于相同的算法也是如此。

标签: time-complexity big-o


【解决方案1】:

在时间复杂度中,常数系数不起作用。这是因为算法运行的实际时间还取决于机器的物理限制。这意味着,如果您在一台速度是另一台机器两倍的机器上运行您的代码,在所有其他条件相同的情况下,它会在相同输入的情况下运行大约一半的时间。

但是,当您比较具有不同时间复杂度的两种算法时,情况就不一样了。例如,当您将 O( N ^ 2 ) 算法的运行时间与 O(N) 算法的运行时间进行比较时,O( N ^ 2 ) 的运行时间随着输入大小的增长而增长得如此之快,以至于 O (N) 无论选择多大的常数系数,都追不上它。

假设您的常数系数是 1000,而不仅仅是 2,那么对于 (N > 1000) 的输入大小,O(N ^ 2) 算法的运行时间变为 (N * N) 的比例,而 N 将是与输入大小成正比增长,而 O(N) 算法的运行时间仅与 (1000 * N) 成正比。

【讨论】:

    【解决方案2】:

    O(n+n) 的时间复杂度降低到 O(2n)。现在 2 是一个常数。所以时间复杂度基本上取决于n
    因此O(2n) 的时间复杂度等于 O(n)。
    此外,如果有类似O(2n + 3) 的东西,它仍然是O(n),因为基本上时间将取决于n 的大小。
    现在假设有一个代码是O(n^2 + n),它将是O(n^2),因为当n 的值增加时,n 的效果将比n^2 的效果更不显着。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2013-10-20
    • 2015-05-25
    • 2019-12-09
    • 2011-07-09
    • 2022-10-24
    相关资源
    最近更新 更多