8.【外部排序】基本概念和方法 + 优化:【败者树】{减少关键字对比次数}、【置换-选择 排序】{减少初始归并段数量}、【最佳归并树】{谁先合并更快}

外部排序的基本概念和方法

外部排序:对大文件进行排序时,因为文件中的记录很多、信息量庞大,无法将整个文件复制进内存中进行排序。
因此需要将待排序的记录存储在外存上,排序时再把数据一部分一部分地调入内存进行排序,在排序过程中需要多次进行内存和外存之间的交换。

1. 外部排序的步骤

① 根据内存缓冲区大小,将外存上的文件分成 r 个子文件,依次读入内存并利用内部排序方法对它们进行排序,并将排序后得到的有序子文件重新写回外存【目的:形成一个归并段,共r个归并段】。
在这里插入图片描述
 
② 对这r个有序归并段进行 S 趟 k 路归并,使归并段(有序子文件)逐渐由小到大,直至得到整个有序文件为止,其中S=⌈logk​r⌉。(需要在内存中分配k个输入缓冲区和1个输出缓冲区)

注:如何进行 k 路归并?
① 把【k个归并段的块】读入【k个输入缓冲区】。
② 用“归并排序”的方法,从k个归并段中,选出几个最小记录暂存到输出缓冲区中。
③ 当输出缓冲区满时,写出外存。

就是归并排序的过程,只不过有空间的限制



2. 外部排序时间开销 =读写外存的时间 + 内部排序所需时间+内部归并所需时间



3. 优化

①增加归并路数k【就是k合一】,但是需要增加相应的输入缓冲区,且每次从k个归并段中,选出一个最小元素需要对比 (k-1) 次。
②减少初始归并段数量r。


4. 纠正:什么是多路平衡归并?

在这里插入图片描述
例子:在这里插入图片描述



败者树【减少关键字对比次数】

败者树解决的问题:
从 k 个归并段选出一个最小元素需要对比关键字 (k-1) 次,而构造败者树可以使关键字对比次数减少到⌈ log2 k ⌉

过程:
初始8个有序归并段
在这里插入图片描述
找出第一个最小的:
在这里插入图片描述
在这里插入图片描述
故第一次找出最小的是段3,值为1
随后把值为1的结点去掉,用段3的下一个代替,更新败者树,等到下一个最小为段5,值为2【总共对比了3次——log2 8】
在这里插入图片描述
随后把值为2的结点去掉,用段5的下一个代替,以此重复进行

败者树的实现思路:

在这里插入图片描述
例子:
在这里插入图片描述



置换-选择 排序【减少初始归并段数量】

产生更长的初始归并段,从而减少初始归并段数量

初始
在这里插入图片描述
过程:
在这里插入图片描述
在这里插入图片描述

当集满3个红色,开始归并段2
在这里插入图片描述

如果是原始的话,需24/3=8个归并段



最佳归并树【解决:归并段谁和谁合并更快?】

在这里插入图片描述
在这里插入图片描述
构造2路归并的最佳归并树:
在这里插入图片描述

多路归并的最佳归并树:

在这里插入图片描述

如果减少⼀个归并段:

在这里插入图片描述
添加虚段的数量:
在这里插入图片描述


版权声明:本文为weixin_42214698原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。