数据结构---优先队列

news2024/11/28 5:50:50

优先队列

  • 实现方式
    • 入队
    • 出队
  • JAVA实现
  • 总结

二叉堆是实现优先队列的基础,上一篇二叉堆博文: 二叉堆

队列的特点是先进先出(FIFO)。
优先队列不再遵循先入先出的原则,而是分为两种情况。

  1. 最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
  2. 最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队

最大优先队列
在这里插入图片描述

实现方式

可以用最大堆来实现最大优先队列,这样的话,每一次入队操作就是堆的插入操作,每一次出队操作就是删除堆顶节点。

入队

入队就是在数组末尾加上入队元素,在调用最大堆上浮函数,把这个数字上浮到合适的位置
在这里插入图片描述
在这里插入图片描述

出队

出队就是把数组第一个元素取出,在把数组末尾的元素填到第一个位置,在调用最大堆下沉函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉堆节点“上浮”和“下沉”的时间复杂度都是O(logn),所以优先队列入队和出队的时间复杂度也是O(logn)!

JAVA实现

package dataStructure.myPriorityQueue;

import java.util.Arrays;

//最大优先队列
public class priorityQueue {
    private int size;
    private int[] array;

    public priorityQueue() {
        //优先队列初始长度为32
        array = new int[32];
    }

    /**
     * 上浮(入队)
     */
    private void upAdjust(){
        //都是从数组最后一个位置(size-1;)入队
        int childIndex = size-1;
        int parentIndex = (childIndex-1)/2;
        // temp 保存插入的叶子节点值,用于最后的赋值
        int temp = array[childIndex];
        //最大堆(最大优先队列)
        while (childIndex>0&&temp>array[parentIndex]){
            array[childIndex] = array[parentIndex];
            childIndex = parentIndex;
            parentIndex = parentIndex/2;
        }
        array[childIndex] = temp;
    }

    /**
     * 下沉(出队)
     */
    private void downAdjust(){
        // temp 保存父节点的值,用于最后的赋值
        //删除的是根节点(最大值出队)
        int parentIndex = 0;
        int temp = array[parentIndex];
        //左孩子下标
        int childIndex = 1;
        while (childIndex<size){
            // 如果有右孩子,且右孩子大于左孩子的值,则定位到右孩子
            //需要从左右孩子找最大的(最大堆)
            if(childIndex+1<size&&array[childIndex+1]>array[childIndex]){
                childIndex++;
            }
            // 如果父节点大于任何一个孩子的值,直接跳出(已经是最大堆了)
            if(temp>=array[childIndex]){
                break;
            }
            array[parentIndex] = array[childIndex];
            //再向下找
            parentIndex = childIndex;
            childIndex = 2*childIndex+1;
        }
        array[parentIndex] = temp;
    }
    /**
     * 队列扩容
     */
    private void resize(){
        int newSize = this.size*2;
        this.array = Arrays.copyOf(this.array,newSize);
    }

    /**
     * 入队
     * @param key   入队的值
     */
    public void enQueue(int key){
        if(size>=array.length){
            resize();
        }
        //数组最后一个位置入队
        array[size++] = key;
        //再进行堆上浮
        upAdjust();
    }

    public int deQueue() throws Exception{
        if (size<0){
            throw new Exception("空的最大优先队列,出队失败");
        }
        //获取堆顶元素
        int head = array[0];
        //把最后一个元素移动到堆顶
        array[0] = array[--size];
        //堆下沉
        downAdjust();
        return head;
    }

    public static void main(String[] args) throws Exception {
        priorityQueue priorityQueue = new priorityQueue();
        priorityQueue.enQueue(3);
        priorityQueue.enQueue(5);
        priorityQueue.enQueue(10);
        priorityQueue.enQueue(10);
        priorityQueue.enQueue(2);
        priorityQueue.enQueue(7);
        System.out.println("最大优先队列出队:"+priorityQueue.deQueue());
    }

}

在这里插入图片描述

总结

优先队列分为最大优先队列和最小优先队列。

  1. 在最大优先队列中,无论入队顺序如何,当前最大的元素都会优先出队,这是基于最大堆实现的。
  2. 在最小优先队列中,无论入队顺序如何,当前最小的元素都会优先出队,这是基于最小堆实现的

二叉堆是一种特殊的完全二叉树,分为最大堆和最小堆。

  1. 在最大堆中,任何一个父节点的值,都大于或等于它左、右孩子节点的值。
  2. 在最小堆中,任何一个父节点的值,都小于或等于它左、右孩子节点的值。

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

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

相关文章

Ansible 服务器主机配置

使用 ansible 来对远程主机进行部署的话。我们需要首先对远程主机进行配置。 配置文件路径 配置文件位于&#xff1a;/etc/ansible/hosts 路径下面。 可以使用 vi 工具进行打开。 配置示例 下面是一个简单的配置示例。 [db]127.0.0.1[app]127.0.0.1 ansible_connections…

关于Playwright Xpath找不到元素问题解决方案

今日像往常进行xpath定位元素 发现代码里定位不出来 所以我就手动修改定位xpath 最后怎么修改都获取不到 返回None 那我就向上找 找到他的外祖母 最后进行inner_html() 发现元素是存在的 没有任何问题 这里我就又更加怀疑自己定位出错 折腾了半天发现定位不出来 于是我放弃了…

目标检测算法——车辆牌照识别数据集汇总 2(附下载链接)

&#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余收集整理了一批车辆牌照识别数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388; 目录 一、伊朗车牌数据集 &#x1f384;&#x1f3…

【目标跟踪】光流法运动视频跟踪【含Matlab源码 1357期】

⛄一、光流场简介 1 案例背景 运动视觉研究的内容是如何从变化场景中的一系列不同时刻的图像中提取有关场景中物体的形状、位置和运动的信息。根据研究的方法&#xff0c;它可以分为两类&#xff1a;基于特征的方法和基于光流场的方法。基于特征的方法抽取特征点&#xff0c;是…

傻白探索Chiplet,Chiplet面临的挑战之互连和封装(四)

目录 一、互连技术 二、封装技术 &#xff08;1&#xff09;英特尔 &#xff08;2&#xff09;台积电 三、生产流程 四、软件技术 实施Chiplet技术面临的主要挑战包括&#xff1a; 互连技术。Chiplet技术需要开发新型互连技术&#xff0c;以便将小芯片组合在一起。目前&a…

51单片机模块化编程

模块化 传统方式编程&#xff1a;所有的函数均放在 main.c 里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的代码&#xff0c;不利于代码的组织和管理&#xff0c;而且很影响编程者的思路。 模块化编程&#xff1a;把各个模块的代码放在不同的 .c 文件里…

FL Studio21新版终于有内置的强大混响插件了

FL Studio 21新版终于有内置的强大混响插件了FL Studio 21新版不光如此&#xff0c;还增加很多官方主题&#xff0c;并内置了多款可选&#xff0c;满足大家对个性化的需求&#xff01; 而且每一个人都能快速地创建属于自己的主题&#xff0c;彰显你的与众不同&#xff01; 一分…

JavaScript(五):函数、作用域

JavaScript函数函数的基本使用return返回语句arguments的使用函数的两个案例作用域函数的基本使用 1.函数声明 格式&#xff1a; function 函数名(){ 函数体代码 } function是声明函数的关键字&#xff0c;必须小写 2.函数调用 函数名(); 调用的时候不要忘记加小括号函数如果…

【数据分析】大型ADCP数据集的处理和分析(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

猿如意中的【Sublime Text Build 3211】开发工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 2.3 如何在猿如意中下载Sublime Text Build 3211&#xff1f; 三、Sublime Text Build 3211介绍 四、软件安装过程 五、软件界面 六、Sublime Text Build 3…

redis7知识点总结

文章目录1. redis单线程为啥会这么快2. redis数据类型和底层存储结构2.1 string类型2.1.1 SDS2.2 hash类型2.3 list类型2.4 set类型&#xff08;集合&#xff09;2.5 zset类型&#xff08;有序集合&#xff09;2.6 ziplist压缩列表2.7 listpack2.8 quicklist-快速列表2.9 skipl…

马士兵-郑金维—并发编程—6.并发集合

一、ConcurrentHashMap 1.1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1.8中是以CAS+synchronized实现的线程安全 CAS:在没有hash冲突时(Node要放在数组上时) synchronized:在出现hash冲突时(Node存放的位置已经有数据了) 存储的结构:…

DBCO-PEG3-NHS ester,2163772-16-3,二苯并环辛炔-三聚乙二醇-琥珀酰亚胺酯

英文名称&#xff1a;DBCO-PEG3-NHS ester 中文名称&#xff1a;二苯并环辛炔-三聚乙二醇-琥珀酰亚胺酯 CAS&#xff1a;2163772-16-3 分子式&#xff1a;C32H35N3O9 分子量&#xff1a;605.64 纯度&#xff1a;>95% 外观&#xff1a;浅黄色半固态 储存条件&#xff…

互联网企业的逆向奔赴,京东调集首批1000余名快递小哥陆续抵达北京

在每一次苦难来临的时刻&#xff0c;逆行者的背影&#xff0c;总是让人倍感温暖。   在疫情依然肆虐的当下&#xff0c;更是如此。   那些义无反顾地奔赴疫情最前线的逆行者们&#xff0c;总是在用血肉之躯守护着我们的生活冷暖。如果一定要寻找这些逆行者当中最美的那一抹…

SDK JDBC多种方式接入AZURE SQL DATABASE JAVA版

本文阐述使用JDBC接入AZURE SQL 数据库 笔者认为AZURE云上的AZURE SQL和SQL SERVER是很相似的&#xff0c;在普通的账号密码情况下JDBC字符串都是一致的。 下来全部说明官方的多种连接方式&#xff0c;参考官方&#xff1a; https://learn.microsoft.com/zh-cn/sql/connect/jdb…

Post-GWAS: single-cell disease relevance score (scDRS) 分析

1、scDRS的计算原理如下所示&#xff1a; 图片来源&#xff1a;Zhang M J, Hou K, Dey K K, et al. Polygenic enrichment distinguishes disease associations of individual cells in single-cell RNA-seq data[R]. Nature Publishing Group, 2022. 2、通过scDRS分析可以得到…

XDisplay 安装教程

Splashtop Wired XDisplay 安装教程1. 概述2. Splashtop XDisplay 详细安装教程2.1 下载 Splashtop XDisplay2.2 电脑上安装 Splashtop XDisplay2.3 iPad安装 Splashtop XDisplay3. 遇到的问题3.1 下载 iTunes3.2 安装 iTunes3.3 打开 iTunes3.4 同意许可协议4. iPad连接Window…

学会用这个键,Word做得比领导还整齐, 早早下班不是梦

大家比较常用到哪些快捷键呢&#xff1f;快捷键用得熟练&#xff0c;工作效率可是会大大提高的。下面介绍4类常用的Word快捷键&#xff0c;希望能够帮到你&#xff0c;大家一起提高效率&#xff0c;早早下班&#xff01;一、字体样式&#xff1a;平常更改字体样式&#xff0c;总…

【openEuler系列】部署文件共享服务Samba

个人名片&#xff1a; 对人间的热爱与歌颂&#xff0c;可抵岁月冗长&#x1f31e; Github&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff1a;念舒_C.ying CSDN主页✏️&#xff1a;念舒_C.ying 个人博客&#x1f30f; &#xff1a;念舒_C.ying 1 配置环境 挂载系统ISO&am…

李沐精读论文:GAN

论文&#xff1a;https://papers.nips.cc/paper/2014/file/5ca3e9b122f61f8f06494c97b1afccf3-Paper.pdf 视频&#xff1a;GAN论文逐段精读【论文精读】_哔哩哔哩_bilibili 课程&#xff1a;CS231n 2022PPT笔记- 生成模型Generative Modeling ​李宏毅机器学习——对抗生成网络…