外排算法

问题描述:

给定一个文件,假设文件记录数很多,多到记录数无法一次全部load到内存中,这时候就需要外排算法来快速解决这一问题

 

算法思想:

根据有限的内存资源将大文件分为L个段,然后依次将这L个段读入内存并利用高效的内部排序算法(比如快排)对每个段进行排序,排序后的结果即为初始有序归并段直接写入外存文件。

下面主要研究一下使用败者树来进行归并排序。

首先介绍下什么是败者树:一下内容介绍来自http://blog.163.com/yangjun1988422@126/blog/static/474129172011711103313483/,感谢博主分享

    败者树是胜者树的一种变体。在败者树中,用父结点记录其左右子结点进行比赛的败者,而让胜者参加下一轮的比赛。败者树的根结点记录的是败者,需要加一个结点来记录整个比赛的胜利者。采用败者树可以简化重构的过程。
 
胜者树与败者树 - 紫龍劍 - 倚天万里
Fig. 0
Fig. 0是一棵败者树。规定数大者败。
  1. b3 PK b4,b3胜b4负,内部结点ls[4]的值为4;
  2. b3 PK b0,b3胜b0负,内部结点ls[2]的值为0;
  3. b1 PK b2,b1胜b2负,内部结点ls[3]的值为2;
  4. b3 PK b1,b3胜b1负,内部结点ls[1]的值为1;
  5. 在根结点ls[1]上又加了一个结点ls[0]=3,记录的最后的胜者。
败者树重构过程如下:
  • 将新进入选择树的结点与其父结点进行比赛:将败者存放在父结点中;而胜者再与上一级的父结点比较。
  • 比赛沿着到根结点的路径不断进行,直到ls[1]处。把败者存放在结点ls[1]中,胜者存放在ls[0]中。
Fig. 1
       Fig. 1是当b3变为13时,败者树的重构图。
 
       注意,败者树的重构跟胜者树是不一样的,败者树的重构只需要与其父结点比较。对照Fig. 3来看,b3与结点ls[4]的原值比较,ls[4]中存放的原值是结点4,即b3与b4比较,b3负b4胜,则修改ls[4]的值为结点3。同理,以此类推,沿着根结点不断比赛,直至结束。
 
        由上可知,败者树简化了重构。败者树的重构只是与该结点的父结点的记录有关,而胜者树的重构还与该结点的兄弟结点有关。
 
应用到外排的归并排序,可以用下图来清晰说明:

Fig. 3

 

posted on 2012-04-20 16:38  aho  阅读(1475)  评论(0编辑  收藏  举报

导航