C++中的堆
一、堆的概念
堆是一种特殊的树形数据结构,其每个节点都有一个值。通常所说的堆的数据结构,是指二叉堆,即完全二叉树。在C++中,标准库提供了一些用于操作堆的函数,如make_heap()
, push_heap()
, pop_heap()
等。
二、堆的特点
- 每个节点的值都大于或等于(最大堆)或小于或等于(最小堆)其子节点的值;
- 堆是完全二叉树;
- 在堆中,父节点的值总是大于或等于(最大堆)或小于或等于(最小堆)其子节点的值;
- 堆的根节点是整个堆的最大值(或最小值)。
三、堆的实现原理
- 建立堆:首先将元素插入到数组中,然后通过调整数组中的元素,使其满足堆的性质。这个过程通常使用
make_heap()
函数来完成。 - 调整堆:在插入新元素后,需要调整堆以保持其性质。这个过程通常使用
push_heap()
函数来完成。 - 删除堆顶元素:在需要删除堆顶元素时,首先需要将堆调整为最大堆或最小堆,然后再进行删除操作。这个过程通常使用
pop_heap()
函数来完成。
四、堆的算法流程
- 插入元素:首先将元素插入到数组中,然后通过调整数组中的元素,使其满足堆的性质。
- 调整堆:在插入新元素后,需要调整堆以保持其性质。这个过程通常使用
push_heap()
函数来完成。 - 删除堆顶元素:在需要删除堆顶元素时,首先需要将堆调整为最大堆或最小堆,然后再进行删除操作。这个过程通常使用
pop_heap()
函数来完成。 - 获取最大/小值:如果需要获取当前堆的最大值或最小值,可以使用
top()
函数来获取。如果需要获取最大/小值的索引,可以使用bottom()
函数来获取。
五、C++代码示例
#include<bits/stdc++.h> // 引入头文件,包含了常用的标准库函数和数据结构
#define reg register // 定义宏,表示使用寄存器变量
using namespace std; // 使用命名空间std,简化代码书写
// 定义一个函数read(),用于读取输入的整数,支持负数输入
inline int read(