【问题标题】:Sorting algorithms with "tight" upper bound by memory内存“严格”上限的排序算法
【发布时间】:2021-08-04 23:43:57
【问题描述】:

存在哪些排序算法(如果有)具有以下属性?

  • 给定一个包含 N 个元素的数组进行排序
  • 算法需要 M
  • 时间复杂度在最坏情况下为

【问题讨论】:

  • 一个常数空间 O(n log n) 的排序是堆排序。即使有更快的算法,你也会经常看到它在嵌入式应用程序中使用。如果正确实施,快速排序是 O(log n) 空间,但只有平均情况 O(n log n) 时间(最坏情况 O(n ^ 2)),除非它是“内省的”。合并排序是 O(n log n) 但通常需要 O(n) 空间,尽管有复杂的常数空间版本使用聪明的数论技巧来合并没有缓冲区。我见过的基数和桶排序不起作用。它们都有与键大小加 n 相关的内存开销。
  • 还有一点是链表上的归并排序不需要额外的空间。注意:您的标题滥用了“严格上限”一词。我认为您的意思是“小上限”。紧意味着别的东西。

标签: algorithm sorting computer-science


【解决方案1】:

您在这里寻找的是外部排序算法。外部排序算法背后的基本模型如下:您有一组要排序的项目,这些项目太大而无法放入主内存,这些项目可以流入和流出内存。目标是对所有项目进行排序。有很多算法在这里运行良好:

  • Mergesort 可以适应外部排序算法。将数据流式传输到主内存,将其分解为已按排序顺序出现的值链。然后,将这些链成对地流式传输到内存中,将它们合并在一起并将合并的序列写入结果文件。重复这个过程,直到所有的链都统一起来,返回一个排序后的序列,并且总运行时间与 O(n log n) 的原始合并排序运行时间相匹配。

  • 快速排序也可以适应外部工作。将所有项目流式传输到主存储器并选择其中一个作为枢轴(可能是随机的,或者可能通过选择元素样本并使用其中值作为枢轴)。然后,第二次将对象流式传输到内存中,以将元素划分为较小的元素和较大的元素。重复这个过程最终会对项目进行排序,尽管(可能)不如合并排序快。

  • 计数和基数排序在这里也可以很好地工作。将您的项目流式传输到内存中,并根据它们的值(例如,第一位)将它们分配到存储桶中,然后对这些存储桶进行进一步的递归排序。

这不是一个详尽的列表,可能还有更好的算法,但希望这是探索更多的良好第一步。

【讨论】:

  • 我不明白你的回答。 OP 要求使用少于线性空间要求的排序算法。这样的 orts 不需要是外部的。
  • @Gene 我将这个问题解释为“对最多 M 额外内存?
  • 感谢您的回答@templatetypedef! Mergesort 看起来很合理,但在您的流式传输示例中,它最终得到完全排序的输出的保证在哪里?
猜你喜欢
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2020-04-17
  • 2016-02-04
  • 2010-11-20
  • 1970-01-01
相关资源
最近更新 更多