现在的位置: 首页 > 综合 > 正文

赢者树与败者树

2013年09月25日 ⁄ 综合 ⁄ 共 1201字 ⁄ 字号 评论关闭

转自:http://hi.baidu.com/flower_mlh/blog/item/ca338ecbf07666067e3e6f9a.html

胜者树与败者树是完全二叉树。就像是参加比赛一样,每个选手有不同的实力,两个选手PK,实力决定胜负,晋级下一轮,经过几轮之后,就能得到冠军。胜者树和败者树也是,

 

每个叶子节点相当于一个选手,每个中间节点相当于一场比赛,每一层相当于一轮比赛。不同的是,胜者树的中间节点记录的是胜者的标号,但是败者树的中间节点记录的是败者的标号。

   胜者树与败者树的作用是什么呢?

   胜者树和败者树可以在log(n)的时间内找到最值,但是如果只是找最值,有点大材小用了,中间节点记录的标号就没有意义了。其意义在于,任何一个叶子节点的值改变后,利用中间节点的信息,还是能够快速的找到最值。在K路归并排序中经常用到。

 

 下面用图来表示。

 

败者树:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      

  

 

 

        说明:

3号 PK 4号--> 4号输了,3号晋级, 内部节点ls4的值变为4

3号 PK 0 号--> 0号输了,3号晋级,内部节点ls2的值变为0

 

1号 PK 2号-->1 号输了, 2号晋级,内部节点ls3的值变为1

 

 

2号 PK 3号-->2 号输了,3号晋级,内部节点ls1的值变为2

在 二叉树的根节点ls1上 又加了一个节点ls0,记录最后的胜者。

 

当3号叶子节点的值由29变成14的时候:

‍(哈哈,图没画好,上传后竟然是这样的,说明百度的图像处理算法还是有问题啊,只是圆跟直线之间有个小缝隙,怎么出来一条直线?)

3号与此时的根节点ls4记录的败者比较, 3号 PK 4号-->3号输了,4号晋级,这时,节点ls4的值变为3。。

 

4号与此时的根节点ls2记录的败者比较, 4号 PK 0 号-->4号输了,0号晋级,这是,节点ls2的值变为4。

 

0号与此时的根节点ls1记录的败者比较,0 号 PK 2 号 -->2号输了,0号晋级,这时,节点ls1的值变为2。 Ls0的值变为0。 

 

胜者树:

 

 

 

 

 

 

 

 
‍‍

 

 

 

 

 

 

 

 

同败者树,只是中间节点记录的是当前参加比赛的胜者的编号。

 

当3号叶子节点的值由29变成14的时候:


对于ls4节点,比较其两个儿子节点,3号 PK 4号-->4号胜出,ls4记录的值变为4号。

对于ls2节点,比较其两个儿子节点记录的胜者,0号 PK 4号-->0号胜出,ls2记录的值变为0号。

对于ls1节点,比较其两个儿子节点记录的胜者,0号 PK 2号-->0号胜出,ls1记录的值变为0号。

 

所以,当改变某个叶子节点的值后,胜者树与败者树重构的方式不一样,败者树只是与该节点的根节点的记录有关,而胜者树与该节点的兄弟节点有关。还要有个计算计算出其兄弟节点。就浪费了这一点,其余也没什么。

 

明白原理以后,算法很容易用程序写出来。

抱歉!评论已关闭.