news 2026/4/23 10:05:45

败者树是一种完全二叉树结构,用于高效选出多个归并段当前元素中的最小关键字对应段号

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
败者树是一种完全二叉树结构,用于高效选出多个归并段当前元素中的最小关键字对应段号

败者树是一种完全二叉树结构,用于高效选出多个归并段当前元素中的最小关键字对应段号。每次输出一个最小元素后,需从对应归并段读取下一个元素,并通过自底向上调整败者树,重新确定新的最小元素所在段。

实现逻辑详解:

voidAdjust(intls[],intb[],ints,intK){intt=(s+K)/2;// 计算当前归并段s在败者树中的父节点下标while(t>0){if(b[s]>b[ls[t]]){// 若当前段的关键字大于父节点对应段的关键字,则当前段为“败者”inttemp=s;s=ls[t];// 胜者继续向上比较(更新s为原父节点记录的胜者)ls[t]=temp;// 父节点记录本次比较的败者}t/=2;// 向上移动到父节点}ls[0]=s;// 最终s为全局胜者,即最小关键字所在的归并段号}
关键点说明:
  • ls[]数组的作用:长度为K的数组,ls[0]保存当前最小关键字对应的归并段号(即“冠军”),ls[1]ls[K-1]保存各非叶节点记录的“败者”段号。
  • 完全二叉树结构映射:K个叶子节点对应K个归并段,内部节点数为K-1,因此ls数组大小通常为K(索引0~K-1)。叶子节点不显式存储,而是通过(s + K)/2定位其第一个父节点。
  • 调整过程本质:将新关键字b[s]沿路径与各级“胜者”比较,逐层淘汰败者,最终决定新的全局胜者存入ls[0]
时间复杂度:
  • 每次调整耗时O(log⁡K)O(\log K)O(logK),因为树高为log⁡K\log KlogK,仅需沿一条路径向上比较。
  • 相比顺序比较K个段的首元素(O(K)O(K)O(K)),效率显著提升,特别适用于外部排序中大规模数据的多路归并。
    初始化败者树是构建其初始状态的过程,目的是在多路归并开始前,根据各归并段的首个关键字,建立一个能够快速选出最小关键字所在段的结构。初始化的目标是正确填充ls[0]ls[K-1],使得后续可以通过Adjust操作高效维护。

初始化方法(自底向上构造)

由于败者树是一棵完全二叉树,有 K 个叶子节点(对应 K 路归并段),内部节点数为 K-1,因此ls[]数组大小为 K:

  • ls[0]:最终保存全局胜者(最小关键字对应的归并段号)
  • ls[1] ~ ls[K-1]:保存各个非叶节点记录的“败者”段号
步骤如下:
voidLoserTreeInit(intls[],intb[],intK){// 初始化:将所有内部节点设为“无”或默认值(如-1)for(inti=0;i<K;i++){ls[i]=-1;}// 从最后一个叶子节点开始,倒序构造败者树for(ints=K-1;s>=0;s--){intt=(s+K)/2;// 父节点下标while(t>0){if(ls[t]==-1||b[s]>b[ls[t]]){// s 是败者,ls[t] 是胜者继续向上inttemp=s;s=ls[t];// 当前胜者继续上浮ls[t]=temp;// 记录败者}t/=2;}ls[0]=s;// 最终胜者放入 ls[0]}}
核心思想:
  • 逆序插入法:从第 K-1 号归并段到 0 号依次插入,每插入一个就调用类似Adjust的逻辑进行路径调整。
  • 初始时所有ls[t] = -1表示该位置尚未有比较结果。
  • 每次插入相当于“新元素参与竞争”,通过与已有路径上的胜者比较,逐步确定败者归属,并更新胜者向上传递。
  • 最终ls[0]存储的是当前全局最小关键字所在的归并段号。
示例(K=4):

假设四个归并段首元素为:
b[0]=15, b[1]=8, b[2]=3, b[3]=10

初始化完成后:

  • 经过多轮比较调整后,最小值是 b[2]=3 → ls[0] = 2
  • ls[1]~ls[3] 存储各层败者(如1、0、3等,具体取决于实现顺序)

之后每次输出归并段2的元素后,读取下一个元素并调用Adjust(ls, b, 2, K)进行更新。


关键点总结

  • 初始化时间复杂度为O(Klog⁡K)O(K \log K)O(KlogK),因为每个叶子都要走一条长为log⁡K\log KlogK的路径。
  • 实际应用中可采用更高效的自底向上两两合并构造法来优化至O(K)O(K)O(K)
  • 必须确保所有归并段至少有一个元素可用于初始化,否则需特殊处理空段。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 22:50:16

计算机软件按功能分为两大类:系统软件和应用软件

内容解读如下&#xff1a; 计算机软件按功能分为两大类&#xff1a;系统软件和应用软件。 系统软件 是计算机运行的基础&#xff0c;主要作用是管理和协调硬件资源、为应用软件提供运行环境。其核心是操作系统&#xff0c;还包括语言处理程序&#xff08;如编译器、解释器&…

作者头像 李华
网站建设 2026/4/22 12:32:22

蜂鸟e203系统跨开发板移植成功,现已移植至arty a7开发板全新体验

蜂鸟e203系统移植&#xff0c;可以移植到其他开发板 现有移植到 arty a7开发板的蜂鸟E203这个开源RISC-V核最近在硬件圈挺火的&#xff0c;好多人在问能不能搞到自家板子上跑起来。我之前折腾过把它整到Digilent的Arty A7开发板&#xff0c;今天咱们聊聊怎么迁移到其他FPGA开发…

作者头像 李华
网站建设 2026/4/23 10:03:08

python数据结构之链表

python中的数据结构&#xff0c;通过类来实现。一、链表基础概念概念链表是一种线性数据结构&#xff0c;但它不像列表&#xff08;数组&#xff09;那样在内存中连续存储&#xff0c;而是通过节点&#xff08;Node&#xff09;串联而成的。节点是链表的基本单元&#xff0c;其…

作者头像 李华
网站建设 2026/4/22 18:38:35

vue基于springboot的冷链物流配送系统

目录冷链物流配送系统摘要开发技术核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;冷链物流配送系统摘要 基于S…

作者头像 李华
网站建设 2026/4/22 7:34:15

深度测评8个AI论文网站,本科生轻松搞定毕业论文!

深度测评8个AI论文网站&#xff0c;本科生轻松搞定毕业论文&#xff01; AI 工具让论文写作不再难 在当前的学术环境中&#xff0c;越来越多的本科生开始借助 AI 工具来辅助完成毕业论文。这些工具不仅能够帮助学生快速生成内容&#xff0c;还能有效降低 AIGC 率&#xff0c;确…

作者头像 李华
网站建设 2026/4/19 13:02:25

托福雅思听力训练:生成标准化考试模拟试题音频

托福雅思听力训练&#xff1a;生成标准化考试模拟试题音频 在语言培训行业&#xff0c;一个长期存在的难题是——如何快速、低成本地制作大量高保真度的听力训练材料&#xff1f;尤其是面对托福、雅思这类对语音真实性要求极高的标准化考试&#xff0c;传统依赖真人录音的方式不…

作者头像 李华