堆的介绍
堆是计算机科学中核心的数据结构之一,基于完全二叉树构建,兼具高效的插入、删除及查询能力,广泛应用于优先队列、堆排序、TopK 等应用场景。
完全二叉树的定义
除叶子节点外,每一个节点的子节点数均为最大值,且最后一层的节点是从左到右连续排列的。
(此处展示完全二叉树结构图)
堆的定义
堆是一种完全二叉树,同时满足堆序性。这种结构可以用数组高效存储,无需额外内存开销。
堆序性规则
堆序性是堆与普通完全二叉树的核心区别,分为两种类型:
- 大根堆:每个父节点的值大于等于其左右孩子节点的值,堆顶是整个堆最大的值。
- 小根堆:每个父节点的值小于等于左右孩子节点的值,堆顶是整个堆最小的值。
堆的存储结构
由于堆是完全二叉树,每层的节点之间不存在空隙,所以数组是堆的最优存储方式。
数组下标与堆节点的映射关系如下:
- 父节点:(子节点下标 - 1) / 2;
- 左子节点:(父节点 * 2) + 1;
- 右子节点:(父节点 * 2) + 2;
堆的核心操作
建堆的两个核心功能:上浮、下沉。下面用 C++ 模板模拟实现一个堆相关操作:
template<class T>
class MaxHeapCompare {
public:
bool operator()(const T& a, const T& b) {
return b > a;
}
};
template<class T, class Compare = MaxHeapCompare<T>>
class Heap {
private:
std::vector<T> heap_;
Compare com_;
private:
// 上浮
void Rise(int child) {
int parent = (child - 1) / 2;
while (child > 0) {
if ((heap_[parent], heap_[child])) {
std::(heap_[parent], heap_[child]);
} ;
child = parent;
parent = (child - ) / ;
}
}
{
child = (parent * ) + ;
(child < heap_.()) {
right_child = (parent * ) + ;
(right_child < heap_.() && heap_[right_child] > heap_[child]) {
child = right_child;
}
((heap_[parent], heap_[child])) {
std::(heap_[parent], heap_[child]);
} ;
parent = child;
child = (parent * ) + ;
}
}
:
(std::vector<T> vec) : (vec) {}
{
( i = (heap_.() - ) / ; i >= ; i--) {
(i);
}
}
{
heap_.(val);
(heap_.() - );
}
{
std::(heap_[], heap_[heap_.() - ]);
heap_.();
();
}
{
heap_[];
}
{
heap_.();
}
{
heap_.();
}
};


