外排序的改进

外排序--------数据结构  

2011-06-16 17:24:11|  分类: 数据结构|举报|字号 订阅

一.
外排序的基本方法是归并排序法。它分为以下两个步骤:
(1) 生成若干初始归并段(顺串),也称为文件预处理:
    ① 把含有n个记录的文件,按内存大小分成若干长度为L的子文件(段);
    ② 分别将各子文件(段)调入内存,采用有效的内排序方法排序后送回外存
(2) 多路归并:
    对这些初始归并段进行多遍归并,使得有序的归并段逐渐扩大,最后在外存上形成整个文件的单一归并段,也就完成了这个文件的外排序。
二.
排序的过程:
磁盘是直接存取设备,读/写一个数据块的时间与当前读/写头所处的位置关系不大。
我们通过一个例子来说明磁盘排序的过程。设有一个文件,内含4500个记录:A1,A2,…,A4500。要对该文件进行排序,但可占用的内存空间至多只能对750个记录进行排序。输入文件(被排序的文件)放在磁盘上,页块长为250个记录。排序过程可如下进行:
六个归并段的归并过程
外排序--------数据结构 - Maggie - FootPrint
三.
多路平衡归并
一般说来,如果初始归并段有m个,那么这样的二路归并树就有élog2mù+1,要对数据进行élog2mù遍扫描。采用k路平衡归并时,则相应的归并树有élogkmù+1,要对数据进行élogkmù遍扫描
  做内部归并时,在k个记录中选择最小者,需要顺序比较k-1次。每趟归并u个记录需要做(u-1)*(k-1)次比较,s趟归并总共需要的比较次数为:(其中U代表总的记录个数,k代表的是归并的路数 ,s= élog2mù 因为同层的归并是同时进行的 )
  s*(u-1)*(k-1)=élogkmù*(u-1)*(k-1)

  =élog2mù*(u-1)* (k-1)élog2kù

 其中,élog2mù*(u-1)在初始归并段个数m与记录个数u一定时是常量,而(k-1)élog2kùk增大时趋于无穷大。因此,增大归并路数k,会使内部归并的时间增大。若k增大到一定的程度,就会抵消掉由于减少读写磁盘次数而赢得的时间。  


为了改善上面的归并的效率,引入了败者树算法

败者树是一棵有k个叶结点的完全二叉树,叶子结点存储记录,非叶结点可由关键字和它对应的记录地址构成。为讨论方便起见,设非叶结点的结构为:关键字,   输入有序段的路号

 对k个输入有序段进行k路平衡归并的方法如下:

(1) 取每个输入有序段的第一个记录作为败者树的叶子结点,建立初始败者树:两两叶结点进行比较,在双亲结点中记录比赛的败者(关键字较大者),而让胜者去参加更高一层的比赛,如此在根结点之上胜出的“冠军”是关键字最小者。                          (2) 胜出的记录写至输出归并段,在对应的叶结点处,补充其输入有序段的下一个记录,若该有序段变空,则补充一个大关键字(比所有记录关键字都大,设为kmax)的虚记录。

(3) 调整败者树,选择新的关键字最小的记录:从补充记录的叶结点向上和双亲结点的关键字比较,败者留在该双亲结点,胜者继续向上,直至树根的双亲。
 (4) 若胜出的记录关键字等于kmax,则归并结束;否则转(2)继续。

败者树归并的举例:

例如,设有5个初始归并段,它们中各记录的关键字分别是:

        R1:{17,21,∞}  

        R2:{5,44,∞}  

        R3:{10,12,∞}  

        R4:{29,32,∞}  

        R5:{15,56,∞}

其中,∞是段结束标志。利用败者树进行5路平衡归并排序的过程如下图所示。 

外排序--------数据结构 - Maggie - FootPrint


 从上例看到 k 路平衡归并的败者树的深度为 é log 2 k ù 在每次调整找下一个具有最小关键字记录时, 最多做 é log 2 k ù   次关键字比较。 因此 , 利用败者树在 k 个记录中选择最小者, 只需要进行 O( é log 2 k ù ) 次关键字比较 ,这时归并总共需要的比较次数为

        s*(u-1)* élog2kù=élogkmù*(u-1)* élog2kù

        =élog2mù*(u-1)* élog2kùélog2kù

        =élog2mù*(u-1)

        这样,关键字比较次数与k无关,总的内部归并时间不会随k的增大而增大。因此,只要内存空间允许,增大归并路数k,将有效地减少归并树的深度,从而减少读写磁盘次数,提高外排序的速度。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值