c++中STL之heap, priority_queue使用_longhopefor的博客
文章推薦指數: 80 %
C++中堆的应用:make_heap, pop_heap, push_heap, sort_heap, ... heap并不属于STL容器组件,它分为max heap 和min heap,在缺省情况下,max-heap是 ...
c++中STL之heap,priority_queue使用
longhopefor
于 2014-07-3020:36:39 发布
12802
收藏
7
分类专栏:
C++编程
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/longhopefor/article/details/38303545
版权
C++编程
专栏收录该内容
8篇文章
0订阅
订阅专栏
一、heap
heap并不属于STL容器组件,它分为maxheap和minheap,在缺省情况下,max-heap是优先队列(priorityqueue)的底层实现机制。
而这个实现机制中的max-heap实际上是以一个vector表现的完全二叉树(completebinarytree)。
STL在
1.make_heap():
make_heap(_First,_Last)
make_heap(_First,_Last,_Comp)
默认是建立最大堆的。
对int类型,可以在第三个参数传入greater
2.push_heap(_First,_Last):
新添加一个元素在末尾,然后重新调整堆序。
也就是把元素添加在底层vector的end()处。
该算法必须是在一个已经满足堆序的条件下,添加元素。
该函数接受两个随机迭代器,分别表示first,end,区间范围。
关键是我们执行一个siftup()函数,上溯函数来重新调整堆序。
具体的函数机理很简单,可以参考我的编程珠玑里面堆的实现的文章。
3.pop_heap(_First,_Last):
这个算法跟push_heap类似,参数一样。
不同的是我们把堆顶元素取出来,放到了数组或者是vector的末尾,用原来末尾元素去替代,然后end迭代器减1,执行siftdown()下溯函数来重新调整堆序。
注意算法执行完毕后,最大的元素并没有被取走,而是放于底层容器的末尾。
如果要取走,则可以使用底部容器(vector)提供的pop_back()函数。
4.sort_heap(_First,_Last):
既然每次pop_heap可以获得堆中最大的元素,那么我们持续对整个heap做pop_heap操作,每次将操作的范围向前缩减一个元素。
当整个程序执行完毕后,我们得到一个非降的序列。
注意这个排序执行的前提是,在一个堆上执行。
下面是这几个函数操作vector中元素的例子。
#include
第三个参数为比较函数。
第三种方法:自对自定义的数据类型自定义优先级,
1.通过自定义operator(constNode&a,constNode&b)
{
returna.key>b.key;
}
};
在该结构中,value为值,priority为优先级,使用示例:
priority_queue
structNode
{
intkey;
intvalue;
};
structcmpLess
{
booloperator()(constNode&a,constNode&b)
{
returna.key
template
队列遵循FIFO策略,而优先队列根据优先级弹出元素,即,优先级最高的元素首先弹出。
它在某些方面类似于普通队列,但在以下方面有所不同:
在优先队列中,队列中的每个元素都与某个优先级相关联,但是优先级在队列数据结构中不存在。
优先队列中具有最高优先级的元素将被首先删除,而队列遵循FIFO(先进先出)策略,这意味着先插入的元素将被首先删除。
如果存在多个具有相同优先级的元素,则将考虑该元素在队列中的顺序。
注意:优
堆(heap)与优先队列(priorityqueue)
最新发布
weixin_52575498的博客
03-25
1571
一、堆
1.堆定义:
如果这棵完全二叉树的任意结点的关键字小于或等于其左孩子和右孩子的关键字,则称之为小堆
C++基础数据结构|优先对列、堆(PriorityQueue、Heap)
小麦China的博客
04-20
39
C++基础数据结构|优先对列、堆(PriorityQueue、Heap)
优先级队列priority_queue
这是一个拥有权值queue,其内部元素按照元素的权值排列。
权值较高者排在最前优先出队。
其中缺省情况下系统是通过一个max-heap以堆实现完成排序特性,表现为一个以vector表现的完全二叉树。
//升序队列小顶堆great小到大
priority_queue
Max-heap/Min-heap保证父节点都比子节点大/小,但兄弟节点之间没有大小关系。
Heap通常用数组实现。
一个节点i的左子节点编号是2*i,右子节点是2*i+1。
Heap通常是完全二叉树(因为效率高),但没有要求一定是完全二叉树。
PriorityQueue也是一种数据结构。
其中每个元素都有一个关键字key,元素之间的比...
heap、priority_queue
qq_46514141的博客
03-18
62
heap
一.heap概述
heap并不是STL容器组件,那为什么要有它呢,因为随后的priorityqueue是以heap为底层结构,priorityqueue就是一个优先队列,即无论按什么样的顺序把任何元素推入优先队列中,取出来的时候一定是先取优先级最大的元素。
为了实现这一目标,heap要做的就是把存在其中的元素排好序,如果用list的话排序太慢,如果用binarysearchtree的话实现太复杂,所以我们这里用completebinarytree,即用二叉完全树作为heap的数据结构,那
STL:priority_queue和heap笔记
编程爱好者的博客
03-19
296
heap数据结构,图和原理网上很多。
我的一个堆排序,这是堆思想的一个应用。
voidadjustHeap(inta[],inti,intsize)
{
//intmax;
intl=2*i+1;
intr=2*i+2;
intmax=i;
//vs2017会检测&&右边的,故不能将l
延伸文章資訊
- 1make_heap - C++ Reference
A heap is a way to organize the elements of a range that allows for fast retrieval of the element...
- 2Heap in C++ STL | make_heap(), push_heap(), pop_heap ...
Heap data structure can be implemented in a range using STL which allows faster input into heap a...
- 3[ Data Structure ] 堆(Heap) @ 我的程式學習路 - 痞客邦
最小堆(min heap). ○ 堆排序(Heapsort). 值得注意一點就是在C語言中實做堆時一般皆是用一維陣列解決. 另外遇到"優先隊列"(Priority Queue)問題就是用 ...
- 4資料結構大便當: Binary Heap
大家好,我是Kadai,資料結構大便當EP.2 要說的是binary heap,雖然早在上資料結構 ... 因為是min-heap 所以移上來之後一定會比目前的root 的child node…
- 5Heap Data Structure - Programiz
Python, Java and C/C++ Examples