一般来说,短的作业要尽可能地快速结束,这很重要,因此在已经运行的作业当中这些短作业应该拥有优先权。此外,有些作业虽然不短小但很重要,也应该有优先权。

6.1 模型

优先队列是允许至少以下两种操作的数据结构:insert(插入),它的作用是插入一个元素;以及deleteMin(删除最小者元素),它的工作是找出、返回并删除优先队列中最小的元素。insert操作等价于enqueue(入队),而deleteMin操作等价于dequeue(出队)。

贪婪算法的实现方面队列也是很重要的,该算法通过反复求一个最小元来进行操作。

6.2 一些简单的实现

一种实现优先队列的方法是使用二叉树,它对这两种操作的平均运行时间都是O(logN)。

缺陷: 在使用二叉查找树来实现优先队列的时候,我们删除的唯一元素是最小元。反复除去左子树的节点似乎会损害树的平衡、使得右子树加重。然而,右子树是随机的。在最坏的情况下,即deleteMin将左子树删空的情况下,右子树拥有的元素最多就是它应具有的两倍。

6.3 二叉堆

二叉堆:像二叉查找树一样,堆也有两个性质,即结构性堆序性。恰似AVL树,对堆的一次操作可能破快这两个性质中的一个,因此,堆的操作必须到堆的所有性质都被满足时才能终止。

6.3.1 结构性质

堆是一颗被完全填充的二叉树。容易证明一个高为h的完全二叉树有2k到2(k+1)-1个节点。这意味着二叉树的高是[logN],显然他是O(logN)

二叉堆的实现可以用一数组来实现:

因此一个堆的结构将由一个(Compareable对象的)数组和一个代表当前堆的大小的整形数组组成。

6.3.2 堆序性质

在一个堆中,对于每个节点X,X的父亲中的关键字小于或则等于X的关键字,根节点除外(它没有父亲)。

6.3.3 基本的堆操作

insert(插入)
insert操作一般的策略叫做上滤。为将一个元素插入到堆中,我们在下一个可用的位置创建一个空穴,否则该堆就不是完全树。如果X可以放入空穴中而不破快堆的序,那么插入完成。否则,我们把空穴的父节点上的元素移入该空穴中,这样,空穴就朝着根的方向向上冒一步。

deleteMin(删除最小元)
deleteMin操作的一般策略叫做下滤。当删除一个最小元的时候,要在根节点建立一个空穴。由于堆中现在少了一个元素了,因此堆中最后一个元素X必须移动到该堆的某个地方。如果X可以被放入到空穴中,那么deleteMin操作完成。不过这一般都不太可能,因此我们将空穴的两个儿子中较少者放入空穴,这样就把空穴向下推了一层。重复该步骤直到X可以被放入空穴中。因此,我们的做法就是将X置入沿着从根开始包含最小儿子的一条路径上的正确位置。

6.3.4 其他堆的操作

decreaseKey(降低关键字的值)
decreaseKey(p,∆)降低在位置p处的项的值,降低幅度为正的量∆,由于这可能破坏堆序性质,因此必须通过上滤操作来对堆进调整。

increaseKey(增加关键字的值)
iecreaseKey(p,∆)操作增加在位置p处的项的值,增值的幅度为正的量∆。这可以用下滤来完成,许多调度程序自动地降低正在过多地消耗CPu时间内进程的优先级。

delete(删除)
delete§操作删除堆中位置p上的节点。该操作首先执行decreaseKey(p,无穷大),然后再执行deleteMin()操作来完成。

buildHeap(构建堆)
有时候二叉堆是由一些的初始集合构造而得。这种构造方法以N作为输入项,并把他们放到一个堆中。

6.9 标准库中的优先队列

然而在Java 1.5中出现了泛型类的PriorityQueue,在该类中insert、findMin和deleteMin通过add、element和remove表示。PriorityQueue对象可以通过无参数、一个比较器、或另一个兼容的结合构造出来。

由于优先队列有许多有效的实现方法,因此该类库的设计者没有选择让PriorityQueue成为一个接口。

数据结构和算法分析:第六章 优先队列(堆)相关推荐

  1. 数据结构与算法分析-第2章

    <?xml version="1.0" encoding="utf-8"?> 数据结构与算法分析-第2章 数据结构与算法分析-第2章 Table o ...

  2. 【数据结构总结】第六章 图(非线性结构)

    第六章 图(非线性结构) 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅读和浏览,加 ...

  3. 《Python数据结构与算法分析》第一章课后习题

    这里写自定义目录标题 Introduction 练习题 Python易错总结: Introduction 最近开始学数据结构,打算用python作为语言,看的书是米勒和戴维的<Python数据结 ...

  4. [翻译]C#数据结构与算法 – 第六章BitArray类

    BitArray类用于在资源有限的情况下表示一系列比特值.比特集合可以存储于常规数组,但是如果我们使用专为比特集合设计的数据结构则可以创建更高效的程序.在本章中,我们将学习一下怎样使用这种数据结构并研 ...

  5. 【数据结构与算法分析】第一章、第二章总结

    昨天晚上7点在长沙出发坐11个小时的火车回家,第一次坐硬卧回家还买到了一张下铺票,到底要比硬座舒服了很多.上午休整了半天下午就这干活,虽然放假但是手中的work哪能说停下就停下呢?毕竟也是自己喜欢的w ...

  6. 《算法导论》第六章之堆和优先级队列相关算法C语言实现

    #include <stdio.h> int heap_size = 10; void max_heapify(int *A, int i){ //维持最大堆性质int l = 2 * i ...

  7. 数据结构与算法分析(六)队列总结

    一.什么是队列? 1.先进者先出,这就是典型的"队列"结构. 2.支持两个操作:入队enqueue(),放一个数据到队尾:出队dequeue(),从队头取一个元素. 3.所以,和栈 ...

  8. 数据结构和算法分析:第二章 算法分析

    算法是为求解一个问题所要遵循的,被清楚指定的简单指令的集合. 2.1 数学基础 相对增长率 大O标记法 2.2 模型 为了正式的架构中分析算法,我们需要一个计算模型.我们的模型基本上是一台标准的计算机 ...

  9. 数据结构和算法分析:第一章 引论

    1.2 数学知识和复习 1.2.1 指数 1.2.2 对数 1.2.3 级数 1.2.4 模运算 1.2.5 证明的方法 归纳法证明:用归纳法进行的证明有两个标准的部分.第一步是证明基准情形,就是确定 ...

最新文章

  1. python脚本如何监听终止进程行为,如何通过脚本名获取pid
  2. Python__configparser模块
  3. 2018第三届中国数字化零售创新国际峰会9月即将震撼来袭
  4. Mysql group by 问题
  5. 鸟叔linux私房菜基础篇简体,鸟叔的Linux私房菜基础篇-学习笔记(一)
  6. 作为工程师,你真的了解无服务器?
  7. python print 如何加锁_python中给程序加锁之fcntl模块的使用
  8. 88.搭建git服务器 安装与使用gitlab gitlab备份与恢复
  9. “迭代期内无变更”与敏捷开发产品版本规划
  10. 【监控】使用 Grafana、collectd 和 InfluxDB 打造现代监控系统
  11. 阿里云智能开放平台团队何登成:解码云计算的 2B 服务基因 | 问底中国 IT 技术演进...
  12. 计算机图片怎样存在桌面上,电脑桌面上怎么放照片
  13. 二维码生成(带文字)
  14. 构建Spring Web应用程序
  15. 浏览器有网微信没网络连接服务器,电脑可以登陆微信但是浏览器无法联网是怎么回事儿...
  16. 机器学习及其应用2013, 机器学习及其应用2015
  17. Unity中如何跟随某个物体运动浅谈
  18. Pandas二次学习- 回炉重造(进阶)
  19. django基于python的高校教室管理系统--python-计算机毕业设计
  20. 计算机与信息安全的基本知识,信息安全的基本常识

热门文章

  1. es6 语法 (Proxy和Reflect 的对比)
  2. mysql select 1
  3. Oracle中NVARCHAR2与VARCHAR2的区别
  4. 剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
  5. [转] GIS算法源码集合
  6. 全球超算500强榜单更新:美国Summit居首,中国上榜227台
  7. 谷歌为雇人监听智能助手录音辩护 承诺对用户数据泄露进行调查
  8. php api 无符号整数基数为16的整数参数的字符串表示形式,php基础语法
  9. 伪元素写竖线_用伪元素画出太极图
  10. 008_JsonConfig对象