【算法概论】分治算法:k路归并

  • Post author:
  • Post category:其他


首先了解两个概念,

胜者树



败者树

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

标号

。因此,胜者树和败者树的根节点,就是最终的胜者或败者 —— 反映到一组数据中,可以是最大值或最小值。

胜者树与败者树可以在

log(n)

的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值。在k路归并排序中经常用到。



胜者树


规定数小者胜。

b3 PK b4,b3胜b4负,内部结点ls[4]的值为3;

b3 PK b0,b3胜b0负,内部结点ls[2]的值为3;

b1 PK b2,b1胜b2负,内部结点ls[3]的值为1;

b3 PK b1,b3胜b1负,内部结点ls[1]的值为3。

如果我们将b3的值改为11,就需要对该胜者树进行重构,重构后的胜者树如下所示:

b3 PK b4,b3胜b4负,内部结点ls[4]的值为3;

b3 PK b0,b0胜b3负,内部结点ls[2]的值为0;

b1 PK b2,b1胜b2负,内部结点ls[3]的值为1;

b0 PK b1,b1胜b0负,内部结点ls[1]的值为1。

由上面的例子,可以很容易的理解:


胜者树的一个优点是,如果一个选手的值改变了,只需



版权声明:本文为t11383原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。