在算法时间复杂度上,O(1)总是比O(n)好吗?

时间:2019-12-05 06:14:03

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

我要问的是想一想如果我有一个算法耗费O(100)----> O(1)时间复杂度,而我有一个相同的算法耗费O(n)解决,但如果我知道n的最大值是50,那么我可以确定最坏的情况是O(50),那么在这种情况下,仍然是O(1)算法或第二个O(n)算法是最佳选择?因此,如果是第二个,我们是否总能说出O(1)比O(n)好?

2 个答案:

答案 0 :(得分:5)

当然不是;不是总是大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(渐近行为),第一算法优于第二算法,但对于所有现实情况(小n),t2为更好。甚至缩放还不够:

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

算法3具有更好的缩放比例(1100n100 * n),但是1e100 * log(n)项使得在现实世界中无法完成案例。

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

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

在这里,如果n <= 50那么t2是一个更好的选择(对于n > 1000,我们则相反)

答案 1 :(得分:0)

两种算法:

1.000n -> O(n)

10n² -> O(n²)

如果n <100,则线性时间算法更好。如果n> 100,则二次时间算法更好。

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