Java优先队列 priority queue

 更新时间:2022年01月25日 11:48:47   作者:L-M-Y  
本文主要介绍了Java优先队列 priority queue,优先队列是一种特殊的数据结构队列中每一个元素都被分配到一个优先权值,出队顺序按照优先权值来划分。一般有两种出队顺序高优先权出队或低优先权出队,想了解具体内容的小伙伴可以参考下文内容,希望对你有所帮助

1.优先队列概念

优先队列(priority queue)是一种特殊的数据结构。
队列中每一个元素都被分配到一个优先权值,出队顺序按照优先权值来划分
一般有两种出队顺序:高优先权出队低优先权出队
priority queue至少要有两个最基本的ADT:进队出队(按照高优先权或低优先权)

产生原因:同样是为了提高数据处理的效率。试想,要实现优先队列对应的功能,若使用链表或者数组,那么要么先排序再插入,要么先插入再查找最大最小元素。这样一来,入队出队的时间复杂度至少为O(N)。

  • 优先队列出队和入队的时间复杂度均为O(log N)。
  • 优先队列基于二叉堆实现。

2.二叉堆(Heap)

堆是一种特殊的二叉树,性质如下:

  • 每个结点的值都大于或等于其左右孩子结点的值(大顶堆),或每个结点的值都小宇或等于其左右孩子的值(小顶堆)。
  • 必须满足完全二叉树的结构。

完全二叉树和满二叉树

完全二叉树 complete binary tree

叶节点只可能出现在最后两层,且最后一层的叶节点都左对齐
一棵深度为h的完全二叉树

满二叉树 full binary tree

深度为h的满二叉树有(2^h)-1个结点

由二叉堆的定义可以看出,跟结点一定是二叉堆中结点值最大(或最小)的。较大(或较小)的结点靠近根节点

堆的存储结构:

一般情况下,堆用数组来存储,第i个结点的父节点的下标就是(i-1)/2.
如果用层序遍历顺序将大顶堆和小顶堆存入数组,

则关系如图:

堆的重要操作

插入:插入一个元素之后,新元素首先被插入表层(即最后一层尽可能左边的位置),之后再根据堆的性质进行调整。

例:写出一次一个地将10,12,1,14,6,5,8,15,3,9,7,4,11,13和2插入一个初始为空的二叉堆的结果

删除:删除总是发生在根处,之后将最后一个元素(即最后一层最右边的元素)拿来填补空缺,之后根据堆的性质进行调整堆的结构。

到此这篇关于Java优先队列 priority queue的文章就介绍到这了,更多相关优先队列 priority queue内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis-Plus中IdType.AUTO局部配置不生效的问题解决

    Mybatis-Plus中IdType.AUTO局部配置不生效的问题解决

    本文主要介绍了Mybatis-Plus中IdType.AUTO局部配置不生效的问题解决,数据库插入数据时,id的默认生成方式还是雪花算法,局部配置没有生效,下面就来解决一下,感兴趣的可以了解一下
    2023-09-09
  • 如何使用MyBatis Plus实现数据库curd操作

    如何使用MyBatis Plus实现数据库curd操作

    MyBatis-Plus是一个MyBatis 的增强工具,在MyBatis,的基础上只做增强不做改变,为简化开发、提高效率而生。 这篇文章主要介绍了MyBatis Plus实现数据库curd操作,需要的朋友可以参考下
    2021-09-09
  • SpringBoot瘦身打包部署的实现

    SpringBoot瘦身打包部署的实现

    这篇文章主要介绍了SpringBoot瘦身打包部署的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • java学习指南之字符串与正则表达式

    java学习指南之字符串与正则表达式

    在日常Java后端开发过程中,免不了对数据字段的解析,自然就少不了对字符串的操作,这其中就包含了正则表达式这一块的内容,下面这篇文章主要给大家介绍了关于java学习指南之字符串与正则表达式的相关资料,需要的朋友可以参考下
    2023-05-05
  • Java基于TCP协议的Socket通信

    Java基于TCP协议的Socket通信

    本文详细讲解了Java基于TCP协议的Socket通信,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Java中的迭代和递归详解

    Java中的迭代和递归详解

    这篇文章主要给大家介绍了关于Java中的迭代和递归,文章显示分别介绍了Java中的迭代和递归,而后又介绍了迭代和递归的区别以及数形递归的相关内容,文中介绍的很详细,相信会对大家学习具有一定的参考借鉴价值,有需要的朋友们可以参考借鉴。
    2016-11-11
  • java冒泡排序和选择排序示例

    java冒泡排序和选择排序示例

    这篇文章主要介绍了java冒泡排序和选择排序示例,需要的朋友可以参考下
    2014-05-05
  • 基于SpringBoot构建电商秒杀项目代码实例

    基于SpringBoot构建电商秒杀项目代码实例

    这篇文章主要介绍了基于SpringBoot构建电商秒杀项目代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java调用.dll文件的方法

    Java调用.dll文件的方法

    因为项目的需求,要在JAVA项目中调用Windows的Dll(动态链接库)文件,之前用Jni调用过C写的Dll文件,比较麻烦,这里不多说,网上也有很多这方面的文档。在网上找到一个开源的组件JNative,使用后感觉比较方便
    2013-04-04
  • IDEA连接MySQL提示serverTimezone的问题及解决方法

    IDEA连接MySQL提示serverTimezone的问题及解决方法

    很多朋友私聊小编,使用IDEA软件连接MySQL数据库时总是提示Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.的错误,小编就不一一回复大家了,下面小编把我的解决方法分享到脚本之家平台,需要的朋友参考下吧
    2021-05-05

最新评论