首页 > 编程语言 >优先级队列的实现详解( Java 实现)

优先级队列的实现详解( Java 实现)

时间:2023-05-28 11:34:38浏览次数:53  
标签:优先级 parent 队列 elem int 详解 child Java

前言

优先级队列是在队列的基础上,每个元素都带有一个优先级,可以实现按照优先级高低进行存储和访问。 Java 提供了许多实现优先级队列的方法,例如使用堆来实现。在本篇博客中,我将介绍 Java 实现优先级队列实现的具体方法,以及如何使用它来解决实际问题。

优先级队列的实现详解( Java 实现)_优先级队列

一、优先级队列的概念

优先级队列是一种特殊的队列数据结构,它可以根据元素的优先级进行排序,并且在队列操作中优先考虑元素优先级高的元素。与普通队列不同的是,当有新元素加入队列时,队列会自动将其插入到适当的位置,而不是排在队尾。当执行出队操作时,队列会先返回队列中优先级最高的元素,而不是最先加入的元素。优先级队列常常用于任务调度、事件处理等场景,也可以用来解决各种排序问题。------>通俗点来说就是优先级队列也是一个队列,只不过出队列时是出当前队列中最小的那个,因为在队列内部就已经从小到大排序排好了,直接出就完事儿了,但是库函数的优先级队列可以指定是升序还是降序,这个就是后话了。下篇博客详细介绍库函数实现优先级队列,大家点个三连+关注支持一下博主吧。优先级队列的实现详解( Java 实现)_线式堆的实现_02


二、优先级队列的实现( Java 实现)

我们自己实现优先级队列的话那方法就多了,只要你是让最小的先出来就行,比如快排啊,冒泡排序啊,堆排啊……等等都可以做到,但是这边考虑时间复杂度,优先使用堆排序,在数据足够多的情况下,堆排的时间复杂度最小,下面是我们要实现的所有方法,大家也可以先试着思考一下,再接着看博客会比较容易吸收,代码如下:

public class PriorityQueue {
    private int[] elem;// 建立一个线式堆
    private int usedSize;// 堆里实际的元素
    /* 构造方法 */
    public PriorityQueue() {
    }
    /* 初始化成小根堆 */
    public void createHeap(int[] array) {
    }
    /* 入队列,但还是要保持小根堆 */
    public void push(int val) {
    }
    /* 出队列,但仍然要保持小根堆 */
    public int pollHeap() {
    }
    /* 获取堆顶元素但不删除 */
    public int peekHeap() {
    }
    /* 将元素向上调整 */
    private void shiftUp(int child) {
    }
    /* 将元素向下调整 */
    private void shiftDown(int parent,int end) {
    }
}

2.1、构造方法和peekHeap

如上代码,你们觉得哪个代码最简单呢?一眼看过去,是不是就是构造方法和peekHeap方法最简单呀,

标签:优先级,parent,队列,elem,int,详解,child,Java
From: https://blog.51cto.com/bitzmbdp/6364890

相关文章

  • java XML字符串和bean实体类互转
    pom引入依赖<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.13.1</version></dependency>实体类p......
  • 用Java语言springboot框架开发工艺管理系统
    技术架构技术框架:SpringBoot2.0.0+Mybatis1.3.2+Shiro+jpa+lombok+Vue2+Mysql5.7+redis+nodejs16运行环境:jdk8+IntelliJIDEA+maven+宝塔面板宝塔部署教程回到IDEA,点击编辑器右侧maven图标,切换至prod,执行package,完成后就会在根目录里生成一个target目录,......
  • Java语言实现的springBoot汽车销售管理系统vue前端
    技术架构技术框架:springboot+mybatis+Mysql5.7+vue2+npm+node运行环境:jdk8+IntelliJIDEA+maven+宝塔面板宝塔部署教程解析一个域名,使用vscode打开front目录,修改/config/prod.env.js文件里的BASE_API字段为解析好的线上域名,执行npmrunbuild:prod打包出......
  • java 面试题目
    1:子类和父类的实例变量和方法有什么区别?2:重载和覆盖的区别,返回类型不同,可以重载吗?为什么?底层如何实现的?3:抽象类与接口的区别4:悲观锁和乐观锁5:线程安全的解决方法有哪些?读写锁6:hashcode和equals?7:java泛型8:ThreadLocal,Concurrent下面的包,原理?9:AtomicInteger原理是什......
  • 用Java语言和Springboot框架实现宿舍管理系统
    技术架构技术框架:SpringBoot+SpringMVC+MyBatis+Layui+Mysql5.7+Axios+Echarts+POI运行环境:jdk8+IntelliJIDEA+maven+宝塔面板宝塔部署教程回到IDEA,点击编辑器右侧maven图标,执行package,完成后就会在根目录里生成一个target目录,在里面会打包出一个jar文件......
  • java面试 关于红黑树
    红黑树(Red-BlackTree):是一种自平衡的二叉搜索树,它在实际的软件开发中广泛应用。红黑树的特点是具有高效的插入、删除和查找操作,并且保持树的平衡,以保证这些操作的时间复杂度为O(logn)。红黑树与AVL树有什么区别?红黑树和AVL树都是自平衡的二叉搜索树,但它们在维护平衡方......
  • 阅读《java并发编程实战》第五章
    阅读《java并发编程实战》第五章Semaphore的应用举例Semaphore的应用举例:实现一个固定大小的Set。当容器满了之后,无法add,线程阻塞。publicclassBoundedHashSet{//invariant:sizeofSetalwayslessthanorequaltogivensizeprivatefinalSet<Integer>s......
  • java面试 (12)- Valiolate原理?是线程安全的吗?
    1:导致线程问题的原因:抢占式执行多个线程同时修改了同一个变量非原子性操作内存可见性问题指令重排问题2:并发编程三大特性可见性原子性有序性3:volatile关键字3.1volatile解决了内存可见性和指令重排序的问题写volatile变......
  • Android 服务Service详解
    Android服务(Service)是一种在后台运行的组件,它可以在不与用户交互的情况下执行长时间运行的操作。服务通常用于在后台播放音乐、下载数据、执行网络操作等。服务的特点如下:1.服务是一种后台运行的组件,可以在不与用户交互的情况下执行长时间运行的操作。2.服务可以在应用程序的......
  • 1. java + react 实现 HRM
    1.云服务的三种方式1.1IAAS基础设施即服务,只会提供基础的设施,eg:服务器,网络等;1.2PAAS平台即服务,提供平台,可以把自己写好的代码部署到平台上;1.3SAAS软甲即服务eg:hrm,cms,crm等;提供所有的服务;【部署到互联网】;......