Algorithms - Priority Queue - 优先队列
Priority queue - 优先队列 相关概念
Priority queue优先队列是一种用来维护由一组元素构成的集合S的数据结构,
其中的每一种元素都有一个相关的值,称为关键字(key)。
一个最大有限队列支持一下操作:
insert(S,x):把元素x插入到集合S中.
maximum(S):返回集合S中具有最大关键字的元素.
extract_max(S):去掉并返回S中具有最大关键字的元素
increase_key(S,x,k):将集合S中的元素x的关键字值增加到k,这里假设k的值不小于x元素原来的关键字的值 最大优先队列的应用有很多,其中一个就是在共享计算机系统的作业调度.最大优先队列记录将要执行的各个作业以及他们之间的相对优先级. 当一个作业完成或者被中断后,调度器调用extract_max(S),从所有作业中,选优具有最高优先级的作业来执行. 在任何时候,调度器都可以调用insert把一个新的作业加入到队列中. 相应地,最小优先队列支持的操作包括:insert,minimum,extract_min和decrease_key.最小优先队列可以被用于基于事件驱动的模拟器.队列中保存要模拟的事件,每个事件都有一个发生时间作为其关键字. 事件必须按照发生的时间顺序进行模拟,因为某一事件的模拟结果可能会触发其他事件的模拟. 在每一步,模拟程序调用extract_min来获得下一个要模拟的事件.当一个新事件产生时,模拟器通过调用insert将其插入到最小优先级队列中. 优先队列可以用堆来实现.对一个像作业调度或时间驱动模拟器这样的程序来说,优先队列的元素对应着应用程序中的对象.
Python programming # 优先队列是基于最大堆实现的.
import heap_sorting # heap_sorting 模块代码位于: https://www.cnblogs.com/zzyzz/p/12869256.html def heap_maximum(A):
return A[0] def heap_extract_max(A, heap_size): # heap_size 是堆的一个属性, 这里通过一个函数参数的形式实现.
if heap_size < 1:
print('error - heap underflow')
return False
max = A.pop(0)
heap_size -= 1
heap_sorting.max_heapify(A,1,heap_size)
return max if __name__ == '__main__':
A = [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
print('Before', A)
heap_extract_max(A, 10)
print('After', A) 结果打印:
Before [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
After [14, 10, 8, 7, 9, 3, 2, 4, 1]
def heap_increase_key(A, i, key):
if key < A[i-1]:
print('error - new key is smaller than current key')
return False
# 最大堆 A 中的第 i 个元素 A[i-1] 首先被替换成待插入的元素 key
A[i-1] = key # 新插入的元素会不断地与其父结点进行比较, 如果当前元素 key 比较大, 则与其父结点进行交换, 更新 i 的值后继续比较. 直到当前元素 key 小于其父结点的时候终止循环.
while i > 1 and A[heap_sorting.parent(i)-1] < A[i-1]:
print(A[heap_sorting.parent(i) - 1], A[i - 1])
A[i-1], A[heap_sorting.parent(i)-1] = A[heap_sorting.parent(i)-1], A[i-1]
i = heap_sorting.parent(i)
print('i',i)
print('A',A) if __name__ == '__main__':
A = [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
print('Before', A)
heap_increase_key(A,9,15) # 将 15 插入到最大堆 A 中. 然后加工新的数组为新的最大堆.
print('After', A)
结果打印:
Before [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
8 15 # 第一次循环的 parent 和 key
i 4 # parent < key, 更新 i
A [16, 14, 10, 15, 7, 9, 3, 2, 8, 1] # 第一次循环后得到的新数组 14 15 # 第二次循环的 parent 和 key
i 2 # parent < key, 更新 i
A [16, 15, 10, 14, 7, 9, 3, 2, 8, 1] # # 第二次循环后得到的新数组
After [16, 15, 10, 14, 7, 9, 3, 2, 8, 1] # 循环退出后的得到新数组即为新的最大堆
def max_heap_insert(A, key, heap_size):
heap_size += 1
A.insert(heap_size-1, -float('inf'))
print(A)
heap_increase_key(A, heap_size, key) if __name__ == '__main__':
A = [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
print('Before', A)
max_heap_insert(A,13,10)
print('After', A) 结果打印:
Before [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1, -inf] # 先在对应的位置上设置一个 sentinel
7 13 # parent < key
i 5 # 交换 parent 和 key 后更新 i
A [16, 14, 10, 8, 13, 9, 3, 2, 4, 1, 7] # 交换后新的数组
After [16, 14, 10, 8, 13, 9, 3, 2, 4, 1, 7] # 循环退出后的结果
Reference,
1. Introduction to algorithms
Algorithms - Priority Queue - 优先队列的更多相关文章
- priority queue优先队列初次使用
题目,排队打印问题 Input Format One line with a positive integer: the number of test cases (at most 20). Then ...
- Priority Queue(优先队列)
今天早上起来完成了一个完整的基于二叉堆实现的优先队列,其中包含最小优先和最大优先队列. 上篇说了优先队列的特性,通过建堆和堆排序操作,我们就已经看到了这种数据结构中的数据具有某种优先级别,要么非根节点 ...
- 优先队列Priority Queue和堆Heap
对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...
- STL之heap与优先级队列Priority Queue详解
一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的m ...
- 《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()和 ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ
许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...
- 优先队列(Priority Queue)
优先队列(Priority Queue) A priority queue must at least support the following operations: insert_with_pr ...
- c++ STL:队列queue、优先队列priority queue 的使用
说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...
随机推荐
- Daily Scrum 12/21/2015
Process: Zhaoyang: Integrate the oxford Speech API Code to the IOS client and do some UI optimizatio ...
- [YII2] 修改默认控制器Controller以及默认方法Action
试了好多方法都没成功,下面方法绝对能成功设置 在框架里面有源码,在/vendor/yiisoft/yii2/web/Application.php的第34行找到了: class Application ...
- Ipython入门小教程
学习<利用python进行数据分析>第三章 IPython:一种交互式计算和开发环境的笔记,共享给大家,同时为自己作为备忘用. 安装ipython用pip即可.ps.博主用的是win7系统 ...
- BMP图片解析
本博客参考:https://www.cnblogs.com/l2rf/p/5643352.html 一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Window ...
- Java中常量的概念
常量:在程序执行过程中,其值不发生改变的量.分类:A:字面值常量B:自定义常量字面值常量A:字符串常量(用“”括起来的内容).举例:"hello"B:整数常量 (所有的整数)举例: ...
- Spring基于注解@Required配置
基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...
- JasperReports入门教程(四):多数据源
JasperReports入门教程(四):多数据源 背景 在报表使用中,一个页面需要打印多个表格,每个表格分别使用不同的数据源是很常见的一个需求.假如我们现在有一个需求如下:需要在一个报表同时打印所有 ...
- python信息收集(四)
在前三篇中,我们介绍了使用python脚本发现二层.三层的主机设备,接下来我们介绍使用python发现第四层主机. 在TCP/IP协议中,第四层为传输层,主要使用的通信协议为TCP协议 ...
- 2019-2020-1 20199326《Linux内核原理与分析》第七周作业
实验内容:分析Linux内核创建一个新进程的过程 初始化Menu Os,输入fork可以看到menuos触发了一个fork系统调用 再开一个shell,进入调试模式,设置几个断点sys_clone,d ...
- [Inno Setup] Do not show application version in “Program and Features” control panel
Set AppVersion empty. But, then you have to set the AppVerName. Depending on your needs either set i ...
