关于make_heap和priority_queue

参考文献

1.stl里关于heap的函数与priority_queue的区别
2.C++中两种实现堆的方式:make_heap和priority_queue
3.[STL]heap和priority_queue


大家都知道,priority_queue是用堆实现的,可以通过重载()运算符选择使用最大堆或最小堆。以前一直觉得stl里面的heap相关的函数都是多余的,因为一般的heap操作都可以用priority_queue来做。直到今天看了July博客中的那道求前k小的数,才发现STL中heap操作独立存在的必要。

在求前k小的数这道题中,有一个解法是,用最小堆初始化数组,然后取前k小的数,复杂度是建堆O(N)+取数O(K*log(N))。原来,对一个数组进行建堆的复杂度是O(N),可以用stl中的make_heap来建堆,而如果用priority_queue没有办法在O(N)复杂度建堆。


1.heap的使用

make_heap(): 生成堆,他有两个参数,也可以有三个参数,前两个参数是指向迭代器的开始元素和指向迭代器的结束元素。第三个参数是可选的,可以用伪函数less()和greater()来生成大顶堆和小顶堆,其中type为元素类型。**如果只传入前两个参数,默认是生成大顶堆,**即第三个参数的默认值的less()。
push_heap(): 是在堆的基础上进行数据的插入操作,参数与make_heap()相同,需要注意的是,只有make_heap()和push_heap()同为大顶堆或小顶堆,才能插入。
pop_heap(): 是在堆的基础上,弹出堆顶元素。这里需要注意的是,pop_heap()并没有删除元素,而是将堆顶元素和数组最后一个元素进行了替换,如果要删除这个元素,还需要对数组进行pop_back()操作。可见想要删除栈顶元素,需要先将栈顶元素换到容器末尾,然后在删除容器末尾的元素。**同样需要注意的是pop_heap参数与make_heap()相同,只有make_heap()和pop_heap()同为大顶堆或小顶堆,才能弹出。

若用make_heap(), pop_heap(), push_heap(),需要添加头文件 algorithm 。
用 less() 和 greater(),需要添加头文件 functional 。


2.priority_queue方式

使用C++中优先队列也可以实现堆,使用方法如下。
首先,优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
定义: priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值