1.二叉堆
时间复杂度,获取最大值O(1),删除最大值O(logn),添加元素O(logn)
1.1什么是堆
二叉堆(Heap)是一种特殊的数据结构,它是一棵完全二叉树。通常分为大根堆和小根堆两种类型。在大根堆中,每个父节点都大于或等于它的子节点;而在小根堆中,每个父节点都小于或等于它的子节点。
堆的主要操作有:
-
插入元素:把元素插入到堆中的合适位置,以维持堆的性质。
-
删除堆顶元素:删除堆顶元素并重新调整堆,以维持堆的性质。
-
堆化(建堆):将一个无序的序列转化为一个堆。
-
更新堆中的元素:更新堆中某个元素的值,并重新调整堆。
上滤(sift up)和下滤(sift down)是堆化的两种基本操作。上滤是将新元素插入到堆中并将其上移到合适位置;下滤则是将堆顶元素移动到合适位置以维持堆的性质。
堆的应用非常广泛,例如:
-
堆排序:利用堆排序算法可以对一个序列进行排序。
-
优先队列:堆可以用作优先队列,其中每个元素都带有一个优先级,每次从队列中取出的元素都是优先级最高的元素。
-
图论算法:堆可以用于图论算法中,例如Dijkstra最短路径算法和Prim最小生成树算法等。
-
堆积树:堆可以用于存储动态过程中的历史信息,例如计算机内存分配和垃圾回收等
1.2堆的性质
任意节点的值总是 >= (<=)子节点的值。
如果任意结点的值总是 >= 子节点的值,称为:大根堆,大顶堆,最大堆。
如果任意结点的值总是 <= 子节点的值,称为:小根堆,小顶堆,最小堆。
2.堆的接口
template<typename T>
class Heap
{
public:int size();bool isEmpty();void clear();void add(T element);//添加元素T get(); //获取堆顶元素T remove(); //删除堆顶元素
};
3.接口的实现
二叉堆的逻辑结构就是一棵二叉树,所以也叫完全二叉堆。但鉴于完全二叉树的特性,二叉堆的底层(无力结构)一般用数组实现。