学习目标:
了解外部排序
- 外部排序概念
- 外部排序方法
- 败者树
- 多路平衡归并
学习内容:
外部排序概念
在进行大文件排序时候,文件中记录很多,无法将整个文件复制到内存中进行排序,需要将待排序记录存在外存上,再把数据一部分一部分调入内容中进行排序,在此期间,需要进行多次内外存数据交换。
外部排序方法
1.采用归并排序算法思路
2.包括两个阶段:
一,根据内存缓冲区大小,将外存文件内容划分成若干长度为相同的子文件
二,对这些文件进行逐趟归并排序,直到完全有序
外部排序的总时间= 内部排序所需的时间 + 外存信息读写的时间 + 内部归并所需的时间
r 个归并段经过k路可以归并成为⌈r/k⌉个归并段
树的高度h -1 = ⌈
log
k
r
\log_k^r
logkr⌉
可见,只要增大归并路数妇或减少初始归并段
个数r,都能减少归并趟数S,进而减少读写磁盘的次数,达到提高外部排序速度的目的。
败者树
S趟归并总共需要的比较次数为
S(n-1)(k-1) = ⌈
log
k
r
\log_k^r
logkr⌉ (n - 1 )(4 - 1)/⌈
log
2
k
\log_2^k
log2k ⌉
引入败者树是为了减少比较次数
因为k路归并的败者树深度为 ⌈
log
2
k
\log_2^k
log2k⌉ ,因此k个记录中选择最小关键字,最多需要⌈
log
2
k
\log_2^k
log2k⌉次
比较。所以总的比较次数为
s(n - 1)⌈
log
2
k
\log_2^k
log2k⌉ =⌈
log
k
r
\log_k^r
logkr⌉(n-1)⌈
log
2
k
\log_2^k
log2k⌉ = (n-1)⌈
log
2
r
\log_2^r
log2r⌉
1.可见,使用败者树后,内部归并的比较次数与k无关了
2.归并路数左并不是越大越好。归并路数左增大时,相应地需要增加输入缓 冲区的个数。
置换-选择排序
减少初始归并段个数r也可以减少归并趟数s。
最佳归并树
文件经过置换-选择排序后,得到的是长度不等的初始归并段。
当归并顺序与哈夫曼树结构一致时可以使得磁盘I/O次数最少。
例如:在初始化后的各个归并段的长度分别为[为9, 30, 12, 18,3, 17,2,6,24],归并路线为3路
1.使用随机归并顺序
树的带权路径长度WPL为归并过程中的总读记录数,故I/O次数=2xWPL = 484。
2.使用哈夫曼树思想
每次选取最小的3个段组成一个新段。按此树进行归并,故I/O次数=2xWPL = 4446次读/写,这棵归并树便称为最佳归并树。
当初始归并段的数量不满足可以构成严格的三叉树就要添加几个虚段
(权值为0)。
1.假设以k路归并,总归并段为n0
2.在树中只有度为0和度为k的节点
nk+n0=n //度为k的加度为0的个数为n
k*nk=n-1 //所有分支都连接一个节点,只有根节点没有
最后推出 nk=(n0-1)/(k-1)----->(n0-1)%(k-1)==0
需要补充(k-1)-[(n0-1)%(k-1)]个虚段
总结
·外部排序
·败者树
·最佳归并树