王道-外部排序小总结

外部排序中,I/O次数是关键。通过增大归并路数和调整初始归并段长度,可以减少I/O。败者树用于在增大归并路数时保持内部比较效率,选择-置换排序生成不同长度的初始归并段,最佳归并树则优化归并段的合并顺序,减少读写次数。这些策略旨在平衡内部排序和外部排序的效率,提高整体排序速度。
摘要由CSDN通过智能技术生成

@王道:外部排序

1.影响内部排序时间效率的是移动和比较的次数,影响外部排序时间效率的是i/o次数。

2.归并的躺数越少,读写磁盘的次数就越少,归并的躺数=

第一:k为归并路数,增大k,可以降低躺数,减少io次数

第二:r为初始归并段的个数,减少r,可以降低躺数,减少io次数

归并路数尽可能地增大
可是归并路数一旦增大,内部比较的压力就会变大,内部比较效率降低。那么,增大归并路数而提高的时间效率就被内部排序给抵消了。那怎么办呢?有没有可能使得内部排序效率不受归并路数增加的影响呢?这个办法就是“败者树”,用败者树的方法挑选出最小值。
m路归并,不使用败者树,要比较m-1次,使用败者树,只需要比较log2m次,总比较次数为(n-1)log2r,与m无关,对于败者树,需要注意的是叶子结点只是逻辑上的处理,在代码实现中并未实现,并且分支节点记录的是失败归并片段,可以理解为多了一个头节点的完全二叉树。多出的这个头节点记录的是冠军-关键字.
所以,内部归并的比较次数与归并路数无关,只要内存空间允许,增大归并路数将有效提高排序速度,(单归并路数并不是越大越好)。
初始归并段长度增加,从而尽可能地减少初始归并段的数目
将内存缓冲区的个数增加,一次便可以排序更多的数据,使得初始归并段更长,从而初始规定段的个数更小
按照这个的思路,人们总是把归并段划分成长度相同的若干段。这样归并段的数目太多了,很影响效率,有没有可能让归并段的数目变小呢?这个方法就是“选择-置换排序”。

选择-置换是利用工作区间的长度,通过以此加入新的关键字并且判断是否在工作区间内还存在着比MINIMAX大的,若都不存在,则需要开辟一个新的归并段,依次进行此操作,一定要记住,选择-置换排序是用来生成初始归并段的,而且初始归并段的长度并不相同。使用选择-置换的方法又会带来另一个问题,分成了长度各不相同的归并段,那如何安排这些归并段归并的次序呢?这就引入了最佳归并树的概念,其实就是将哈夫曼树的思想推广到m叉树的情形,最佳归并树有最短的带权路径长度,代表着归并过程中读数的次数,那么总的i/o次数就是两倍wpl。

需要注意的是,在构造最佳归并树的时候,为了构成严格的m叉树,有的时候需要添加权值为0的虚结点,而对于如何确定加入权值为0的虚节点,利用的n=k*nk+1,n=n0+nk,而对于叶子节点n0对应的则是归并片段,nk=n0-1/k-1 ,若求余为0 的话,说明可以构造叉树,若取余后存在u,则应添加的0权值的虚拟树为(k-1-u),从而让取余再次回到0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值