【问题标题】:Memory speed tradeoff of sorting algorithm排序算法的内存速度权衡
【发布时间】:2013-03-11 17:45:30
【问题描述】:

只考虑冒泡排序和归并排序。对于冒泡排序,时间复杂度为 O(n),最坏情况为 O(n^2),空间复杂度为 O(1)。对于归并排序,时间复杂度为 O(nlogn),空间复杂度为 O(n)。如果输入的大小小于 1000,您会选择哪种类型,为什么? 1000多呢?

这是我的一个面试问题。只是想知道你们会怎么回答。

【问题讨论】:

  • 您选择什么取决于您用来评估的标准。对于一小部分,我会选择“最快速的代码干净”,而不要介意任何性能考虑。这听起来非常像家庭作业......
  • 取决于很多事情。例如,你有多少内存?你是在内存还是文件中排序?数据是否可能接近排序?并行是一种选择吗?
  • input is less than 1000 - 只需使用冒泡排序或任何 O(n^2) 排序算法,如果它对您来说更简单编码。 What about more than 1000 Mergesort/Quicksort 甚至是 Quick Sort + Insertion Sort 的混合体。
  • 冒泡排序也有线性内存复杂度。您必须在某个时候将数组放入内存中。
  • @double_squeeze 但它可以与输入重叠。再说一次,还有归并排序的就地变体,但这不再是 O(n log n)。

标签: performance algorithm sorting memory complexity-theory


【解决方案1】:

只考虑冒泡排序和归并排序。

小于 1000,这可能意味着 RAM 足以满足任何排序算法的需要,无需外部存储。这也意味着在这种情况下,时间复杂度的理论界限并不重要。您可以选择任何您喜欢的排序算法,而不会产生任何时间损失。例如,您可以进行冒泡排序,因为它可能易于实现且直观。合并排序同样好。

当输入大小大于 1000 时,可能假设时间复杂度很重要,甚至如果没有外部存储,RAM 可能不够大。在这种情况下,如果您必须在两者之间进行选择,归并排序是最安全的选择。这是因为合并排序比冒泡排序具有更好的最坏情况性能,并且合并排序是external sort(当输入大小大于 RAM)的良好候选者。

【讨论】:

  • 10000 甚至 10^7 通常对 PC 来说没有问题,但当我们处理非常有限的资源限制时就会成为问题。快速排序(与插入排序混合)是 PC 机箱的一个选项。
  • @nhahtdh 我同意。这通常是我们在实践中所做的。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2010-10-06
相关资源
最近更新 更多