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 - 优先队列的更多相关文章

  1. priority queue优先队列初次使用

    题目,排队打印问题 Input Format One line with a positive integer: the number of test cases (at most 20). Then ...

  2. Priority Queue(优先队列)

    今天早上起来完成了一个完整的基于二叉堆实现的优先队列,其中包含最小优先和最大优先队列. 上篇说了优先队列的特性,通过建堆和堆排序操作,我们就已经看到了这种数据结构中的数据具有某种优先级别,要么非根节点 ...

  3. 优先队列Priority Queue和堆Heap

    对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...

  4. STL之heap与优先级队列Priority Queue详解

    一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的m ...

  5. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅴ

    命题Q.对于一个含有N个元素的基于堆叠优先队列,插入元素操作只需要不超过(lgN + 1)次比较,删除最大元素的操作需要不超过2lgN次比较. 证明.由命题P可知,两种操作都需要在根节点和堆底之间移动 ...

  6. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅳ

    2.4.4 堆的算法 我们用长度为 N + 1的私有数组pq[]来表示一个大小为N的堆,我们不会使用pq[0],堆元素放在pq[1]至pq[N]中.在排序算法中,我们只能通过私有辅助函数less()和 ...

  7. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ

    许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...

  8. 优先队列(Priority Queue)

    优先队列(Priority Queue) A priority queue must at least support the following operations: insert_with_pr ...

  9. c++ STL:队列queue、优先队列priority queue 的使用

    说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...

随机推荐

  1. A Bug's Life POJ - 2492 (种类或带权并查集)

    这个题目的写法有很多,用二分图染色也可以写,思路很好想,这里我们用关于并查集的两种写法来做. 题目大意:输入x,y表示x和y交配,然后判断是否有同性恋. 1 带权并查集: 我们可以用边的权值来表示一种 ...

  2. ubuntu允许root远程登录

    之前说了,怎么设置root用户登录,但是使用Xshell等工具操作Ubuntu,用户登录不进去,原因很简单,没有开启root登录的权限. 1.检查ssh服务是否开启 使用以下命令,查看是否开启 ps ...

  3. linux通过进程名查看其占用端口

    1.先查看进程pid ps -ef | grep 进程名 2.通过pid查看占用端口 netstat -nap | grep 进程pid 参考: https://blog.csdn.net/sinat ...

  4. Python - Python的基础知识结构,学习方法、难点和重点

    [原创]转载请注明作者Johnthegreat和本文链接. 相信大家都知道,Python很容易学,有编程基础的人,最多两个星期就可以很愉快的撸Python的代码了,那么具体涉及的知识有哪些,下面为大家 ...

  5. Gatling 条件判断

    在使用Gatling的过程中,当前置接口异常,无法获取到数据作为其他接口的请求参数室,接口是不能请求的.或者通过feeder获取的数据要区分不同的情况请求不同的接口.此时,使用gatling的判断语句 ...

  6. 接触 Jmeter

    Apache JMeter是 Apache组织开发的基于 Java的开源压力测试工具.接口以及自动化测试. JMeter 可以进行参数化测试,实现自动化脚本与测试数据分离,能够对应用程序做功能/回归测 ...

  7. Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁

    JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计 ...

  8. Linux 日常操作

    Linux 日常操作 */--> Linux 日常操作 Table of Contents 1. 查看硬件信息 1.1. 服务器型号序列号 1.2. 主板型号 1.3. 查看BIOS信息 1.4 ...

  9. tp5--模型关联

    来源于:https://blog.csdn.net/u012600104/article/details/78927629 先说明,模型关联和join管理是不一样的,用文章和评论的关系来举例.(一对多 ...

  10. Auth认证中的think_auth_rule type字段干嘛用的?

    昨晚认真研究了一下这个类,设计的很巧妙,但是你说的这个字段,我认为应该是作者想加功能但还没写,在session判断的地方可以看到,type这个字段实际是对应的 1-实时验证,2登陆验证 ,显然,这个字 ...