第12章外部排序.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 12 章 外 部 排 序 第 12 章 外 部 排 序 12.1 外部排序概述 12.2 多路归并排序 12.3 置换选择排序 12.1 外部排序概述 外部排序是指对大型文件的排序,其基本处理过程是:首先,按照内存可以使用的存储空间的大小,将外存上含有n个记录的文件分成若干个内存可以容纳的子文件,依次读入内存,利用有效的内部排序的方法对它们进行排序,并将排序后得到的有序子文件重新写入外存,通常称这些有序子文件为初始归并段。 然后, 对这些初始归并段进行逐趟归并,每一趟归并又会形成一些新的归并段,从而使归并段的个数逐趟减少,而每一个归并段中的记录数逐趟增加,直至最后得到一个整个的有序文件。从上述处理过程可见,外部排序的过程可分为两个相对独立的阶段。第一个阶段是分段进行内部排序生成初始归并段的过程,第二个阶段是对初始归并段进行归并的过程。 假设有一个含有10 000个记录的文件,首先通过10次内部排序得到10个初始归并段F1~F10,其中每个归并段都有1000个记录。 然后对它们作如图12.1所示的两两归并过程,直至得到一个有序文件为止。 由图12.1可见, 由10个初始归并段进行 2 路归并, 直至最后得到一个有序文件共进行了四趟归并,也就是说要启动外存进行八次读写,而访问外存所需的时间比访问内存所需的时间要多得多。由此可见,提高外部排序时间执行效率的有效的措施是减少归并的趟数,而要减少归并的趟数就要增加归并的路数,因此, 采用多路平衡归并可大大提高外部排序的执行效率。例如, 对上例进行 5 路归并,其过程如图12.2所示。 图 12.1 2 路归并过程示例 图 12.2 5 路归并过程示例 一般,在各趟归并中都将k个归并段归并成一个大的归并段(零头除外),称为k路平衡归并,而对m个初始归并段进行k路平衡归并时所需的处理次数称为归并趟数,由s表示。s与m、k之间的关系如下:  s=[logkm]  可以通过增加归并的路数k,来减少归并的趟数s,从而减少访问外存的次数,提高外部排序的执行效率。 12.2 多路归并排序 12.2.1 多路归并与败者树 由上面讨论的实例可知,增加归并路数可以减少访问外存的次数。但是在进行k路归并时,每得到一个归并后的记录, 即从k路中得到一个关键字最小的记录需进行k-1次关键字的比较,也就是说随着归并路数的增加,每得到一个归并后的一个记录所需的时间将随之增加,这将抵消由于增加k而减少外存信息读写时间所得的效益, 这是我们所不希望的。另一方面,在进行k路归并时利用树形选择排序可以使得到一个归并记录所需的时间由k-1缩减为log2k,而且可以推导得到进行k路归并所需的时间与k无关。这就是我们要介绍的利用败者树进行k路归并的方法。 败者树是一棵完全的二叉树,它是树形选择排序的一种变形。在树形选择排序中所介绍的利用锦标赛思想建立的树称为胜者树。在胜者树中,每个非终端结点均表示其左右孩子结点中的优胜者。然而利用败者树更容易实现树形选择排序。在败者树中,每个非终端结点中所记录的是其左右孩子结点中的败者。为什么要记录败者, 因为胜者已经出线,可去参加上一层的比赛,而只有败者才仍需留在原来的层次上。另外,在败者树的根结点之上要附加一个结点存放全局的优胜者。这与锦标赛中的情形也非常类似,在锦标赛中的败者也有强弱之分,例如在最后一轮比赛中被淘汰的败者是最强的败者, 败者树中结点中的层次也可表示出败者的这种层次关系。  例如,图12.3(a)表示一棵实现 5 路归并的败者树los[0..4]。  图中,方形结点表示叶结点(也可看成是外结点),依次存放五个归并段中的当前关键字;圆形结点表示非终端结点,存放左右孩子结点比较后败者的序号(路数号);los[0]表示附加结点, 存放最终胜者的路数号。  图中所示的是 5 路归并,因此有 5 个叶结点。根据二叉树的性质可知,这棵败者树必有四个非终端结点。无论是叶结点还是非终端结点,都是按完全二叉树的编号规则依次排列,这样容易由结点号找到双亲结点的序号。例如,对于叶结点s,其双亲结点的序号为(s+k)/2; 对于非终端结点t,其双亲结点的序号为t/2。 图 12.3 实现 5 路归并的败者树示例 败者树的生成过程为:先将各归并段中的当前关键字依次存放到对应的叶结点中,然后从最后一个非终端结点开始,通过左右孩子结点所对应的关键字的比较,逐个记入败者的路数号, 直至在los[0]中最终记入胜者的路数号。例如, 在图12.3(a

文档评论(0)

xiaohuer + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档