2019独角兽企业重金招聘Python工程师标准>>>

优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。Java中,PriorityQueue的底层数据结构就是堆(默认是小堆),关于Java的PriorityQueue更多知识请点击:深入理解Java PriorityQueue。

  优先队列的实现中,我们可以选择堆数据结构,最大优先队列可以选用大堆,最小优先队列可以选用小堆来实现。下面以最大优先队列来讲解其原理。最大优先队列一般包括将一个元素插入到集合S中、返回集合S中具有最大key的元素、返回并删除集合S中具有最大key的元素等。

插入操作

  插入操作是将一个元素插入到集合S中,首先把该元素放入所有元素的下一位置,然后执行“上浮”操作,如下图示例(注意,下图示例是小堆,不过原理是一样的,图片来自深入理解Java PriorityQueue)

)

移除操作

  优先队列中,在队列非空情况下移除集合中第一个元素,也就是下标为0的元素,然后将集合中最后一个元素移到下标为0位置,在将下标为0的新元素执行“下沉”操作。如下图示例(注意,下图示例是小堆,不过原理是一样的,图片来自深入理解Java PriorityQueue)

完整代码实现

package priorityheap;import java.util.Arrays;/*** 优先队列类(最大优先队列)*/
public class PriorityHeap {// ------------------------------ Instance Variablesprivate int[] arr;private int size;// ------------------------------ Constructors/*** 优先队列数组默认大小为64*/public PriorityHeap() {this(64);}public PriorityHeap(int initSize) {if (initSize <= 0) {initSize = 64;}this.arr = new int[initSize];this.size = 0;}// ------------------------------ Public methodspublic int max() {return this.arr[0];}public int maxAndRemove() {int t = max();this.arr[0] = this.arr[--size];sink(0, this.arr[0]);return t;}public void add(int data) {resize(1);this.arr[size++] = data;pop(size - 1, data);}// ------------------------------ Private methods/*** key下沉方法*/private void sink(int i, int key) {while (2 * i <= this.size - 1) {int child = 2 * i;if (child < this.size - 1 && this.arr[child] < this.arr[child + 1]) {child++;}if (this.arr[i] >= this.arr[child]) {break;}swap(i, child);i = child;}}/*** key上浮方法*/private void pop(int i, int key) {while (i > 0) {int parent = i / 2;if (this.arr[i] <= this.arr[parent]) {break;}swap(i, parent);i = parent;}}/*** 重新调整数组大小*/private void resize(int increaseSize) {if ((this.size + increaseSize) > this.arr.length) {int newSize = (this.size + increaseSize) > 2 * this.arr.length ? (this.size + increaseSize) : 2 * this.arr.length;int[] t = this.arr;this.arr = Arrays.copyOf(t, newSize);}}/*** Swaps arr[a] with arr[b].*/private void swap(int a, int b) {int t = this.arr[a];this.arr[a] = this.arr[b];this.arr[b] = t;}
}

转载于:https://my.oschina.net/u/3345868/blog/1601000

Java优先队列 Priority Queue相关推荐

  1. C语言优先队列作用,C语言实现优先队列(priority queue)

    堆排序是一个比较优秀的算法,堆这种数据结构在现实生活中有很多的应用,比如堆可以作为一个优先队列来使用,作为一个高效的优先队列,它与堆的结构一样,都有最大优先队列,最小优先队列.优先队列priority ...

  2. 优先队列(priority queue)

    目录 一,优先队列 二,STL优先队列 三,二叉堆实现优先队列 四,二项堆实现优先队列 五,线段树实现优先队列 六,OJ实战 力扣 295. 数据流的中位数 一,优先队列 优先队列可以插入元素.查询最 ...

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

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

  4. 数据结构及算法基础--优先队列(Priority Queue)

    这真的是一个包含很多东西的数据结构.我们会逐步解析,来讲解优先队列: 首先知道什么是优先队列: 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除(first in, last ou ...

  5. C语言实现升序优先队列Ascending priority queue(附完整源码)

    实现升序优先队列Ascending priority queue node结构体 升序优先队列Ascending priority queue完整源码(定义,实现,main函数测试) node结构体 ...

  6. 高级数据结构(Ⅱ)优先队列(Priority Queue)

    高级数据结构(Ⅱ)优先队列(Priority Queue) 许多应用程序都需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序.很多情况下我们会收集一些元素,处理当前键值最大的元 ...

  7. java 优先队列 用法_优先队列的基本用法(java和c++)

    #include #define ll long long #define mod 1000000007 using namespace std; //熟悉一下优先队列的基本用法 int main() ...

  8. java 优先队列_优先队列Java

    java 优先队列 Every now and then we need to process items of a queue in a particular order. Priority que ...

  9. java 优先队列从小到大,优先队列(Java)

    优先队列(底层结构为最大堆) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 ...

最新文章

  1. Efficiency / Relative Efficiency and the Efficient Estimator
  2. python哪本好-最好的Python入门教材是哪本?
  3. SCIP习题 1.21(寻找最小因子)
  4. split函数python 未定义_Python之Split函数
  5. input python_python input 详解
  6. android 声音,同时播放声音Android
  7. 云程序备援--CAP
  8. Centos 安装新python
  9. IOS之学习笔记四(类的实现和对象和id)
  10. ios 表情符号 键盘_ios – 将键盘布局更改为表情符号
  11. Java entity 映射 Json大写字段方法
  12. 建立数据通道,解决IMX6边编码边解码的问题
  13. 父级fixed_父元素设置absolute,子元素设置fixed定位失效
  14. java espresso车架_Espresso UI自动化测试框架
  15. 如何在线翻译PDF文件
  16. SVN服务器迁移操作
  17. 用C语言实现打开一个网页
  18. oracle output语句,Oracle Returning 语句用法总结
  19. C语言设计模式(开头)
  20. R语言中的函数2:predict()

热门文章

  1. lnmp之PDO_mysql.so
  2. html 5 新增标签及简介
  3. 串口类QextSerialPort
  4. github (远端建立分支....配置见github 官网配置)
  5. 【转】两个算法题,感觉挺有意思
  6. Simple:Press
  7. SonicWall:速度修复这些严重的 SMA 100 漏洞
  8. Confluence 企业服务器正遭攻击
  9. Realtek WiFi SDK 被曝多个漏洞,影响供应链上至少65家厂商近百万台IoT设备
  10. 几个大厂及 RCE漏洞二三事