优先级队列,顾名思义,和传统“先进后出”的队列相比,优先级队列在元素加入时就根据该元素的优先级插入到相应位置。实际上优先级队列PriotyQueue在poll时还是遵循先进后出,只是数据在进入时已经根据优先级排序了。实现优先级队列需要实现一个Comparator,测试代码如下:

public class PriotyQueueTest {
    //比较器,用于判断两个元素的优先级Comparator<Man> t = new Comparator<Man>() {@Overridepublic int compare(Man o1, Man o2) {if(o1.getAge() == o2.getAge())return 0;if(o1.getAge() > o2.getAge())return 1;return -1;}};Queue<Man> queue = new PriorityQueue<Man>(11,t);
    //将给定数组添加到优先级队列中public void add(int[] nums){for(int i = 0 ; i < nums.length ; i++)queue.add(new Man(String.valueOf(i),nums[i]));}
    //打印函数public void print(){while(queue.peek()!=null){System.out.println(queue.poll().getAge()+" ");}System.out.println();}public static void main(String[] args) {int[] test = new int[]{5,4,2,3,1};PriotyQueueTest q = new PriotyQueueTest();q.add(test);q.print();}
}
//测试实体类
class Man{private String name;private int age;public Man(String name,int age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

让我好奇的是,这里的add( )函数中究竟发生了什么?我们把这部分源代码拿出来review一下:

 private void siftUpUsingComparator(int k, E x) {while (k > 0) {int parent = (k - 1) >>> 1;<span style="white-space:pre">      </span>//下标右移一位,相当于除2Object e = queue[parent];<span style="white-space:pre">     </span>//得到父节点if (comparator.compare(x, (E) e) >= 0)<span style="white-space:pre">   </span>//比较,如果优先级大于父节点则停止向上搜索break;queue[k] = e;k = parent;}queue[k] = x;}

从上面的代码我们可以看到:

1、Queue是基于对象数组实现的,并抽象成树结构;

2、这里的比较器的含义是:直到优先级小于待插元素时停止搜索;

3、删除的时间复杂度为O(1),插入的时间复杂度为O(n)

Java优先级队列PriotyQueue相关推荐

  1. Java 优先级队列

    文章目录 Java 优先级队列 PriorityQueue简介 继承关系 PriorityQueue示例 Comparable比较器 Comparable接口 Comparator比较器 Compar ...

  2. java优先级队列使用

    优先级队列是比栈和队列更专用的结构,在多数情况下都非常有用.优先级队列像普通队列一样,有一个队头和队尾,并且也是从队头移除数据. 优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适 ...

  3. Java优先级队列PriorityQueue

    1.优先级队列概述 PriorityQueue,即优先队列.优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素).这里牵涉到了大 ...

  4. 什么是java优先级队列_什么是Java优先级队列(Priority Queue)?

    39 优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索.无论何时调用remove方法,总会获得当前优先级队列中的最小元素,但并不是对所有元素都排序.它是采用了堆(一个可以自我调整 ...

  5. java优先级队列(堆)

    文章目录 一.优先级队列是什么? 二.堆 什么是堆? 堆的分类: 堆的存储 堆的创建 三.堆的操作 插入元素 弹出元素 四.用堆模拟实现优先级队列 一.优先级队列是什么? 在数据结构中,普通的队列是先 ...

  6. java 链表 最小堆优先级队列_关于Java集合的小抄

    List ArrayList 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值.默认第一次插入元 ...

  7. java集合——队列和双端队列+优先级队列

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合--队列和双端队列+优先级队列 的相关知识: 0.2) for full sou ...

  8. java队列优先级_优先级队列-Java的PriorityQueue与最小堆有何不同?

    来自Java文档 表示为平衡二进制堆的优先级队列:queue [n]的两个子级是queue [2 * n + 1]和queue [2 *(n + 1)]. 优先级队列由比较器或元素的自然顺序进行排序. ...

  9. Java中的PriorityQueue优先级队列

    以前的博客中介绍过队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,此时出队列时需要优先级高的元素先出队列,这个时候传统的队列显然不能胜任,Java中有一个新的实现类继 ...

  10. java 中PriorityQueue优先级队列使用方法

    1.前言 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果想实现按照自己的意愿进行优 ...

最新文章

  1. 专属程序员的编程日历,终于来了 | 10月书讯
  2. https原理:证书传递、验证和数据加密、解密过程解析 (转)
  3. HTML常见标签总结
  4. [Unity] 战斗系统学习 2:FlowCanvas 中的 SubGraph
  5. 中孚计算机保密玩游戏,中孚计算机保密检查
  6. 思科cisco模拟器路由器的基础配置
  7. 重启linux系统后 启动mysql ERROR! The server quit without updating PID file /var/run/mysqld/mysqld.pid
  8. vue3.0项目打包后,由于vender.js 文件过大引起的首页加载时间缓慢的解决方式
  9. 音频文件按照正常语句,断句拆分的处理方法
  10. 为啥女性洗澡都很慢,究竟在干啥?
  11. 删除word标题前方空格的方法
  12. STM32F407配置PLLI2SCLK实现特定50MHz时钟驱动83848
  13. Fastapi swagger-ui.css 、swagger-ui-bundle.js 无法加载
  14. 让其他局域网电脑也可以访问本机的NAT虚拟机
  15. 在MySQL表中查询出所有包含emoji符号的数据
  16. 19 个强大、有趣、又好玩的 Linux 命令!
  17. 华硕品牌笔记本电脑一键u盘启动详细图文教程
  18. Eclipse中,代码没错,但有红叉叉
  19. EBS功能_PO匹配审批层总结
  20. Proe Creo 二次开发之模型装配--缺省与坐标系

热门文章

  1. vue实现显示实时时间
  2. 练习二 编程基础(强化)编程题2. 铺地砖
  3. 流量回放-SandboxRepeater
  4. PAT 乙级练习 1055 集体照
  5. 推荐系统笔记2019
  6. STM32————复用功能按键输入(一键多用)
  7. Android开发的常见报错
  8. 常见的 4 种HTML5错误用法,你用错了几个
  9. Google nacl sdk
  10. 数据集笔记:杭州 上海 地铁客流数据