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. web测试流程

    1.立项后测试需要拿到文档(需求说明书,原型图,接口文档,) 2.需求评审 3.用例编写(主流程,备流程,异常流,业务规则,正常类,异常类,页面检查) 测试用例编写方法(等价类划分,边界值分析法,错误 ...

  2. 9. 弹出键盘挡住input

    1.) react 中 <input className="inp3" placeholder="密码" type="password" ...

  3. ADO.Net和Entity Framework的区别联系

    它们有以下几点区别:1,ADO.Net是开发人员自己select.update等写sql语句,来实现对数据库的增删改查等操作:采用EF进行开发操作数据库的时候,只需要操作对象,这样做使开发更方便,此时 ...

  4. 数值分析实验之曲线最小二乘拟合含有噪声扰动(python实现)

    一.实验目的 掌握最小二乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线目前待实现功能: 1. 最小二乘法的基本实现. 2. 用不同数据量,不同参数,不同的多 ...

  5. seo 回忆录百度基本概念(一)

    前言 我以前的博客自己做的seo,现在拿来和大家一起交流,是白帽哈,黑帽的不敢发,也不敢学[微笑]. 正文 为什么做seo 做seo说到底就是为了排名.为什么需要排名呢?因为现在人比较懒,只会去查看第 ...

  6. Oracle数据库排序后分页查询数据错误问题解决

    一.问题描述:根据更新时间倒序排序然后分页查询数据,但是点击分页操作的时候,会出现数据重复看似没有操作的情况 二.问题错误原因分析 分页查询的SQL语句: select * FROM (select ...

  7. Java 多线程--ThreadLocal Timer ExecutorService

    ThreadLocal /** * ThreadLocal:每个线程自身的存储本地.局部区域 * @author xzlf * */ public class ThreadLocalTest01 { ...

  8. Asp.Net Core 3.1 的启动过程5

    前言 本文主要讲的是Asp.Net Core的启动过程,帮助大家掌握应用程序的关键配置点. 1.创建项目 1.1.用Visual Studio 2019 创建WebApi项目. 这里面可以看到有两个关 ...

  9. [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码生成 (修订版)

    [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码生成 (修订版) 目录 [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码 ...

  10. JVM原理与深度调优(三)

    jvm垃圾收集算法 1.引用计数算法每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.还有一个问题是如何解决精准计 ...