1.败者树解决的问题:
使用多路平衡归并可减少归并趟数,但是用老土方法从k个归并段选出一个最小/最大元素需要对比关键字 k-1 次,构造败者树可以使关键字对比次数减少到[log2k]
2.败者树的结点组成
败者树可视为一棵完全二叉树(多了一个头头【冠军结点】)。k个叶结点分别对应 k个归并段中当前参加比较的元素,非叶子结点用来记忆左右子树中的“失败者”,而让胜者往上继续进行比较,一直到根结点。
3.一个例子
这是2024年LOL S14的赛程:
我们将其构造成拜者树:
构造一棵完全二叉树。非叶子结点只存两队之间的败者,最后在根节点上加一个冠军结点存最终的冠军。
假设T1走了,现在有一个新队只需要和上一次的败者打比赛,全部赢了就可以夺得冠军。
这大大减少了比赛的次数,败者树不像胜者树一样一眼就可以看到每场比赛的获胜者,而是当一个冠军选拔出之后,新来的队伍很轻易的可以通过结点找到上一次的败者,只需要和上次的败者打完就可以决出下一个冠军。
这就很符合用来优化多路归并时需要比较K-1次的比较次数的问题。
4.败者树用于多路归并
……
除了第一次构造败者树时需要比较k-1次,根据最小的元素根据冠军结点中存取的最小数据项所在的归并段号将最小元素输出后,决出下一个冠军只需要比较[log2k]就好。
我们再看一眼胜者树:
当冠军输出后:
新进的元素不能通过结点知道上一个败者的段号是啥,就不能直接比较。
故此:败者树更适用于多路归并。