STL序列式容器 - heap

STL 序列式容器 - heap

STL- heap主要有以下几种操作组成:

make_heap,建堆

sort_heap,堆排序

pop_heap,取出堆顶元素

push_heap,调整堆

heap并不归属于STL容器组件,它是个幕后英雄,扮演priority queue的助手。binary max heap适合作为priority queue的底层机制。

STL序列式容器 - heap_第1张图片

heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制。

而这个实现机制中的max-heap实际上是以一个vector表现的完全二叉树(complete binary tree)。

二叉堆(binary heap)就是i一种完全二叉树。也即是。整棵二叉树除了最底层的叶节点以外,都是填满的,而最低层的叶子结点必须是从左到右不留空隙。

至于max-heap和min-heap,前者的任何一个父亲结点都必须大于等于他的任意子结点,而后者相反。

上面表示的是一颗完全二叉树。

下面我们利用数组来隐式表达这棵数:

第0号元素保留,从arry[1]开始保存A,这时候我们可以轻易的看到:

位于位置i的某个结点arry[i],他的左子结点必然在arry[2*i]中,右子结点必然位于arry[2*i+1],其父亲结点必然位于arry[i/2]处。

这种数组表达的方式我们 称为 隐式表达。

当然由于arry大小是静态的,不能动态添加元素,我们可以使用vector来实现。

heap算法:

建立堆

make_heap(_First, _Last, _Comp)

默认是建立最大堆的。对int类型,可以在第三个参数传入greater<int>()得到最小堆。


在堆中添加数据

push_heap (_First, _Last)

要先在容器中加入数据push_back(),再调用push_heap ()


在堆中删除数据

pop_heap(_First, _Last)

要先调用pop_heap()再在容器中删除数据


堆排序

sort_heap(_First, _Last)

排序之后就不再是一个合法的heap了

下面我们来看测试实例吧:

Selection_151.pngSTL序列式容器 - heap_第2张图片


priority_queue:


priority_queue是一个拥有权值观念的queue,它允许加入新元素、移除旧元素、审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外别无其它存取元素的途径。与queue不同,priority_queue缺省情况下是以vector为底层容器,并加上heap处理规则,因此,STL priority_queue往往不被归类为container(容器),而被归类为container adapter。

你可能感兴趣的:(STL序列式容器 - heap)