【问题标题】:Always O(1) is better than O(n) in algorithm time complexity?算法时间复杂度总是 O(1) 优于 O(n)?
【发布时间】:2020-02-24 17:54:22
【问题描述】:

我问的是,如果我有一个采用 O(100) ---->O(1) 时间复杂度的算法,并且我有一个用于相同问题的算法,它采用 O(n)解决,但如果我知道它的最大值是 50,那么我可以决定它最坏的情况是 O(50) 所以在这种情况下仍然是 O(1) 算法或第二个 O(n) 算法是最好的选择?所以如果是第二个,我们能不能总是说 O(1) 比 O(n) 好?

【问题讨论】:

标签: algorithm performance optimization time-complexity big-o


【解决方案1】:

当然,不是;不是总是Big O 只是一种渐近行为,这就是为什么

O(1) == O(0.001) == O(50) == O(100) == O(C) # where C is any positive constant

O(n) 也一样

O(n) == O(0.001n) == O(100n) == O(C * n)    # where C is any positive constant

用时序成像两种算法

t1 = 1e100 (seconds) = O(1)
t2 = n     (seconds) = O(n)

对于无限n(渐近行为),第一种算法优于第二种算法,但对于所有现实世界的情况(小nt2 更可取。即使缩放也不够:

t1 = 1000               (seconds)
t2 = 100 * n            (seconds)
t3 = n + 1e100 * log(n) (seconds)

算法 3 具有更好的扩展性(1 vs. 100 : n vs 100 * n)但 1e100 * log(n) 术语使其无法在现实世界中完成。

因此,一般情况下,您应该比较函数,而不是O

t1 = 100 (seconds)
t2 = n   (seconds)

如果n <= 50 那么t2 是更好的选择(而n > 1000 则完全相反)

【讨论】:

  • @Dimitry Bychenko 谢谢!
【解决方案2】:

两种算法:

100n -> O(n)

10n² -> O(n²)

如果 n 10 则线性时间算法更好。

还有一些实际用例。快速排序算法(avg:O(n log(n)))通常使用插入排序(avg:O(n²)),以防给定的数据集合足够小。

【讨论】:

  • 您能否进一步解释您的解决方案?因为在 n>100.Ex:100.000*200 = 20000.000 和 10*200*200=400000 但仍然是 400000 > 20000 的情况下,我看不出二次时间算法如何更好
  • 对不起,我搞错了。更正了值。 ;)
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 2019-12-13
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-03-04
  • 1970-01-01
相关资源
最近更新 更多