败者树
外部排序时间开销 = 读写外存的时间 + 内部排序所需时间 + 内部归并所需时间
归并趟数S = [logkr]向上取整,归并路数k增加,归并趟数S减少,读写磁盘总次数减少
使用k路
平衡归并策略,选出一个最小元素需要对比关键字(k-1)次,导致内部归并所需时间增加
eg:8路平衡归并,从八个归并段中选出一个最小元素需要对比关键字7次
可用“败者树”进行优化!
什么是败者树?
一、败者树的构造
失败者留在这一回合,胜利者进入下一回合比拼
最后只有一个冠军在所有比拼中获胜
若有8位参赛者,则构造败者树需要7次比拼
假如冠军弃赛,基于已经构建好的败者树,选出新的胜者只需进行3场比赛
败者树 – 可视为一棵完全二叉树
(多了一个头头)。k个叶子结点分别是当前参加比较的元素,非叶子结点用来记忆左右子树的“失败者”,而让胜者往上继续进行比较,一直到根结点。
每个叶子结点对应一个归并段
分支结点记录失败者来自哪个归并段
根节点记录冠军来自哪个归并段
对于k路归并,第一次构造败者树需要对比关键字k-1次
有了败者树,选出最小元素,只需对比关键字[log2k]向上取整次
二、败者树的实现思路
k路归并的败者树只需要定义一个长度位k的数组即可
叶子结点是“虚拟的”
三、败者树解决的问题
使用多路平衡归并可减少归并趟数,但是用老土方法从k个归并段选出一个最小/最大元素需要对比关键字k-1次构造败者树可以使关键字对比次数减少到[log2k]向上取整。