从二叉堆到对顶堆:数据结构维护“第K大”问题的优雅做法.docxVIP

  • 2
  • 0
  • 约6.31千字
  • 约 14页
  • 2026-06-25 发布于北京
  • 举报

从二叉堆到对顶堆:数据结构维护“第K大”问题的优雅做法.docx

从二叉堆到对顶堆:数据结构维护“第K大”问题的优雅做法

前言:堆——那个你“会用”但未必“懂用”的数据结构

在信息学竞赛的数据结构家族里,堆(Heap)是一个很特别的存在。

说它简单,它确实简单——标准库里有现成的priority_queue,几行代码就能实现堆排序或优先队列。大多数选手对堆的理解,也就停留在这个层面:把数扔进去,每次取最大的(或最小的),仅此而已。

但堆真正的威力,远不止于“取最值”。有一类题目,题面上看不出任何“堆”字,甚至你可能第一时间想到的是平衡树、线段树——但最优解偏偏就是堆。这类题目有一个共同特征:需要在动态变化的数据中,快速查询“第K大”或“中位数”。

这就是本文要讲的核心数据结构——对顶堆(Top-HeavyHeap)。它是堆的一种巧妙组合,能以O(logn)的效率优雅解决“动态第K大/中位数”问题,代码比平衡树短一个数量级。

本文将以一道经典题——动态中位数——为主线,从零开始,从二叉堆讲到对顶堆,一步步展示这个数据结构的构造过程、原理图解和完整代码。读完你会重新认识堆:它不只是“那个能取最值的东西”,而是一把解决“第K大”类问题的瑞士军刀。

一、堆的本质回顾:不只是“取最值”那么简单

1.1堆的核心性质

在进入对顶堆之前,先统一一下基础概念。如果你对priority_queue已经很熟,可以直接跳到1.3节。

二叉堆是一棵完全二叉树,且满足

文档评论(0)

1亿VIP精品文档

相关文档