Java实现优先级队列(堆)

前言

在学习完二叉树的相关知识后,我们对数据结构有了更多的认识,本文将介绍到优先级队列(堆)

1.优先级队列

1.1概念

前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适,对此数据结构应该提供两个最基本的操作,一个是返回最高优先级对象一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)

1.2模拟实现

JDK1.8中的PriorityQueue底层使用了堆这种数据结构,而堆实际就是在完全二叉树的基础上进行了一些调整

2.堆

2.1概念

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆 


2.2性质 

1.堆中某个节点的值总是不大于或不小于其父节点的值
2.堆总是一棵完全二叉树

2.3堆的存储方式

根据堆的概念以及性质,我们可以根据层序的规则采用顺序的方式来高效存储

注意:对于非完全二叉树,则不适合使用顺序方式进行存储,因为为了能够还原二叉树,空间中必须要存储空节点,就会导致空间利用率比较低

根据我们对二叉树性质的学习,有一下性质:

如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为 (i - 1)/2
如果2 * i + 1 小于节点个数,则节点i的左孩子下标为2 * i + 1,否则没有左孩子
如果2 * i + 2 小于节点个数,则节点i的右孩子下标为2 * i + 2,否则没有右孩子

2.4堆的创建 

我们以集合{ 27,15,19,18,28,34,65,49,25,37 }中的数据为例,建堆

按照二叉树的顺序排列发现,根子树已经为堆的结构,只需将根节点向下调整即可

2.4.1向下调整

以大根堆为例

    private void swap(int i,int j){int tmp=elem[i];elem[i]=elem[j];elem[j]=tmp;}//大根堆/*时间复杂度为从根一路比较到叶子,比较的次数为完全二叉树的高度,O(log2 n)*/public void siftDown(int parent,int end){int child=parent*2+1;//先标记左孩子,因为可能该树没有右孩子while(child<end) {if (child + 1 < end && elem[child] < elem[child + 1]) {//假如右孩子存在,找到其中较大的孩子child++;}//找到了最大的子孩子if (elem[child] > elem[parent]) {//若孩子比双亲大,进行交换,同时继续向下调整swap(child, parent);parent = child;child = 2 * parent + 1;} else {//若双亲大,则满足堆的特性,即跳出循环break;}}}

注意:在调整以parent为根的二叉树时,必须要满足parent的左子树和右子树已经是堆了才可以向下调整

2.4.2堆创建

但是当二叉树中,子树不满足堆时,该如何建堆呢?

这里,我们找到第一个非叶子节点,从该节点开始往前一直到根节点,遇到一个节点,向下调整

    public void creatHeap(){for (int parent = (usedSize-1-1/2); parent >=0 ; parent--) {siftDown(parent,usedSize);}}

2.5堆的插入与删除 

 2.5.1插入

堆的插入总共需要两个步骤:
1. 先将元素放入到底层空间中(注意:空间不够时需要扩容)
2. 将最后新插入的节点向上调整,直到满足堆的性质

//以大根堆为例public void siftUp(int child){int parent=(child-1)/2;while(parent>=0){if(elem[child]>elem[parent]){swap(child,parent);child=parent;parent=(child-1)/2;}else{break;}}}

2.5.2删除

注意:堆的删除一定删除的是堆顶元素
1. 将堆顶元素对堆中最后一个元素交换
2. 将堆中有效数据个数减少一个
3. 对堆顶元素进行向下调整
 

  public boolean isFull(){return usedSize==elem.length;}public int poll(){if(isEmpty()){return -1;}int old=elem[0];swap(0,usedSize-1);usedSize--;siftDown(0,usedSize-1);return old;}public boolean isEmpty(){return usedSize==0;}

2.6模拟实现优先级

public class Test {public static void main(String[] args) {int[] array = {25, 56, 21, 45, 75};TestHeap testHeap = new TestHeap();testHeap.init(array);testHeap.creatHeap();testHeap.heapSort();}
}

 如果上述内容对您有帮助,希望给个三连谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode做题记录 3011(计算二进制中一的个数)3012

3011. 判断一个数组是否可以变为有序 [题目的“有序”等价于“升序”] 思考 题目要求两个相邻元素在二进制下数位为1的数目相同才可以交换&#xff0c;那就要判断1相同的一块是否是按顺序排序的。从大到小和从小到大都测试一遍。找到一块中最大的和最小的&#xff0c;放在sta…

Android 车载应用开发概述

前言 介绍 Android 车载应用开发 文章目录 前言一、Android Automotive OS 概述二、Android Automotive OS 架构三、常见的车载应用1、系统应用1&#xff09;SystemUI是什么开发工作 2&#xff09;Launcher是什么开发工作 3&#xff09;Settings是什么开发工作 4&#xff09;多…

使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题

环境&#xff1a;python3.8.10 uc的安装方法&#xff1a; pip38 install undetected-chromedriver 上测试代码&#xff1a; import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://www.baidu.com) driver.save_screenshot(baidu.png)报错&#xff…

【结构型模式】组合模式

一、组合模式概述 组合模式的定义与意图&#xff1a;将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。&#xff08;对象结构型&#xff09; 组合模式分析&#xff1a; 1.当容器对象的某一个方法被调用时&#xff0c;将遍…

算法|基础算法|高精度算法

基础算法|位运算 1.高精度加法 2.高精度减法 3.高精度乘法 4.高精度除法 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 高精度加法 …

【C++学习】map和set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set 4.1 set的介绍 4.2 set的使用 4.2.1 set的模板参数列表 4.2.2 set的构造 4.2.3 set的容量 4.2.4 set修改操作 4.2.5 set的使用举例 五、map 5.1 map的介绍 5.2 map的使用 5.2.1 map的模板参数说…

7.C++:多态

一、 virtual关键字 //1.可以修饰原函数&#xff0c;为了完成虚函数的重写&#xff0c;满足多态的条件之一&#xff1b; //2.可以在菱形继承中&#xff0c;完成虚继承&#xff0c;解决数据冗余和二义性&#xff1b; 两个地方使用同一关键字&#xff0c;但二者间没有一点关联 二…

淘宝扭蛋机小程序开发:开启购物娱乐新纪元

在数字时代浪潮的推动下&#xff0c;小程序作为新兴的交互平台&#xff0c;正在不断引领着购物方式的革新。淘宝扭蛋机小程序的开发&#xff0c;便是这一变革中的一颗璀璨明星&#xff0c;它将传统扭蛋机的趣味与电商购物的便捷完美融合&#xff0c;为用户带来了前所未有的购物…

Python+人工智能

Python人工智能 一、Python基础语法 涵盖Python基础知识&#xff0c;让大家掌握基础的编程能力 Python注释 单行注释&#xff1a;#注释内容多行注释&#xff1a;‘’‘注释内容’‘’ 变量和数据类型 变量 变量就是用来存储数据的。赋值变量时不需要指定数据类型&#xff0c;…

【R: mlr3:超参数调优】

本次分享官网教程地址 https://mlr3book.mlr-org.com/chapters/chapter4/hyperparameter_optimization.html 型调优 当你对你的模型表现不满意时&#xff0c;你可能希望调高你的模型表现&#xff0c;可通过超参数调整或者尝试一个更加适合你的模型&#xff0c;本篇将介绍这些操…

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息&#xff1a; 发表于&#xff1a;IEEE TRANSACTIONS ON MULTIME…

【Redis 神秘大陆】006 灾备方案

六、Redis 灾备方案 6.1 存储方案 6.1.1 基础对比 RDB持久化AOF持久化原理周期性fork子进程生成持久化文件每次写入记录命令日志文件类型二进制dump快照文件文本appendonly日志文件触发条件默认超过300s间隔且有1s内超过1kb数据变更永久性每秒fsync一次文件位置配置文件中指…

政安晨:【深度学习神经网络基础】(十)—— 反向传播网络中计算输出节点增量与计算剩余节点增量

目录 简述 二次误差函数 交叉熵误差函数 计算剩余节点增量 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xf…

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…

计算机网络 TCP/IP体系 物理层

一. TCP/IP体系 物理层 1.1 物理层的基本概念 物理层作为TCP/IP网络模型的最低层&#xff0c;负责直接与传输介质交互&#xff0c;实现比特流的传输。 要完成物理层的主要任务&#xff0c;需要确定以下特性&#xff1a; 机械特性&#xff1a;物理层的机械特性主要涉及网络…

华为春招内幕:2024年最全Spring Dependency Injection面试题大全,深入掌握DI技术!99%的应聘者都推荐收藏!

在2024年&#xff0c;随着软件开发领域对高效和灵活的编程实践的需求日益增长&#xff0c;依赖注入&#xff08;DI&#xff09;作为一种关键的设计模式&#xff0c;在现代软件开发中扮演着至关重要的角色。华为&#xff0c;作为全球领先的技术创新公司&#xff0c;对其软件工程…

【Altium Designer 20 笔记】PCB层

Top Overlay & Bottom Overlay (顶部丝印层和底部丝印层)&#xff1a; 用于标记元件、连接和其他重要信息。丝印层是 PCB 表面的一层&#xff0c;上面印上文字、图标或标记。 Top Solder & Bottom Solder (顶部阻焊层和底部阻焊层)&#xff1a; 阻焊层、开窗层、绿油层…

Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 起步依赖3. 自动配置3.1 JacksonPrope…

K8S认证工程师(CKA)考试速通经验分享(含答案)

昨天参加了Linux Foundation推出的Certified Kubernetes Administrator(CKA)考试&#xff0c;今天收到邮件通知通过啦&#xff5e;分数是93/100分 证书这个样子 ➡️随着应用现代化成为IT/互联网行业大趋势&#xff0c;企业的系统架构逐渐向微服务、容器化转型&#xff0c;好处…

并行计算基础以及相关C语言API介绍

并行计算概念 并行计算是一种利用多个计算资源&#xff08;如多个处理器、计算单元或计算机集群&#xff09;同时执行多个计算任务的方法&#xff0c;旨在提高计算机系统的处理能力和效率。它通过将原始计算任务分解为多个子任务&#xff0c;让多个处理单元同时执行这些子任务…