zoukankan      html  css  js  c++  java
  • 胜者树与败者树

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

     
          不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。
     
           胜者树与败者树可以在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。同理,以此类推,沿着根结点不断比赛,直至结束。
     
            由上可知,败者树简化了重构。败者树的重构只是与该结点的父结点的记录有关,而胜者树的重构还与该结点的兄弟结点有关。
     
    努力奋斗的小墨鱼 ---- http://www.cnblogs.com/WayneZeng/
  • 相关阅读:
    Python入门-函数进阶
    Python入门-初始函数
    Leetcode300. Longest Increasing Subsequence最长上升子序列
    Leetcode139. Word Break单词拆分
    Leetcode279. Perfect Squares完全平方数
    Leetcode319. Bulb Switcher灯泡开关
    Leetcode322. Coin Change零钱兑换
    二叉树三种遍历两种方法(递归和迭代)
    Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
    Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
  • 原文地址:https://www.cnblogs.com/WayneZeng/p/2587695.html
Copyright © 2011-2022 走看看