我正在为期末考试而学习,档案中有一个问题我无法找到答案:
一种算法的运行时间的增长顺序为O(N ^ 2);该 第二算法的运行时间的增长顺序是O(N ^ 3)。名单 程序员为什么会有三个令人信服的(合乎逻辑的,令人信服的)理由 更喜欢使用O(N ^ 3)算法而不是O(N ^ 2)算法。
答案 0 :(得分:32)
我可以想到以下三个原因:
答案 1 :(得分:22)
可能是#1的原因:因为O(N 2 )算法具有足够高的常数,对于预期的任务大小,O(N 3 )版本更快。
答案 2 :(得分:12)
以下示例说服O(N³)在某些情况下优于O(N²)。
O(N²)算法编码非常复杂,而如果输入大小为N≤100则实际使用时O(N³)可以足够快
O(N²)有一个大常数乘以它,例如c = 1000因此对于N = 100,c⋅N2=1000⋅100²=10⁷而如果c = 1则 O(N³)则c⋅N³=10⁶
- 醇>
与O(N³)相比,O(N²)算法具有非常高的空间复杂度
答案 3 :(得分:4)
O (N^2)
可能有一个很大的常数因素,使其无法使用(如果N
足够小,如Thorban所说)
答案 4 :(得分:2)
选择一种算法的唯一原因不是运行时间的增长顺序。你必须分析:
答案 5 :(得分:1)
添加到已发布的答案我想提到缓存行为。由于重复的缓存未命中,特定的内存访问模式可能会慢得多,理论上较慢的算法具有更高的缓存友好的内存访问模式执行得更好。
答案 6 :(得分:0)
Big-O是最坏情况的上限。 QuickSort是O(n ^ 2)时间,MergeSort是O(n lgn)时间。但是人们使用QuickSort是因为平均而言它是O(n lgn),其常数低于MergseSort。