【算法概论】分治算法:k路归并

本文介绍了胜者树和败者树的概念,它们是二叉排序树的变形,常用于k路归并排序中。胜者树记录每个节点的胜者,败者树记录败者。通过举例说明了胜者树和败者树的构建及重构过程,并详细阐述了如何使用败者树解决k路归并问题,以减少外排序中访问磁盘的次数。

 

首先了解两个概念,胜者树败者树

胜者树和败者树都是二叉排序树,是树形选择排序的一种变形。每个叶子节点相当于一位选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。胜者树的中间结点记录的是胜者的标号,败者树的中间结点记录败者的标号。因此,胜者树和败者树的根节点,就是最终的胜者或败者 —— 反映到一组数据中,可以是最大值或最小值。

胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值。在k路归并排序中经常用到。


胜者树

规定数小者胜。

b3 PK b4,b3胜b4负,内部结点ls[4]的值为3;

b3 PK b0,b3胜b0负,内部结点ls[2]的值为3;

b1 PK b2,b1胜b2负,内部结点ls[3]的值为1;

b3 PK b1,b3胜b1负,内部结点ls[1]的值为3。

如果我们将b3的值改为11,就需要对该胜者树进行重构,重构后的胜者树如下所示:

b3 PK b4,b3胜b4负,内部结点ls[4]的值为3;

b3 PK b0,b0胜b3负,内部结点ls[2]的值为0;

b1 PK b2,b1胜b2负,内部结点ls[3]的值为1;

b0 PK b1,b1胜b0负,内部结点ls[1]的值为1。

由上面的例子,可以很容易的理解:

胜者树的一个优点是,如果一个选手的值改变了,只需要沿着从该结点到根结点的路径修改这棵二叉树,而不必改变其他比赛的结果。

 

败者树:

败者树是胜者树的一种变体。在败者树中,用父结点记录其左右子结点进行比赛的败者,而让胜者参加下一轮的比赛。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值