- 2
- 0
- 约6.31千字
- 约 14页
- 2026-06-25 发布于北京
- 举报
从二叉堆到对顶堆:数据结构维护“第K大”问题的优雅做法
前言:堆——那个你“会用”但未必“懂用”的数据结构
在信息学竞赛的数据结构家族里,堆(Heap)是一个很特别的存在。
说它简单,它确实简单——标准库里有现成的priority_queue,几行代码就能实现堆排序或优先队列。大多数选手对堆的理解,也就停留在这个层面:把数扔进去,每次取最大的(或最小的),仅此而已。
但堆真正的威力,远不止于“取最值”。有一类题目,题面上看不出任何“堆”字,甚至你可能第一时间想到的是平衡树、线段树——但最优解偏偏就是堆。这类题目有一个共同特征:需要在动态变化的数据中,快速查询“第K大”或“中位数”。
这就是本文要讲的核心数据结构——对顶堆(Top-HeavyHeap)。它是堆的一种巧妙组合,能以O(logn)的效率优雅解决“动态第K大/中位数”问题,代码比平衡树短一个数量级。
本文将以一道经典题——动态中位数——为主线,从零开始,从二叉堆讲到对顶堆,一步步展示这个数据结构的构造过程、原理图解和完整代码。读完你会重新认识堆:它不只是“那个能取最值的东西”,而是一把解决“第K大”类问题的瑞士军刀。
一、堆的本质回顾:不只是“取最值”那么简单
1.1堆的核心性质
在进入对顶堆之前,先统一一下基础概念。如果你对priority_queue已经很熟,可以直接跳到1.3节。
二叉堆是一棵完全二叉树,且满足
您可能关注的文档
- 2020-2024 CSP-J入门组复赛 五年真题“天花板”题型归类.docx
- 骗分与对拍:暴力出奇迹的工程化实现方法.docx
- 位运算的奇技淫巧:状压DP与集合操作的极致加速.docx
- 字符串处理三剑客:哈希、KMP及字典树的防坑手册.docx
- 线性数据结构的“特异功能”:单调栈与单调队列的高频应用场景.docx
- CSP-JS数学工具箱(二):组合数学中的“挡板法”与卡特兰数真题演义.docx
- CSP-JS数学工具箱(一):数论基础推导笔记.docx
- 让你的贪心不再是“赌”:证明贪心策略正确性的三大模型.docx
- 图论不发愁:邻接矩阵-邻接表-前向星的“选刀”指南.docx
- 动态规划的降维打击:从推公式到压数组的实战四步法.docx
原创力文档

文档评论(0)