胜者树和败者树

胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。

不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。

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

胜者树

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

Fig. 1

Fig.1是一个胜者树的示例。规定数值小者胜。

  1. b3 PK b4,b3胜b4负,内部结点ls[4]的值为3;
  2. b3 PK b0,b3胜b0负,内部结点ls[2]的值为3;
  3. b1 PK b2,b1胜b2负,内部结点ls[3]的值为1;
  4. b3 PK b1,b3胜b1负,内部结点ls[1]的值为3。.

当Fig. 1中叶子结点b3的值变为11时,重构的胜者树如Fig. 2所示。

  1. b3 PK b4,b3胜b4负,内部结点ls[4]的值为3;
  2. b3 PK b0,b0胜b3负,内部结点ls[2]的值为0;
  3. b1 PK b2,b1胜b2负,内部结点ls[3]的值为1;
  4. b0 PK b1,b1胜b0负,内部结点ls[1]的值为1。.

Fig. 2

败者树

败者树是胜者树的一种变体。在败者树中,用父结点记录其左右子结点进行比赛的败者,而让胜者参加下一轮的比赛。败者树的根结点记录的是败者,需要加一个结点来记录整个比赛的胜利者。采用败者树可以简化重构的过程。

Fig. 3

Fig. 3是一棵败者树。规定数大者败。

  1. b3 PK b4,b3胜b4负,内部结点ls[4]的值为4;
  2. b3 PK b0,b3胜b0负,内部结点ls[2]的值为0;
  3. b1 PK b2,b1胜b2负,内部结点ls[3]的值为2;
  4. b3 PK b1,b3胜b1负,内部结点ls[1]的值为1;
  5. 在根结点ls[1]上又加了一个结点ls[0]=3,记录的最后的胜者。

败者树重构过程如下:

  • 将新进入选择树的结点与其父结点进行比赛:将败者存放在父结点中;而胜者再与上一级的父结点比较。
  • 比赛沿着到根结点的路径不断进行,直到ls[1]处。把败者存放在结点ls[1]中,胜者存放在ls[0]中。

Fig. 4

Fig. 4是当b3变为13时,败者树的重构图。

注意,败者树的重构跟胜者树是不一样的,败者树的重构只需要与其父结点比较。对照Fig. 3来看,b3与结点ls[4]的原值比较,ls[4]中存放的原值是结点4,即b3与b4比较,b3负b4胜,则修改ls[4]的值为结点3。同理,以此类推,沿着根结点不断比赛,直至结束。

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

时间: 2024-08-05 11:47:15

胜者树和败者树的相关文章

一篇能够加深对胜者树和败者树理解的文章

概念介绍 胜者树和败者树都是完全二叉树,是树形选择排序的一种变型.每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛. 不同的是,胜者树的中间结点记录的是胜者的标号:而败者树的中间结点记录的败者的标号. 胜者树与败者树可以在log(n)的时间内找到最值.任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值.在k路归并排序中经常用到. 胜者树 胜者树的一个优点是,如果一个选手的值改变了,可以很容易地修改这棵胜者树.只需要沿着从该结点到根结点的路径修改这棵

堆排序、胜者树、败者树,孰优孰劣?

在顺序存储结构中,堆排序是一种非常不错的高级选择排序算法,普通情况和最差情况下都可以将时间复杂度控制在O(n * logn). 堆排序可以用在顺序存储结构,是因为完全二叉树的一种独特性质.而这里还要先提一下满二叉树. 啥叫满二叉树?满二叉树是这样一种二叉树,它的每一层都是"满"的,设根部为第0层,则每一层都有2^n个节点.所有节点的度数要么是2,要么是0(叶子). 那完全二叉树呢?我们首先做出如下规定,即对二叉树中的节点,按从根部到叶子.每层从左到右递增的编号:如果某棵树,其所有节点的

(转)败者树 和 胜者树---数组实现

转自:http://blog.csdn.net/sqx2011/article/details/8241734 胜者树和败者树都是完全二叉树,是树形选择排序的一种变型.每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛. 不同的是,胜者树的中间结点记录的是胜者的标号:而败者树的中间结点记录的败者的标号. 胜者树与败者树可以在log(n)的时间内找到最值.任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值.在k路归并排序中经常用到. 一.胜者树 胜者树

算法--胜者树-败者树

胜者树与败者树   胜者树和败者树都是完全二叉树,是树形选择排序的一种变型.每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛. 不同的是,胜者树的中间结点记录的是胜者的标号:而败者树的中间结点记录的败者的标号. 胜者树与败者树可以在log(n)的时间内找到最值.任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值.在k路归并排序中经常用到. 胜者树: 胜者树的一个优点是,如果一个选手的值改变了,可以很容易地修改这棵胜者树.只需要沿着从该结点到根结点的

外排序   败者树   多路归并

一.外排序 排序按数据存在的位置不同分为内排序和外排序 内排序:数据都在内存中,选择合适的排序方法对数据进行排序,比如选择排序.快速排序等 衡量内排序的效率是数据的比较次数 外排序:数据无法全部加载到内存中,只能不断在外部存储器和内存中进行交换完成排序 衡量外排序的效率是内存与外村的交换次数 外排序是针对大文件的数据排序,内存中无法加载这个大文件,把这个文件分为k个小文件,分别排序后合并 http://blog.csdn.net/msdnwolaile/article/details/52084

外排序 & 败者树 & 多路归并-学习

来来来,根据这篇文章,学一下败者树吧: http://blog.csdn.net/whz_zb/article/details/7425152 一.胜者树 胜者树的一个优点是,如果一个选手的值改变了,可以很容易地修改这棵胜者树.只需要沿着从该结点到根结点的路径修改这棵二叉树,而不必改变其他比赛的结果. 二.败者树 败者树是胜者树的一种变体.在败者树中,用父结点记录其左右子结点进行比赛的败者,而让胜者参加下一轮的比赛.败者树的根结点记录的是败者,需要加一个结点来记录整个比赛的胜利者.采用败者树可以

排序(二)键索引、桶排序、位示图、败者树等

排序(二) 以上排序算法都有一个性质:在排序的最终结果中,各元素的次序依赖于它们之间的比较.我们把这类排序算法称为比较排序. 任何比较排序的时间复杂度的下界是nlgn. 以下排序算法是用运算而不是比较来确定排序顺序的.因此下界nlgn对它们是不适用的. 键索引计数法(计数排序) 计数排序假设n个输入元素中的每一个都是在0到k区间的一个整数,其中k为某个整数. 思想:对每一个输入元素x,确定小于x的元素个数.利用这一信息,就可以直接把x放到它在输出数组中的位置了. 例如: 学生被分为若干组,标号为

看数据结构写代码(66) 败者树

计算机的 内存 是 有限的,无法 存入 庞大的数据.当 遇到 大数据需要排序时,我们 需要 将 这些 数据 分段 从 硬盘里 读到 内存中,排好序,再 写入到 硬盘中,这些段 叫做 归并段.最后将 这些 分段 合并 成 一个 最终  完整 有序的 数据. 这里 操作的 时间 =  内部 排序 时间 +  外存读写时间 + 内部归并所需时间. 其中 外存 读写时间 最耗时,外存读写时间 = 读写次数 * 读写数据的时间 ,读写 数据的时间 因 设备 性能 而 影响,我们 无法控制,我们 只能 控制

多路归并排序之败者树

#include<iostream> #include<iomanip> #define M 4 using namespace std; class LoserTree { private: // 调整K为2的整数次幂 int round(int k) { if(k&(k-1)!=0) { int i=0; for(i=31;i>=0;i--) { if(((1<<i)&k)!=0) { cout<<i<<endl; br