算法(三)外部排序算法

当待排序序列比内存可使用容量还大时,文件无法一次性放到内存中进行排序,需要借助外部存储器(例如硬盘、u盘、光盘),这时就需要用到外部排序来解决。

外部排序算法由两个阶段构成

    1. 按照内存大小,拆分成若干大小的子文件。使用适当的内部排序算法进行排序,将排好序的归并段写入外存,为下一个子文件排序腾出内存空间。
    1. 对所有的归并段进行合并,直到得到整个有序的文件。

外部排序算法的最优方案:多路归并(败者树-归并时使用的比较算法)+ 置换选择(败者树(或最小堆)-生成初始文件)+ 最佳归并树(哈夫曼树-来决定初始文件的归并顺序)

下面我们解释这几种算法。

对于外部排序算法来说,影响整体排序效率的因素主要取决于读写外存的次数,即访问外存的次数越多,算法花费的时间就越多,效率就越低。

平衡归并的路数越多,需要归并的次数就越少。这样读取外存的次数就越少。
平衡归并的初始拆分的临时文件个数越少,需要归并的次数就越少。
一般情况下对于具有m个初始段,进行k路平衡归并时,归并的次数为 s=logkm

从公式可以判断出,想要达到减少归并次数从而提高算法效率的目的。可以从两个角度实现:

  • 增加k路平衡归并中k的值 (引申出:多路平衡归并算法)
  • 尽量减少初始归并段的数量m 即增加每个归并段的容量。(引申出:置换-选择排序算法)

多路平衡归并算法

五路平衡归并

提高k值,看似简单却暗藏杀机。我们都知道,归并排序的时候需要对每一路的当前值进行逐个比较,以得出最小值(最大值),也就是说如果一次归并有k路,正常来说就需要比较k-1次,这种顺序比较的成本太高了。那么有没有什么方法降低成本-败者树

具体败者树此处不描述。请自行查阅。

5路归并的比较算法如果采用顺序比较,需要4次比较才得到最小值;如果采用败者树算法,则最多需要3次。并且可以看出,k路归并对应的比较次数是大约是 log2⁡k 次。

所以多路平衡排序算法,在归并阶段使用败者树,来进行归并时的排序,效率较高。

置换选择算法

上面描述的多路平衡归并算法,我们都是在假设已经有了排好序的初始归并段(文件)的前提下进行讨论的。
为了得到初始归并段,我们把大文件拆分成内存所能承受的若干个文件,然后把文件逐个从外存读进内存,进行某种内部排序算法,再输出为单个文件,由于内存的限制,大文件要拆分成许多个小文件。但是因为m值越大归并次数越多,排序所需时间就越长。置换选择算法就很好地解决这一问题。
置换选择算法仍然使用败者树
使用败者树分段后,各个文件中的记录已经有序,不需要再经过 外存读进内存内存中进行内部排序算法再输出单个文件的过程。

通过置换选择排序算法得到的归并段,通过证明,平均长度为内存工作区大小的两倍。


最佳归并树

置换选择算法分段后,由于各初始段长度不相等,那么归并段的归并顺序对排序的时间会不会有影响呢?
例如有3个初始归并段 a、b、c,段长分别为1、2、3。

  • 先归并b、c 得到归并段e 那么e 的长度为5 ,再归并a、e。 所需时间为 (2+3) 得到e (1+ 5) 得到最终归并段 整体为(2+3)+(1+5)=11
  • 先归并a、b 得到归并段e 在归并c、e 那么所需时间为 (1+2)+(3+3)=9

也就是说如果一开始就归并很长的段,由于该段还会在以后归并中出现,那么消耗时间就很长。所以我们应该先归并较短的段。

最终可以通过构造哈夫曼树的方法得到最佳归并顺序。

至此外部排序结束。


位图法和桶排序

位图法和桶排序也可以作为外部排序使用的算法。但是只特定于指定场景。
位图法 bitmap :使用hash映射,将对应的正整数映射到位图的集合中。每一个bit代表其映射的正整数是否存在。
比如{1,2,3,5,8,13}使用下列集合表示:

0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0

位图法是计数排序思想。
应用:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中。(布隆过滤器)

桶排序:将大文件按照指定范围分桶,例如位数,范围等等,分好桶后,分别排序。这样就不需要最后的归并。因为在分桶的时候已经确定了每个桶的先后顺序。初始需要遍历一次。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内部排序 内部排序:全部数据可同时放入内存进行的排序。 外部排序:文件中数据太多,无法全部调入内存进行的排序。 插...
    游戏原画设计阅读 1,046评论 0 0
  • 3、排序算法 1)内部排序: 归并排序、交换排序(冒泡排序、快排)、选择排序、插入排序 冒泡排序 (1)比较相邻的...
    脆皮鸡大虾阅读 368评论 0 0
  • 外部排序是指待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。 外部排...
    _Felix__阅读 4,057评论 0 0
  • 树(续) 二叉树 二叉排序树 二叉排序树,又叫二叉查找树,它或者是一棵空树;或者是具有以下性质的二叉树: 若它的左...
    liuzhangjie阅读 1,246评论 0 0
  • 经典的排序算法 冒泡排序(O(n2)):排序区间按N、N - 1、N - 2、……、2的规律变化,有序区间按1、2...
    雨住多一横阅读 733评论 0 0

友情链接更多精彩内容