数据结构与算法之最小优先队列

数据结构之优先队列 阅读详情

先简单介绍一下堆的结构特性。

堆的结构基于数组,堆中的元素都存储在数组中,存储元素的数组满足一下特性:

1、最大的元素放在数组的1索引处

2、每个结点的元素的值总是大于等于它的两个子结点处的元素值

下面图可便于我们理解堆的结构

 这样实现的堆我们可以叫它最大堆,同样我们可以基于其反向思想实现最小堆,最小堆中数组元素须满足以下特性:

1、最小的元素放在数组的1索引处

2、每个结点的元素的值总是小于等于它的两个子结点处的元素值

图示如下

 最小优先队列API设计

 最小优先队列代码实现

/**
 * @author: xuzhilei6656
 * @create: 2021-12-12 17:21
 * @description: 最小优先队列实现
 **/
public class MinPriorityQueue<T extends Comparable<T>> {
    //存储堆中元素
    private final T[] items;
    //记录元素个数
    private int number;

    //构造方法
    public MinPriorityQueue(int capacity) {
        this.items = (T[]) new Comparable[capacity+1];
        this.number = 0;
    }

    //获取队列中元素个数
    public int size(){
        return number;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return number==0;
    }

    //判断堆中i索引处元素是否小于j索引处元素
    public boolean less(int i,int j){
        return items[i].compareTo(items[j]) < 0;
    }

    //交换i索引和j索引处的元素
    public void exchange(int i,int j){
        T temp = items[i];
        items[i] = items[j];
        items[j] = temp;
    }

    //往堆中插入一个元素
    public void insert(T t){
        //在数组尾部追加
        items[++number] = t;
        //上浮调整
        floatUp(number);
    }

    //对堆中k索引处元素做上浮调整,使索引k处元素处于合适的位置
    private void floatUp(int k) {
        while (k > 1){
            //如果索引k处元素小于父结点索引k/2处元素,则交换两者的值
            if (less(k,k/2)){
                exchange(k,k/2);
            }
            //变换k
            k = k/2;
        }
    }

    //删除堆中最小的元素,并返回这个最小元素
    public T delMin(){
        //堆中第一个元素即为最小的元素
        T min = items[1];
        //交换1索引与最大索引处的元素值,让完全二叉树最后一个元素变为临时根结点
        exchange(1,number);
        //删除最大索引处的元素
        items[number] = null;
        //元素个数-1
        number--;
        //对1索引处元素进行下沉,让临时根结点处于合适的位置
        sink(1);
        return min;
    }

    //使用下沉算法,使索引k处元素在堆中处于一个正确的位置
    private void sink(int k) {
        while (2*k <= number){
            //记录当前结点的左右子结点中较小者的索引
            int min;
            //如果存在右子结点,则左右子结点进行比较,否则让min直接记录左子结点元素所在索引
            if (2*k+1 <= number){
                //如果右子结点较小则min记录右子结点元素所在的索引,否则记录左子结点元素所在的索引
                if (less(2*k+1,2*k)){
                    min = 2*k+1;
                }else {
                    min = 2*k;
                }
            }else {
                min = 2*k;
            }

            //如果索引k处元素小于min处索引的元素,则说明索引k处元素处于正确的位置,结束循环,停止下沉
            if (less(k,min)){
                break;
            }
            //交换索引k和索引min处的元素
            exchange(k,min);
            //变换k
            k = min;
        }
    }


    //测试
    public static void main(String[] args) {
        String[] arr = {"S", "O", "R", "T", "E", "X", "A", "M", "P", "L", "B"};
        MinPriorityQueue<String> queue = new MinPriorityQueue<>(20);
        for (String str : arr){
            queue.insert(str);
        }
        System.out.println(queue.size());

        while (!queue.isEmpty()){
            String min = queue.delMin();
            System.out.println(min);
        }
    }

}

 测试结果

 以上仅个人学习时随手敲的demo,如有不正确的地方,可以在下方留言指正,谢谢。与各位优快云的伙伴们共勉,每天记录一点点,每天进步一点点。

【HTML——线条雨落】(效果+代码)| 算法面试: 解释并实现一种基于最小堆的优先队列算法。 分享一个HTML线条雨落的代码。 阅读详情

相关推荐

Java实现最小优先队列算法

最小优先队列在很多算法和应用中都有广泛的应用,例如Dijkstra算法、Prim算法等。在这个实现中,我们使用数组来表示堆,并利用上浮和下沉操作来维护堆的有序性质。最小优先队列是一种数据结构,其中每个元素都有一个关联的优先级。它的特点是,当我们从队列中取出元素时,总是返回具有最小优先级的元素。在本文中,我们将使用Java语言来实现最小优先队列算法。:向队列中插入一个元素,并根据给定的优先级进行排序。插入元素后,他会被放置在正确的位置上,以确保队列的顺序性质不被破坏。:删除并返回队列中优先级最小的元素。

CyberBladeX的博客 156

Java三种方法实现队列

数组实现队列 //数组实现队列 class queue{ int[] a = new int[5]; int i = 0; //入队操作 public void in(int m) { a[i++] = m; } // 出队列操作 取出最前面的值 通过循环遍历把所有的数据向前一位 public int out() { int index = 0; int temp = a[0]; for(int j = 0;j < i;j++) { a[j] = a[j + 1

NuanShuTT的博客 5893

最大和最小优先队列的基本操作

编写优先队列数据(priority_queue)类型,优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min priority queue)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。

【数据结构与算法】第九章:优先队列(最大、最小、索引)

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在某些情况下,可能需要找出队列中的最大值或者最小值 例如:使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优先级的,需要在这些计算机的任务中找出优先级最高的任务先执行,执行完毕后就需要把这个任务从队列中移除。普通的队列要完成这样的功能,需要每次遍历队列中的所有元素,比较并找出最大值,效率不是很高,这个时候,就可以使用一种特殊的队列来完成这种需求,优先队列 优先队列按照其作用不同,可以分为以下两种: 最大优先队列: .

土味儿 1466

宝塔面板+pbootCMS建站全流程:从服务器选购到上线优化(附常见问题排查)

本文提供了一份详尽的宝塔面板与pbootCMS建站实战指南。内容涵盖从云服务器选购、宝塔面板部署与安全加固,到pbootCMS安装、权限配置、数据库连接等核心步骤。同时深入讲解了PHP环境优化、Nginx伪静态设置、缓存开启等性能与SEO优化技巧,并附有常见问题排查与后期维护建议,帮助用户高效、稳健地完成专业网站构建。

e4f5g6h的博客 658

ArcGIS Maps SDK for Unity实战:把真实世界地形‘搬进’游戏场景的保姆级教程

本文详细介绍了如何使用ArcGIS Maps SDK for Unity将真实世界地形导入游戏场景的完整流程。从高程数据获取、TPKX格式转换到Unity中的地形集成与优化,提供了保姆级教程,帮助开发者快速实现高精度地形建模,特别适用于开放世界游戏和数字孪生项目。

weixin_30621465的博客 345

【算法基础实验】排序-最小优先队列MinPQ

MinPQ(最小优先队列)是一种常见的数据结构,用于有效管理一组元素,其中最小元素可以快速被检索和删除。这种数据结构广泛应用于各种算法中,包括图算法(如 Dijkstra 的最短路径算法和 Prim 的最小生成树算法)、事件驱动的模拟、调度任务等。MinPQ 可以用多种方式实现,其中最常见的是使用二叉堆(Binary Heap)结构,特别是最小堆。在许多实时系统和性能要求高的环境中,MinPQ 用来保证重要任务优先处理,或确保数据的最小值可以迅速访问。例如,在网络路由算法中,需要快速找到最短的未处理路径;

Greyplayground 1188

Comsol 弧形声学换能器声聚焦仿真

1. 弧度和曲率半径:弧形声学换能器的形状和曲率半径对声聚焦效果有重要影响。通常,较小的曲率半径和较大的弧度可以实现更强的声聚焦效果。弧形声学换能器声聚焦是指将声波能量集中在弧形声学换能器的特定区域内,以实现更强的声场强度和分辨率。4. 数值仿真和优化:使用声学仿真软件进行数值仿真可以帮助设计和优化弧形声学换能器的声聚焦效果。通过调整几何参数、材料特性和激励信号等参数,可以模拟和优化声聚焦效果。2. 激励信号:通过调整激励信号的频率和幅值,可以实现声波在弧形声学换能器中的聚焦效果。

声学黑洞仿真工作室 1616

索引最小优先队列的实现

概述 最大优先队列和最小优先队列,它们分别可以快速访问到队列中的最大元素和最小元素,但是它们没有办法通过索引访问已存在于优先队列中的对象,并更新它们。 为此,在优先队列的基础上,引入了一种新的数据结构——索引优先队列。 下面以最小优先队列进行讲解。 实现思路 给每一个数据元素关联一个整数,例如insert(int k, T t),k就是t关联的整数,通过k,我们可以快速获取t,k具有唯一性; 虽然可以快速获取元素,但元素的排列并不是堆有序的。因此,增加数组int[] pq,保存每个元素的索引,pq实

sc179的博客 739

【黑马点评优化】3-压测秒杀接口,算出性能塌陷区,之后用sentinel实现秒杀接口限流

【黑马点评优化】3-压测秒杀接口,算出性能塌陷区,之后用sentinel实现秒杀接口限流

m0_52031708的博客 3566

80MHz~100MHz频谱分析仪设计

由理论分析可知,经过乘法器后输出的信号为频率为w1+w2的高频信号和w1-w2的低频信号,除了想要采样的直流信号外,最小的信号频率为100kHz。因此,经过一系列推导可以得到该滤波器的元件C1,C2,C3,R1,R2的近似值分别为:C1=2.36nF,C2=32.1nF,C3=1.07nF,R1=1.39k,R2=2.84k。AK,此时的频率w2即为被测信号的频率,待测信号源电压幅度为,因此为了能达到直流采样的设计,我们将本振源的频率输出范围做成80~110 MHz,提高了题目的频率要求。

qq_48771816的博客 5242

优先队列(详解--最大优先队列,最小优先队列)

优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾部追加,从而队列头删除。在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下,计算机的任务都是有优先级的,我们需要在这些计算机的任务中找出优先级最高的任务先执行,执行完毕后就需要把这个任务从队列中移除。普通的队列要完成这样的功能,需要每次遍历队列中的所有元素,比较并找出最大值,效率不是很高,这......

qq_43751200的博客 8503

基于Simulink的双PMSM差速驱动转矩同步控制建模示例

本文详细介绍了基于Simulink的双永磁同步电机(PMSM)差速驱动转矩同步控制建模方法。针对AGV/叉车等双电机独立驱动系统的转矩不同步问题,提出主从式+交叉耦合控制策略,在Simulink中实现直线行驶、90°转弯和单轮打滑恢复三种工况的仿真验证。通过动力学建模、参数差异设置、同步误差定义及控制律设计,最终实现同步误差<3%、转弯半径跟踪误差<5%、打滑后100ms内恢复的性能指标。文章特别强调了实际工程中的参数标定、通信同步和故障处理要点,并提供了完整的Simulink建模步骤和工具箱使

xiaoheshang_123的博客 203

C++实现数据结构-最小生成树(Minimal spanning tree) (prim算法)(邻接表+优先队列)

C++实现最小生成树(prim算法)基于邻接表+优先队列(priority_queue)+关联容器(unordered_map)

2401_84990765的博客 2247

ICLR 2025 | MambaPEFT: 探索针对Mamba的参数高效微调方法

通过利用海量数据构建大型模型,基于Transformer的模型生态系统已逐步确立。参数高效微调(PEFT)是一项至关重要的技术,它能以最低成本将这些模型应用于下游任务,同时实现高效的性能表现。最近,基于状态空间模型(SSM)的Mamba模型作为Transformer的潜在替代方案受到了广泛关注。尽管已经提出了许多基于Mamba的大规模模型,但如何高效地将预训练的Mamba模型应用于下游任务仍有待研究。在本文中,作者对适用于Mamba的PEFT方法展开了探索性分析。

小白学视觉 326

HTML5+CSS3+JS小实例:焦点图波浪切换动画特效

实例:焦点图波浪切换动画特效。字体图标库:Font Awesome。技术栈:HTML+CSS+JS。

艾恩小灰灰的博客 907

数据结构与算法之优先队列(最大优先队列、最小优先队列、索引优先队列)

目录优先队列前言1.1 最大优先队列1.1.1 最大优先队列API设计1.1.2 最大优先队列代码实现1.2 最小优先队列1.2.1 最小优先队列API设计1.2.2 最小优先队列代码实现1.3 索引优先队列1.3.1 索引优先队列实现思路1.3.2 索引优先队列API设计1.3.3 索引优先队列代码实现 优先队列前言 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在某些情况下,我们可能需要找出队列中的最大值或者最小值,例如使用一个队列保存计算机的任务,一般情况下计算机的任务都是有优

weixin_52448922的博客 563

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[数据结构与算法] 优先队列 | 最小堆 C++

当存储自定义类型(如struct或class)时,你需要告诉优先队列如何比较它们。方法一:重载运算符(用于大顶堆)int id;// 重载 < 运算符,priority 越大,优先级越高// top() 将返回 priority 最大的 Node,即 {3, 20}方法二:提供自定义比较器(更灵活)如果你不想或不能修改结构体定义,或者需要多种排序方式,可以提供一个自定义的比较函数对象(Functor)。int id;// 自定义比较器结构体。

Tipriest的博客 1567

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

算法学习笔记——数据结构:最小堆、优先队列(TopK问题)

堆是自带排序功能的数据结构,其本质是完全二叉树,但为了方便,用数组存储;在使用过程中,保证任意父节点的值一定大于或等于/小于或等于子节点,Python中用`heapq`库来实现堆

Insomnia_X的博客 359

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【数据结构与算法】最小堆实现优先队列

https://zhuanlan.zhihu.com/p/65051934 最小堆 堆排序的原理就是,通过维护一个最小堆来进行排序(和没说一样。 最小堆在数据结构上是个完全二叉树,即除了叶子结点靠右的部分可能缺失以外,其他的地方都是满的。最小堆在结构上的特点是,所有的父结点都比子结点要小。这个特点天然的用于获取第Top-K小的数或者排序。例如找第三小的数,就是从最小堆里面取的第三个数。 最小堆有两个重要的操作,这两个操作都是为了维护最小堆,即在某些结点不满足最小堆属性的时候将堆调节到符合最小堆的状态。 Si

qq_30885821的博客 477

python优先队列

官方链接:https://pypi.org/project/sortedcontainers/ 最近刷题的时候遇到了优先队列。与一般的队列(先进先出FIFO)不同的是,优先队列一般是最高级的优先出(即最大的先出)。 一开始想到的,可以用堆来维护一个优先队列。不过,python中的堆是一个小根堆,即每次顶部pop出的都是最小值。 这样一来,我想到了41. 数据流中的中位数,能不能把数字变负,写入小根堆。 后来百度的时候发现,其实Python把优先队列封装在了sortedcontainers模块中,(PS:.

书生的日常 3834

算法__优先队列

最大优先队列:无论入队顺序,最大的数字先出队; 最小优先队列:无论入队顺序,最小的数字先出队; 7 5 4 2 3 1 二叉树: 插入一个数字 8: 8 大于 4,4和8交换; 8 大于7 ,8和7交换。 代码如下: /** * 优先排序(最大优先队列) */ public class TestPro { ...

KKnick1的博客 456

【算法基础实验】排序-最小索引优先队列IndexMinPQ

在算法和数据结构中,优先队列是一种特殊的队列数据结构,每个元素都有一个优先级。当你从优先队列中删除元素时,通常会删除具有最高(或最低)优先级的元素。在最小优先队列中,优先级最低的元素最先被删除。索引最小优先队列 是优先队列的一种变体,允许你通过索引(或键)快速地更新、插入、删除和访问最小元素。它的典型应用包括网络流、图算法(如Dijkstra最短路径算法)等。该代码实现了一个索引最小优先队列,支持插入、删除最小元素、更改优先级等操作,并用堆结构来高效地实现这些操作。

Greyplayground 975

算法导论学习笔记4_堆排序与优先队列

目录1. 堆的定义及性质2. 堆排序3. 优先队列 1. 堆的定义及性质 堆和栈是计算机科学中两种常见的数据结构,另外堆区和栈区是C++中内存分配的两个区域,需要注意它们与堆、栈两种数据结构之间的区别。 二叉堆通常分为两种形式:最大堆和最小堆。在这两种堆中,结点的值要满足堆的性质(以最大堆为例):除根节点以外的所有节点iii都要满足: A[PARENT(i)]≥A[i]A[PARENT(i)]\...

weixin_43374723的博客 303

算法导论 总结 - 优先队列、最大堆、最小堆及堆排序

1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值(都是满的),且第h层的所有结点都集中在左子树。 2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是充满的。 堆是一棵完全二叉树。最大堆:父节点都大于等于子节点,根最大;最小堆:子节点都大于等于父节点,根最小。 堆排序中使用的是最大堆,最小堆通常用于构造优先队列。 维护堆的性质: MAX-HEAPIFY 输入是一个数组A和一个下标i,维持最大堆逐级下降。从上往下,从左往右,把根和左结点,右结点的最大值找出来,与根交

RUN 1496
上一篇: 数据结构与算法之最大优先队列
下一篇: Java中堆的底层结构实现
海深不见鲸
博客等级 码龄6年 7粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值