优先队列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 ...
随机推荐
- 【Python3爬虫】大众点评爬虫(破解CSS反爬)
本次爬虫的爬取目标是大众点评上的一些店铺的店铺名称.推荐菜和评分信息. 一.页面分析 进入大众点评,然后选择美食(http://www.dianping.com/wuhan/ch10),可以看到一页有 ...
- MVC bootstrap-table显示数据时显示No matching records found
问题:bootstrap-table加载数据不显示 @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layou ...
- Excel导出数据库数据
package com.hxkr.util; import java.io.FileOutputStream; import java.util.ArrayList; import java.util ...
- Java高阶语法---static
背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...
- 初学Shiro
Shiro Shiro是什么? Apache Shiro是Java的一个安全(权限)框架. Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境下,也可以用者JavaEE环境下 ...
- react 脚手架 立即可以写业务 react + react-router-dom + less + axios + antd
https://github.com/cynthiawupore/wq-cli
- 《JavaScript高级程序设计》笔记:使用Canvas绘图(15)
基本用法 要使用<canvas>元素,必须先设置其width和height属性,指定可以绘图的区域大小.出现在开始和结束标签中的内容是后备信息,如果浏览器不支持<canvas> ...
- Testlink插件工具
目的: 使用Testlink时间长了,会发现有些功能体验不是很好,比如用例编写就无法快速复制,且展示能力很弱 使用对象: 测试人员.测试leader,技术经理 xmind2testlink:xmind ...
- Linux下LANMP集成环境中编译增加pdo_odbc模块
linux版本为CentOs6.5,php集成环境为lanmp_v3.1,集成环境中默认的pdo扩展为:mysql, sqlite, sqlite2,现在有需求想链接微软的Access数据库,所以需要 ...
- 扫码下单支持同桌单人点餐FAQ
一.使用场景 满足较多商户希望同一桌台,各自点各自的菜品的业态场景(例如杭味面馆,黄焖鸡米饭店,面馆等大多数轻快餐店) 二.配置步骤及注意事项 管理员后台配置--配置管理--店铺配置--扫码点餐tab ...