首页 > 代码库 > 【算法学习】老算法,新姿势,STL——Heap
【算法学习】老算法,新姿势,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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。