败者树多路排序

本文介绍了败者树的概念,详细阐述了败者树的构建过程,并通过实例解释了如何使用败者树进行多路排序。败者树是一种完全二叉树,其非叶子节点存储失败者信息,从而减少排序过程中节点的更新操作。文章最后提到了败者树排序的步骤和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:

败者树是一个完全二叉树,非叶子节点记录失败者。那么相对于胜者树,具有访存小的优势。胜者树胜者拿走后,整条通路(从叶子到根)所有记录的胜者信息失效,那么新加入节点需要从叶子一直遍历到根,有可能每次都要写入(更新新的胜者)。而败者树,新加入的节点可以利用整条路径的败者信息。

败者树构建

Alt text

构建过程:
① 初始四个数组,1,2,3,4,内部节点为-1;构建完全后,内部节点记录数组编号。
② 数组4中元素18与父节点比较,父节点为-1,更新为4,退出;等待后面元素更新父节点。
③ 数组3中元素11与父节点记录的败者4(数组4中元素18)比较,记录败者4,胜者3上浮,更新,遇到-1停止上浮,退出。
④ 数组2中元素6与父节点比较,父节点为-1,更新为2,退出;等等后面元素更新父节点。
⑤ 数组1中元素7与父节点记录的败者2(数组2中元素6)比较,记录败者1,胜者2上浮与父节点记录的3比较。
⑥ 数组2(6)与数组3(11)比较,记录败者3,将最终胜者2单独记录。
⑦ 至此,败者树构建完毕。

败者树排序

这里写图片描述

规定:小于等于为胜利者。
① 胜者为数组1,拿掉5以后,数组1弹出一个元素。
② 数组1中新元素12与父节点比较(即数组2中元素6比较),记录败者1,胜者2上浮,与数组3比较,取得胜利。
③ 胜者为数组2,拿掉6以后,数组2弹出一个元素。
④ 数组2中新元素9与父节点比较(即数据1中元素12比较),记录败者1,胜者2上浮,与数组3比较,取得胜利。
⑤ 胜者为数组2,拿掉9以后,数组2弹出一个元素。
⑥ 数组2中新元素12与与父节点比较(即数组1中元素12比较),记录败者1,胜者2上浮,与数组3比较,失败。
⑦ 胜者为数组3,拿掉11以后,数组3弹出一个元素。
⑧ 数组3中新元素15与父节点比较后(即数组4中元素18比较),记录败者4,胜者3上浮,与数组2比较,失败。
⑨ 胜者为数组2.

代码实现
#ifndef _LOSER_TREE_H_
#define _LOSER_TREE_H_

#include <climits>
#include <vector>

class Player {
 public:
  explicit Player(const std::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值