c++ 中有小堆顶和大堆顶两种数据结构,他们分别的含义是父节点比两个子节点都大或者都小。如此一来堆栈的最顶部就是最大的或者是最小的。大小堆顶一般是hi用连续的容器实现的,比如说数组,vector,queue等。不可以用不连续的容器来实现。主要的 原因是联系连续的数组可以任意地址访问,大小堆顶如果知道了父节点的索引,那么久可以很快的计算出两个子节点的索引。所以需要用连续的容器来作为实现的底层。大小堆的每次插入和删除的时间复杂度都是logn的。(PS给你一个无序的数组,建堆的时间复杂度是O(n)的)。
C++ 里面实现的大小堆顶是priority_queue这个容器,头文件是queue。常见的函数有:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
定义: priority_queue<Type, Container, Functional> name
其中的functional 是比较方式,默认是大堆顶,也就是greater<int>
Type 是数据的类型,Container是容器的类型,默认是vector