原文链接:https://www.yuque.com/cppdev/algo/rwvwes
胜者树/败者树
【胜者树/败者树】
- 都是完全二叉树,是树形选择排序的一种变形。每个叶子结点相当于一个选手,每个中间结点相当于一个比赛,每一层相当于一轮比赛
- 不同:胜者树中间结点记录的是胜者的标号;而败者树的中间结点是记录败者的标号
【评价】
- 胜者树/败者树可以在log(n)的时间内找到最值
- 任何一个叶子结点的值改变后,利用中间结点的信息,还能够快速地找到最值
败者树
【数据结构】两个数组
- b[]:下标i为选手的号码,b[i]为选手的能力
- ls[]:存放败者的记录,ls[0]为正常的胜利者
【建树】两个子节点比较(b3、b4),败者(b4)放入它们的父结点(ls[4]),而胜者(b3)送到它们的父结点的父结点再和别人PK。如此重复,即可以把最后的胜者推到败者树根结点的父结点