算法学习老算法,新姿势,STL——Heap

Posted PinkRabbit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习老算法,新姿势,STL——Heap相关的知识,希望对你有一定的参考价值。

“堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值。

这都是老套路了,具体的内部实现我也就不谈了。

我一般来说,都是用queue库中的priority_queue,也就是STL的优先队列来实现堆的,然而最近我发现了一个新的STL容器,它相对优先队列有着更小的常数和更方便的操作。

它就是heap,就是堆。

关于heap,STL提供了4个函数,它们都定义于algorithm库中。它们分别是:

sort一样,其中_First_Last都是头,尾指针或迭代器(对应vector或queue),而_Cmp表示了元素间的大小关系函数。

类似sort,堆中的元素是[_First, _Last)的区间,若内存不连续,也至少要是可随机访问的迭代器(如vector)。

其中_Cmp不是必要的。

还需注意这些函数维护的均是大根堆(即父亲值比孩子大的堆,也称最大堆)。

建立堆:

make_heap(_First, _Last, _Cmp)

在堆中添加元素:

push_heap(_First, _Last, _Cmp)

要先添加元素,再调用函数。

在堆中删除元素:

pop_heap(_First, _Last, _Cmp)

要先调用函数,再删除(不删也可以,只要保证不会出现内存泄漏或者其它bug)。

堆排序:

sort_heap(_First, _Last, _Cmp)

排完序,就像普通的sort一样了,变成有序数组了。不再具有堆的性质。

咚咚咚,代码以后再贴

以上是关于算法学习老算法,新姿势,STL——Heap的主要内容,如果未能解决你的问题,请参考以下文章

STL_算法_Heap算法(堆排)(精)

STL_算法_Heap算法(堆排)(精)

STL学习堆相关算法详解与C++编程实现(Heap)

STL -- heap结构及算法

STL源码剖析 学习笔记

C++ STL应用与实现72: 标准库里的堆--如何使用标准库的heap算法