ICode9

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

外部排序

2021-07-03 13:33:03  阅读:266  来源: 互联网

标签:归并 WA 外部 结点 败者 排序 初始


---

Conception

算法过程

image-20210702203224246

  • 首先将块读入内存
  • 接下来构造初始“归并段”,通过内部排序使两个(这取决于生成初始归并段的内存工作区大小)内关键字有序

image-20210702203414297

image-20210702203547797

  • 然后是不断的内部归并,直至排序完毕

    • 第一趟归并(8个初始归并段 → 4个归并段)

      image-20210702203851329

      image-20210702203944682

    • 第二趟归并(4段 → 2段)

      image-20210702204141433

    • 第三趟归并 (2段 → 1段,排序结束)

      image-20210702204331872

开销分析

image-20210702204545025

根据上式,不难想到从减少归并趟数入手来优化算法执行效率

例如,使用4路归并

image-20210702204848951

第一趟结束后就可以将整个序列分为两个大的归并段:

image-20210702204956159

这时只需在进行一次2路归并就完成了排序,归并趟数减到了两次

image-20210702205650706

从上面的逻辑树还可以看出,减少初始归并段个数r也能减少归并趟数:

image-20210702210047702

小结

image-20210702210346894

tips:关于多路归并与多路平衡归并的概念辨析

image-20210702210804857

败者树

”k路平衡归并的问题是随着k增加,每次归并时从k个元素中选取最小元素的比较次数(k-1)也会增加 “

image-20210702211123468

什么是败者树?

image-20210702211519850

败者树在多路平衡归并中的应用

image-20210702212009733

只不过这里的分支结点并不记录关键字的值,而是记录其所属归并段:

image-20210702212143618

当冠军产生后,其所属归并段的下一个元素(6)将加入进来,这时就可以利用之前生成的败者树信息减少比较次数

image-20210702212930400

实现思路

叶子结点实际上是虚拟的,k路归并的败者树可以用一个长k的数组表示

image-20210702213851546

小结

image-20210702214024235

image-20210702214055170

置换-选择排序

”增大初始归并段长度(减少初始归并段个数)“

在下面这个用例中,如果按照之前说的”老办法“操作,假设WA只能存放三个记录,那么每个初始归并段也只能有3个记录,对应会产生8个初始归并段

image-20210702214525948

使用置换-选择排序可以产生更少的初始归并段

  • 按顺序从FI中读元素放入WA至WA装满
  • 将WA中最小的元素输出到FO,同时用MINIMAX记录该值表示归并段1中此时的最大值
  • 如果WA中的最小值比归并段1中此刻的最大值MINIMAX大,显然不能将其输出到FO中(可以认为其被“锁定”),这时选择次小值,以此类推
  • 重复上述步骤直至WA中所有元素被“锁定”,这时便完成了一个归并段的划分,如下例归并段1长10
  • 将WA“解锁”,进行下一个归并段的划分

image-20210703122236937

置换-选择排序的结果如下,显然归并段的个数r得以减少

image-20210703123349390

小结

image-20210703123804276

最佳归并树

image-20210703124217389

image-20210703124333989

因此,要使磁盘的I/O次数减少 → 使归并树的WPL最小哈夫曼树

以初始归并段作为叶子节点,按照构造哈夫曼树的方法(每次取权值最小的两个结点)可以得到如下结果:

image-20210703124603680

k路归并的思路也类似,每次选取k个最小的结点“连接”:

image-20210703124928431

如果初始归并段的个数不足以构造严格的k叉哈夫曼树,则需要增设权值为0的“虚结点”

image-20210703125305805

得到结果如下:

image-20210703125443418

“如何知道需要添加几个虚段?”

image-20210703130221746

小结

image-20210703130307449

image-20210703130322155

2021/7/3

标签:归并,WA,外部,结点,败者,排序,初始
来源: https://www.cnblogs.com/potofsalt/p/14966136.html

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

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

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

ICode9版权所有