优先队列Priority Queue和堆Heap
对COMP20003中的Priority queue部分进行总结。图片来自于COMP20003
queue队列,顾名思义特点先进先出
priority queue优先队列,出来的顺序按照优先级priority大小,越大(小)的先pop。
普通的方法:
Unsorted array:
Construct: O(n)
Get highest priority: O(n)
Sorted array:
Construct: O(n2)
Get highest priority: O(1)
使用堆heap方法则可以:
Construct:O(n)
Get hishest priority: O(1)
heap data structre: 完全树的数组(指针)形式(不一定是二叉树)。其每个节点满足优先级高于它的子节点,但左右子节点并没有大小关系。 本文主要讲binary heap形式的。

从根节点开始编号放入数组中,为了后续操作方便,可以将数组[0]空出不用,从1开始(如上图,下面的文字叙述也按从1开始,将数组叫做A),因为完全树的关系,如果一个节点是A[i],则它的两个子节点则是A[2 * i]和A[2 * i + 1]。
假定优先级越高越靠前,则第一个节点是(优先级)最大的,之后的都比它小,但左子树上的点和右子树上的点大小关系并不确定。
当pop时,将第一个节点排出,将最后一个节点放到第一个节点的位置,然后从第一个节点位置开始进行downHeap操作修复堆(使得每个节点满足优先级高于它的子节点)。
当push时,将新插入的节点接在末尾,从末尾开始进行upHeap操作修复堆(使得每个节点满足优先级高于它的子节点)。
downHeap:从指定节点位置A[i]开始,与其两个子节点A[2 * i]和A[2 * i + 1]进行优先级比较(或与两个子节点中较大的那个进行比较),如果是A[i]最大,则停止,如果不是,则和较大的那个子节点交换位置,再继续与子节点进行比较,直到没有子节点时停止。
upHeap:从指定位置A[i]开始,与其根节点A[i / 2]进行比较,如果根节点大,则停止,否则交换位置继续与根节点比较,直到没有根节点为止。
两种建堆方法:
1.插入一个节点,进行一次upHeap操作修复堆。 总复杂度O(nlogn)
2.将全部节点插入后,从A[n / 2]到A[1]进行upHeap操作修复堆,即heapSort。看似复杂度还是O(nlogn),但实际上是O(n),因为只有一半的节点需要进行upHeap操作且只有A[1]的upHeap是O(logn),数学证明不懂,以后看看有没有时间补吧。。。



我的代码:
https://raw.githubusercontent.com/Will-Zhu-27/Algorithms-and-Data-Structures/master/priorityQueue.c
https://raw.githubusercontent.com/Will-Zhu-27/Algorithms-and-Data-Structures/master/priorityQueue.h
优先队列Priority Queue和堆Heap的更多相关文章
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ
许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...
- 第二十八篇 玩转数据结构——堆(Heap)和有优先队列(Priority Queue)
1.. 优先队列(Priority Queue) 优先队列与普通队列的区别:普通队列遵循先进先出的原则:优先队列的出队顺序与入队顺序无关,与优先级相关. 优先队列可以使用队列的接口,只是在 ...
- 【算法与数据结构】二叉堆和优先队列 Priority Queue
优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结 ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅴ
命题Q.对于一个含有N个元素的基于堆叠优先队列,插入元素操作只需要不超过(lgN + 1)次比较,删除最大元素的操作需要不超过2lgN次比较. 证明.由命题P可知,两种操作都需要在根节点和堆底之间移动 ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅳ
2.4.4 堆的算法 我们用长度为 N + 1的私有数组pq[]来表示一个大小为N的堆,我们不会使用pq[0],堆元素放在pq[1]至pq[N]中.在排序算法中,我们只能通过私有辅助函数less()和 ...
- 笔试算法题(57):基于堆的优先级队列实现和性能分析(Priority Queue based on Heap)
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当 ...
- c++ STL:队列queue、优先队列priority queue 的使用
说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅶ(延伸:堆排序的实现)
2.4.5 堆排序 我们可以把任意优先队列变成一种排序方法.将所有元素插入一个查找最小元素的有限队列,然后再重复调用删除最小元素的操作来将他们按顺序删去.用无序数组实现的优先队列这么做相当于进行一次插 ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ
· 学后心得体会与部分习题实现 心得体会: 曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E&g ...
随机推荐
- [Swift-2019力扣杯春季决赛]2. 按字典序排列最小的等效字符串
给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符.举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' ...
- Android GL deadlock timeout error
Android GL deadlock timeout error CRASH 在 PBR&IBL 的开发过程中,在 Linux 验证程序运行正常后,移植到 Android 平台,发现程序 c ...
- echarts中提示框的样式调整
第一种方法:利用tooltip 里面的配置项 默认就会有写显示 第二种方法:利用formattet回调函数 返回我们想要显示的信息 formatter : function (params) { va ...
- 云计算OpenStack:云计算介绍及组件安装(一)--技术流ken
云计算介绍 当用户能够通过互联网方便的获取到计算.存储等服务时,我们比喻自己使用到了“云计算”,云计算并不能被称为是一种计算技术,而更像是一种服务模式.每个运维人员心里都有一个对云计算的理解,而最普遍 ...
- GoLang simple-project-demo-03
变量的定义 package main import "fmt" func main() { var a = "initial" fmt.Println(a) v ...
- 一个tomcat设置多个端口,多个端口对应多个应用
修改tomcat/conf目录里面server.xml文件 例如下面这样新增一个8090端口,设置下appBase目录,这样就可以用一个tomcat监听多个端口,每个端口都可以放应用了.我这样新增下面 ...
- PHP接口APP接口
使用PHP来生成APP接口数据是非常简单的,如果你还不了解PHP没有关系,只需要看过PHP的基本语法,再看本示例就可以了. APP接口一般都是json格式(当然也有少数xml格式)遵循restful规 ...
- JavaScript中的typeof
js中的 typeof 操作符返回一个字符串,表示未经计算的操作数的类型. 其中null.字符串对象.数字对象.布尔对象.日期.数组.正则返回结果都为object,可见typeof返回结果并不精确 测 ...
- 20190423-Vscode与Sass不得不说的秘密(>^ω^<)
这是乱七八糟的前言:emmm,今天倔强的点,是关于Vscode使用easySass插件时,不安装ruby环境,直接使用插件编译时,不进行设置,分音是会转译为Css文件的= =,神坑的后知后觉才发现是因 ...
- WPF:浅析Dispatcher
本人文笔差.还是直接上代码吧.(本文假设你对WPF中的Dispatcher有一定的了解) 你觉得下面的代码可以正常执行吗? private void Button_Click(object sende ...