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

Big O(n logn) is not preferable over the O(n^2)

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

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

"Preferred" 在这里是相对的顺便说一句。如果数据集足够大,您可以通过使用您自己的堆栈变量来模拟递归,您可以在迭代实现的 "recursive" 算法版本中操作该变量(我们必须在 Guy Steele 的 Comparative Programming class 过去在 CMU。

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

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

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

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

例如,GNU MP Bignum library has a very highly optimized multiplication implementation. But for numbers made up of a couple dozen words it just uses schoolbook multiplication (the best threshold depends heavily on the machine). In fact GMP transitions through a whole sequence of fastest-around-size-X algorithms.