按内存 "tight" 上限排序算法
Sorting algorithms with "tight" upper bound by memory
存在哪些具有以下属性的排序算法(如果有)?
- 给定一个包含 N 个要排序的元素的数组
- 算法需要 M < N 个元素的内存,其中 M 与 N 相比相对较小
- 在最坏的情况下,时间复杂度 < O(n^2)。
您在这里寻找的是外部排序算法。外部排序算法背后的基本模型如下:要排序的项目集合太大而无法放入主内存,并且这些项目可以流入和流出内存。目标是对所有项目进行排序。这里有很多算法效果很好:
Mergesort 可以作为外部排序算法进行调整。将数据流式传输到主内存中,将其分解为已按排序顺序出现的值串。然后,将这些链成对地流式传输到内存中,将它们合并在一起并将合并后的序列写入结果文件。重复这个过程,直到所有的链都统一返回一个排序的序列,并且总运行时间与 O(n log n) 的原始合并排序运行时间相匹配。
Quicksort 也可以适应外部工作。将所有项目流式传输到主内存中并选择其中一个作为基准(可能是随机的,或者可能是通过选择元素样本并将其中值用作基准)。然后,第二次将对象流式传输到内存中,以将元素划分为更小的元素和更大的元素。重复此过程最终会对项目进行排序,但(可能)不如合并排序快。
计数和基数排序在这里也能很好地工作。将您的项目流式传输到内存中,并根据它们的值(例如第一个数字)将它们分配到桶中,然后进一步递归地对这些桶进行排序。
这不是一个详尽的列表,可能还有更好的算法,但希望这是探索更多算法的良好开端。
存在哪些具有以下属性的排序算法(如果有)?
- 给定一个包含 N 个要排序的元素的数组
- 算法需要 M < N 个元素的内存,其中 M 与 N 相比相对较小
- 在最坏的情况下,时间复杂度 < O(n^2)。
您在这里寻找的是外部排序算法。外部排序算法背后的基本模型如下:要排序的项目集合太大而无法放入主内存,并且这些项目可以流入和流出内存。目标是对所有项目进行排序。这里有很多算法效果很好:
Mergesort 可以作为外部排序算法进行调整。将数据流式传输到主内存中,将其分解为已按排序顺序出现的值串。然后,将这些链成对地流式传输到内存中,将它们合并在一起并将合并后的序列写入结果文件。重复这个过程,直到所有的链都统一返回一个排序的序列,并且总运行时间与 O(n log n) 的原始合并排序运行时间相匹配。
Quicksort 也可以适应外部工作。将所有项目流式传输到主内存中并选择其中一个作为基准(可能是随机的,或者可能是通过选择元素样本并将其中值用作基准)。然后,第二次将对象流式传输到内存中,以将元素划分为更小的元素和更大的元素。重复此过程最终会对项目进行排序,但(可能)不如合并排序快。
计数和基数排序在这里也能很好地工作。将您的项目流式传输到内存中,并根据它们的值(例如第一个数字)将它们分配到桶中,然后进一步递归地对这些桶进行排序。
这不是一个详尽的列表,可能还有更好的算法,但希望这是探索更多算法的良好开端。