大O(n logn)不优于O(n ^ 2)

时间:2016-02-05 15:44:31

标签: algorithm time-complexity asymptotic-complexity space-complexity code-complexity

任何算法示例我们何时比O(n logn)更喜欢Big O(n ^ 2)时间复杂度? 我在某处看到过这个问题,但没有找到答案。

4 个答案:

答案 0 :(得分:7)

对于一个大问题,O(n log n)总是会超过O(n ^ 2)。对于一个小问题,big-O表示法隐藏的常数因子可能会使您更喜欢O(n ^ 2)算法。例如,O(n log n)快速排序比O(n ^ 2)插入排序更快,但是当分区变小(少于十个元素)时,一些快速排序实现切换到插入排序。

答案 1 :(得分:6)

选择具有更高时间复杂度的算法有几个原因:

  • 速度:渐近复杂度仅适用于大于某些n_0的n值。此外,它假设某个机器下面只部分匹配具有多级缓存和受限内存的真实机器。
  • 空间:某些算法比其他算法需要更多空间,因此无法实现。而且,这可能只会影响真机的速度。例如,引用的位置对缓存命中或未命中有影响,这就是Quicksort比Mergesort表现更好的原因。
  • 实施复杂性:在某些情况下,性能损失可以忽略不计,但开发时间不是。

答案 2 :(得分:1)

许多天真的O(n ^ 2)算法在小输入上比其更复杂的O(n log(n))兄弟更快

例如,GNU MP Bignum library具有非常高度优化的乘法实现。但对于由几十个单词组成的数字,它只使用了教科书乘法(最佳阈值depends heavily on the machine)。实际上是GMP transitions through a whole sequence of fastest-around-size-X algorithms

答案 3 :(得分:-1)

一种可能性 - O(n logn)算法是递归的,但您可以迭代编程O(n ^ 2),并且您必须使用的编程语言不支持递归。

"优选"这是相对的BTW。如果数据集足够大,你可以使用自己的堆栈变量来模拟递归,你可以在"递归"的版本中操作它。迭代实现的算法(我们必须在今天在CMU的Guy Steele的比较编程课上做这个练习。)