我要问的是想一想如果我有一个算法耗费O(100)----> O(1)时间复杂度,而我有一个相同的算法耗费O(n)解决,但如果我知道n的最大值是50,那么我可以确定最坏的情况是O(50),那么在这种情况下,仍然是O(1)算法或第二个O(n)算法是最佳选择?因此,如果是第二个,我们是否总能说出O(1)比O(n)好?
答案 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具有更好的缩放比例(1
与100
:n
与100 * 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²)),以防给定的数据收集足够小。