ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

王道-外部排序小总结

2021-04-07 22:31:24  阅读:288  来源: 互联网

标签:归并 外部 败者 王道 次数 排序 初始 路数


@王道:外部排序

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;

标签:归并,外部,败者,王道,次数,排序,初始,路数
来源: https://blog.csdn.net/weixin_45648646/article/details/115497952

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有