优先队列(最小优先队列)

前言

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级的,我们需要在这些计算机的任务中找出优先级最高的任务先执行,执行完毕后就需要把这个任务从队列中移除。普通的队列要完成这样的功能,需要每次遍历队列中的所有元素,比较并找出最大值,效率不是很高,这个时候,我们就可以使用一种特殊的队列来完成这种需求,优先队列

一、最小优先队列

最大优先队列基于堆的数据结构来实现,可以很方便的删除最小值

1、代码实现

package tree;/*** 最小优先队列*/
public class MinPriorityQueue<T extends Comparable<T>> {private T[] items;private int n;public MinPriorityQueue(int capacity) {// 默认数组的0 索引位置不存放元素items = (T[]) new Comparable[capacity + 1];n = 0;}public int size() {return n;}/*** 向队列中插入元素** @param t*/public void add(T t) {// 插入到数组末尾items[++n] = t;// 元素上浮swim(n);}/*** 删除队列中的最小元素** @return 返回删除最小的元素*/public T deleteMin() {T min = items[1];items[1] = items[n];items[n] = null;n--;sink(1);return min;}/*** 元素下沉*/private void sink(int k) {//条件:存在子节点while (2 * k <= n) {// 左子节点和右子节点中较小值值的索引值int biggerIndex = 0;// 存在右子节点,且右子节点较小,if (2 * k + 1 <= n && less(2 * k+1, 2 * k)) {biggerIndex = 2 * k + 1;} else {biggerIndex = 2 * k;}// 如果当前节点值大于 子节点中的较小值,交换值if (less(biggerIndex, k)) {exch(biggerIndex, k);k = biggerIndex;} else {break;}}}/*** 元素上浮*/private void swim(int k) {// 循环条件 存在父节点while (k / 2 >= 1) {// 如果当前节点小于父节点,交换值if (less(k, k / 2)) {exch(k, k / 2);k = k / 2;} else {break;}}}/*** 判断索引i处值是否小于索引j处值** @param i* @param j* @return*/private boolean less(int i, int j) {return items[i].compareTo(items[j]) < 0;}/*** 交换元素** @param i* @param j*/private void exch(int i, int j) {T temp = items[i];items[i] = items[j];items[j] = temp;}
}

2、测试用例

package tree;import org.junit.Test;import static org.junit.Assert.*;public class MinPriorityQueueTest {@Testpublic void deleteMin() {MinPriorityQueue<Integer> comparableMinPriorityQueue = new MinPriorityQueue<Integer>(10);comparableMinPriorityQueue.add(100);comparableMinPriorityQueue.add(99);comparableMinPriorityQueue.add(88);comparableMinPriorityQueue.add(77);comparableMinPriorityQueue.add(200);comparableMinPriorityQueue.add(250);comparableMinPriorityQueue.add(244);comparableMinPriorityQueue.add(311);int size = comparableMinPriorityQueue.size();for (int i = 0; i < size - 1; i++) {System.out.println(comparableMinPriorityQueue.deleteMin());}}
}

3、控制台输出

77
88
99
100
200
244
250

优先队列(最小优先队列)相关推荐

  1. 最小堆实现最小优先队列

    最小优先队列的可以实现的操作: insert,插入一个元素 min,找到最小的元素 extract-min,去掉最小的元素并返回最小的元素 increase-key,增加一个关键字的值 优先队列的形式 ...

  2. 最小堆以及最小优先队列的实现

    最小堆的实现 什么是最小堆 构建最小堆 MIN_HEAPITY的实现 MIN_HEAPIFY的时间复杂度分析 BUILD_MIN_HEAP的实现 建最小堆的时间复杂度分析 什么是最小堆 最小堆从逻辑上 ...

  3. 利用二叉堆实现最小优先队列

    利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...

  4. 数据结构之优先队列:优先队列的介绍与基础操作实现,Python代码实现——14

    优先队列(Priority queue)的介绍 优先队列是计算机中一种抽象的数据结构类,它有着一个类似和队列或者堆的结构,但是其中每个元素额外有一个优先级别 在一个优先队列中,一个高优先顺序的元素会先 ...

  5. python 优先队列_Python 优先队列

    Python 优先队列,优先队列是一个容器数据结构,使用具有全序关系的键(例如用数值表示的权重)来管理元素,以便快速访问容器中键值最小或最大的元素. 优先队列可被视为队列的改进版,其中元素的顺序不是基 ...

  6. 2-5 修理牧场【优先队列/最小堆】

    2-5 修理牧场 (35分) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i​​ 个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是L​i​​ ...

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

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

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

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

  9. stl库的使用——队列queue和优先队列和优先队列小根堆(全家桶哎)

    其实实现队列蛮简单的,但敌不过人懒~ 于是stl库中就有了专门实现队列的函数#include<queue> 这里讲解下queue常用的几个操作 1.q.push(),向队列中插入元素 2. ...

最新文章

  1. 重返学术界!​微软全球执行副总载沈向洋加盟清华大学!招收计算机视觉图形学博士生...
  2. 关于程序为什么要代码段,程序段
  3. php扩展memcached和memcache的安装配置方法
  4. spring 导出csv_Spring批处理CSV处理
  5. 【职场】高薪的条件你满足几条?
  6. opensource项目_最佳Opensource.com:访谈
  7. 使用Web API ASP.NET Core 2.2部署Angular 8应用程序
  8. C#学习笔记(三):值类型、引用类型及参数传递
  9. python使用 urllib.unquote乱码的原因
  10. 手把手刷数据结构-3.手把手刷二叉树算法1
  11. 互补品的需求曲线图_供给曲线和需求曲线的解析
  12. 在ubuntu20.04中安装MATLAB时常见问题及解决方法
  13. Python 同时插入两张图片在同一页PPT,并循环多张图片
  14. Intel XEON L/E/X/W 系列的区别
  15. 用python对excel进行单元格操作
  16. python写股票指标_python写股票指标
  17. 输出 2~n之间所有素数,并求和,n由键盘输入。素数是只能被1和自身整除的整数。要求编写函数判断自然数x是否为素数
  18. 嵌入式开发用到的一些工具
  19. 在 React JS 中使用 JSON 占位符的Web 简易应用程序
  20. CStdioFile 写文件

热门文章

  1. 恢复视力的辅助训练方法
  2. 最新发布!SMOKE 单目3D目标检测,代码开源!
  3. C# 打印Label的两种方式及实现
  4. linux命令-文件目录管理
  5. 【C#+Access+WindowsAPI】实现仿360的安全卫士 六:实用工具集合讲解(附源码和资源)
  6. python Name Entity Recognition(NER) extract company name 命名实体识别 提取公司名
  7. 东软始业教育结业考试2022年7月28日
  8. 保存联系人和手机号到电话本
  9. java实现简单电话本
  10. Midjourney 使用总结