胜者树和败者树

今天头一回看到败者树和胜者树。看到了网上各路博客,文章,都在讲为什么用败者树而不是胜者树,看的云里雾里,根本不懂为什么。一般情况下,文章中是这么说的:


败者树简化了重构。败者树的重构只是与该结点的父结点的记录有关,而胜者树的重构还与该结点的兄弟结点有关。


但是,想了半天也没想通这句话。这些文章中单单只讲胜者树和败者树便得到了这一结论,自己想一下,把输入换一下,比如加个负号,败者树的重构不是也要和兄弟节点有关了么...


最后,我终于弄明白了。这些文章的描述是断章取义的。这里胜者树和败者树的讨论,实际上,是来自于多路归并排序。多路归并排序优化的方案需要用到树,树的每个叶子节点都是下一个要归并的数,需要选择k路中最小的那个(这里假设从小到大排序),再将其删除,选择该路下一个数,再从叶子到根进行比较,继续选择最小的。想想看,在删除了最小数之后(已归并输出),下一个数必然也要从这一路选出来拿到父亲那里比较一下,那么,如果采用胜者树,从叶子到根的节点中所记录的还是这一路的编号,岂不浪费空间(其实也浪费了时间)?所以改为败者树这一扭曲的结构(胜出的继续往上比较,但偏偏记录败者的位置)。这样,每次更新时,向上比较在每一层就可以直接根据存储的位置与另一个,也是唯一一个对手进行比较,从而立刻更新(如果采用胜者树,还要在另外一个分支上做一连串比较)。


这样才弄懂败者树比胜者树优越的地方。其实,胜者树也可以比败者树优越,这完全取决于输入数据的特点和利用这个数据结构的目的。当然,可能大部分胜者树或者败者树的应用场景也就是多路归并排序(只是个猜测而已),所以很多文章也就默认了这一点。但也害苦了我啊...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值