漫画:什么是优先队列?

【数据结构入门】堆(Heap) 文章目录一、堆的结构及实现(重要)1.1 二叉树的顺序结构1.2 堆的概念及结构1.3 堆的实现1.3.1 堆的向下调整算法1.3.2 **向下调整算法的时间复杂度**1.3.3 堆的创建(向下调整)1.3.4 堆排序1.3.5 建堆的时间复杂度二、堆的相关接口实现(以大堆为例)2.1 堆的初始化2.2 堆的销毁2.3 堆的插入2.4 堆的删除2.5 获取堆顶元素2.6 堆的判空2.7 拓展1:找出堆中前k个最大元素2.8 拓展2:堆的创建(向上调整) 一、堆的结构及实现(重要) 1.1 二叉树的顺序结构 阅读详情

在之前的漫画中,我们介绍了二叉堆和堆排序。没看过的小伙伴可以看一看前文:

 

漫画:什么是二叉堆?(修正版)

 

漫画:什么是堆排序?

 

这一次,我们来讲一讲二叉堆的另外一个应用:优先队列

 

 

 

 

 

 

队列的特点是什么?

 

聪明的小伙伴们都知道,是先进先出(FIFO)。

 

入队列:

 

 

 

出队列:

 

 

 

那么,优先队列又是什么样子呢?

 

优先队列不再遵循先入先出的原则,而是分为两种情况:

 

最大优先队列,无论入队顺序,当前最大的元素优先出队。

最小优先队列,无论入队顺序,当前最小的元素优先出队。

 

比如有一个最大优先队列,它的最大元素是8,那么虽然元素8并不是队首元素,但出队的时候仍然让元素8首先出队:

 

 

 

 

要满足以上需求,利用线性数据结构并非不能实现,但是时间复杂度较高,最坏时间复杂度O(n),并不是最理想的方式。

 

至于为什么最坏时间复杂度是O(n),大家可以思考下。

 

 

 

 

让我们回顾一下二叉堆的特性:

 

1.最大堆的堆顶是整个堆中的最大元素

2.最小堆的堆顶是整个堆中的最小元素

 

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

 

入队操作:

 

1.插入新节点5

 

 

 

2.新节点5上浮到合适位置。

 

 

 

出队操作:

 

1.把原堆顶节点10“出队”

 

 

 

2.最后一个节点1替换到堆顶位置

 

 

 

 

3.节点1下沉,节点9成为新堆顶

 

 

 

 

 

 

 

public class PriorityQueue {


private int[] array;

private int size;


public PriorityQueue(){

   //队列初始长度32

   array = new int[32];

}


/**

* 入队

* @param key  入队元素

*/

private void enQueue(int key) {

   //队列长度超出范围,扩容

   if(size >= array.length){

       resize();

   }

   array[size++] = key;

   upAdjust();

}


/**

* 出队

*/

private int deQueue() throws Exception {

   if(size <= 0){

       throw new Exception("the queue is empty !");

   }

   //获取堆顶元素

   int head = array[0];

   //最后一个元素移动到堆顶

   array[0] = array[--size];

   downAdjust();

   return head;

}


/**

* 上浮调整

*/

private void upAdjust() {

   int childIndex = size-1;

   int parentIndex = childIndex/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);

}


public static void main(String[] args) throws Exception {

   PriorityQueue priorityQueue = new PriorityQueue();

   priorityQueue.enQueue(3);

   priorityQueue.enQueue(5);

   priorityQueue.enQueue(10);

   priorityQueue.enQueue(2);

   priorityQueue.enQueue(7);

   System.out.println("出队元素:" + priorityQueue.deQueue());

   System.out.println("出队元素:" + priorityQueue.deQueue());

}

}

代码中采用数组来存储二叉堆的元素,因此当元素超过数组范围的时候,需要进行resize来扩大数组长度。

 

 

 

 

—————END—————

漫画算法:小灰的算法之旅 本书:<<漫画算法小灰的算法之旅>> 作者:魏梦舒(@程序员小灰) 我是将本书中内容,重新整理一遍。基本是书中的内容,方便以后阅读查看!!!希望喜欢本书的小伙伴们可以相互学习,多多支持! 第三章树 ** 什么是树? 什么是二叉树? 二叉树的遍历方式有几种? 什么是二叉堆? 什么是优先队列? ** 1.树是n个节点的有限集,有且仅有一个特定的称为根节点。当n=0时,成为空... 阅读详情

相关推荐

软件工程导论实践:从需求到架构的机票预订系统全流程解析

本文深入解析机票预订系统从需求分析到架构设计的全流程实践,涵盖业务流程、功能建模、模块化设计、性能优化等关键环节。通过实际项目经验,分享软件工程导论在复杂系统开发中的应用技巧,包括数据流图绘制、E-R图设计、微服务架构及高并发处理等实战策略,助力开发者构建高效可靠的机票预订系统。

weixin_29202213的博客 411

内存学习——堆(heap)

/自定义1024字节内存的数组,模拟堆//指向堆数组可用空间的首地址void *my_malloc(int size) //自定义malloc函数//记录开辟空间的首地址//malloc的空间大小//返回开辟空间的首地址void my_free(void *buf) //可用自定义malloc函数,但是无法自定义free函数,后面分析原因/* err */int i;//使用自定义的malloc函数在自定义堆数组中开辟100字节空间for (i = 0;i < 26;i++)

studyingdda的博客 3321

西门子 S7-200 SMART 系列六:手把手教你配置S7-200 SMART Modbus RTU

Modbus 是公开通信协议,其最简单的串行通信部分仅规定了在串行线路的基本数据传输格式。Modbus 具有两种串行传输模式,ASCII 和 RTU,它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。

John_09040211的博客 7429

Priority Queue优先队列详解

优先队列(Priority Queue)是一种抽象数据类型,它类似于普通队列,遵循先进先出(FIFO)原则,但在此基础上,每个元素都关联着一个优先级。元素按照优先级顺序被处理,优先级高的元素会优先于优先级低的元素出队,而并非严格按照元素入队的先后顺序。简单来说,它是一种能保证每次取出的元素都是当前队列中优先级最高的元素的数据结构。

m0_74051652的博客 2978

【开关电源篇】开关电源——只需这三个阶段,从电源小白到维修大神

🔌 该篇为的原创文章跳转目录,小二持续更新跳转链接,尽情关注!

2301_81299416的博客 2380

UE4引擎分析获取UWord,GName,GetName,GObjectArray

UE4引擎具有很多固定特征和特性 所以我们在逆向UE4引擎开发的游戏的时候,可以利用这些特征和特性. 当然,正常思路逆向也是没问题的(例如我们的ttw课程全数据逆向),你就当多了一个针对于该引擎逆向的快捷方式 或则多了一个思路即可. 正常逆向+引擎分析,使逆向结果全面且快速.

任鸟飞2217777779的博客 1万+

算法数据结构——优先队列(Priority Queue)精讲及python应用实例

优先队列(Priority Queue):一种特殊的队列。在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除。优先队列与普通队列最大的不同点在于出队顺序。普通队列的出队顺序跟入队顺序相关,符合「先进先出(First in, First out)」的规则。优先队列的出队顺序跟入队顺序无关,优先队列是按照元素的优先级来决定出队顺序的。优先级高的元素优先出队,优先级低的元素后出队。优先队列符合「最高级先出(First in, Largest out)」的规则。

白话机器学习 1万+

[QMT和ptrade量化交易小白入门]-109、小市值选股的基础上用六脉神剑评分,回测年化可到132%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1859

什么是优先队列?

来源:公众号【编程珠玑】 作者:守望先生 前言 我们之前已经介绍过《如何自己实现一个队列》,它们是先入先出的,这很容易用平常的排队来理解。但是如果这个队列要支持有紧急情况的人先出队呢?原先那种队列就不再适用了,我们需要使用本文所提到的特殊队列--优先队列。 优先队列 优先队列也是一种抽象数据类型。优先队列中的每个元素都有优先级,而优先级高(或者低)的将会先出队,而优先级相同的则...

守望的博客-编程珠玑 2万+

【深度学习新浪潮】深度学习特别是大模型在图像配准方面的研发进展

深度学习,尤其是大模型的出现,彻底改变了图像配准的技术范式——从“手工设计特征+几何约束”走向“数据驱动+通用特征学习”。当前,大模型配准已在医学影像、遥感、工业检测等领域实现商业化落地,解决了传统方法难以应对的跨模态、少样本、复杂形变等问题。但大模型配准仍面临推理效率、可解释性、数据隐私等挑战,未来的研发核心将是“精度与效率的平衡”“泛化能力的提升”“场景化适配的简化”。对于开发者而言,从简化版大模型配准代码入手,逐步理解预训练+微调的核心逻辑,是衔接前沿技术的有效路径。

专注:太空算力、AI infra、异构调度、大模型成本工程 423

lammps 案例:高熵合金FeNiCrCoCu建模及拉伸模拟

高熵合金力学性能模拟包括拉伸、剪切、摩擦等模拟,本文以高熵合金FeNiCrCoCu为例介绍高熵合金建模及拉伸过程模拟。 FeNiCrCoCu原子数量比为1:1:1:1:1 高熵合金的拉伸与单晶拉伸过程类似,主要包含以下步骤: 1.建模 高熵合金含有原子类型较多,建模时,一般以含量最多的原子为主建立初始模型。 使用set type/ratio或者set type/fraction的方式按一定比例替换为其它合金原子。 如随机选择20%的原子1,将其转换为原子2: set type 1 type/ratio 2

lammps_jiayou的博客 6067

【队列】——PriorityQueue优先队列

优先队列不再遵循先入先出的原则: - 最大优先队列,不管入队顺序,当前最大的元素优先出队。 - 最小优先队列,不管入队顺序,当前最小的元素优先出队。

雪野Solye的博客 1376

uniapp [安卓苹果App端] - 实现判断并开启消息通知/提示权限,监测通知权限未开启时弹框提示用户并引导用户跳转至设置界面,uniApp检查通知权限+提示是否打开+点击跳转设置(详细示例代码)

uni-app判断有无通知权限,并进行设置,设置手机通知权限,开启通知权限,uni-app解决权限问题,uniapp 拉起授权(拒绝后重新开启权限)uniApp打包的手机app如果用户没开启通知权限、引导用户开启,uni-app动态打开应用通知权限,拒绝后跳转设置页面,uniapp获取通知栏权限,苹果ios系统打开通知权限,被拒绝怎么办,uniapp安卓判断通知权限,uniapp打包的APP引导用户打开手机通知权限,uniapp权限被拒绝,跳转手机设置页面 权限设置,IOS应用内跳转系统设置,uni-app

🏆 前端领域优质创作者 1万+

优先队列

优先队列 漫画:什么是二叉堆?(修正版) 漫画:什么是堆排序? 这一次,我们来讲一讲二叉堆的另外一个应用:优先队列 队列的特点是什么? 聪明的小伙伴们都知道,是先进先出(FIFO)。 入队列: 出队列: 那么,优先队列又是什么样子呢? 优先队列不再遵循先入先出的原则,而是分为两种情况: 最大优先队列,无论入队顺序,当前最大的元素优先出队。 最小优先队列,无论入队顺序,当前最小的元素优先出队...

weixin_42864519的博客 170

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据结构与算法:优先队列(堆)

一种数据结构,特殊场景使用,同样是使用堆结构,利用堆的特性 文章目录概要概述图解优先队列构造初始堆进行入队列演示进行出队列演示代码实现堆 优先队列特点优先队列一般应用场景 概要 code语言:java、c 测试环境:win、java8 参考书籍:《数据结构与算法分析java语言描述》 原书第三版、《数据结构:使用C语言》、《算法导论》原书第三版 参考链接:漫画:什么是优先队列? 概述 需...

maoyuanming0806的博客 1335

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

堆&优先队列

1堆 堆 2队列 漫画:什么是优先队列? 最大优先队列,无论入队顺序,当前最大的元素优先出队。 最小优先队列,无论入队顺序,当前最小的元素优先出队。 3例题 215. 数组中的第K个最大元素 3.1优先队列或红黑树(TreeSet)解法 public int findKthLargest(int[] nums, int k) { PriorityQ...

insider_way 192

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

程序员小灰的漫画算法和知识总结,高品质强推!!!

转载自微信号程序员小灰,不定期更新,漫画讲解好评,特来转载。 漫画知识汇总 漫画:深度优先遍历 和 广度优先遍历 漫画:什么是 “图”?(修订版) 漫画:图的 “最短路径” 问题 漫画:Dijkstra 算法的优化 漫画:图的 “多源” 最短路径 漫画:有趣的 “切蛋糕“ 问题 漫画:什么是 HTTPS 协议? 漫画:什么是ConcurrentHashMap? 漫画:高并...

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 8198

《漫画算法》终于出电子书了!

今年5月,小灰出版了《漫画算法》这本纸质书。在今年年中,本书获得【京东科技新书畅销榜】第1名,【京东科技畅销榜】第4名,非常感谢大家的支持!但是有一点美中不足,小灰的这本...

程序员小灰的博客 1万+

漫画算法:小灰的算法之旅(读书笔记)

感兴趣的可以关注一下微信公众号:程序员小灰 内容简介 《漫画算法:小灰的算法之旅》通过虚拟的主人公小灰的心路历程,用漫画的形式讲述了算法和数据结构的基础知识、复杂多变的算法面试题目及算法的实际应用场景。 第1章 介绍了算法和数据结构的相关概念,算法是什么,数据结构又是什么,用途是什么,如何分析时间复杂度,如何分析空间复杂度。 第2章 介绍了最基本的数据结构,包括数组、链表、栈、队列、哈希表的概...

夏曦 2164

漫画算法python版下载_漫画算法:小灰的算法之旅(Python篇)

书名:漫画算法:小灰的算法之旅(Python篇)定价:79.0ISBN:9787121382789作者:魏梦舒版次:第1版出版时间:2020-03内容提要:编辑推荐被优快云、InfoQ、极客时间等程序员技术社区频频转发的算法故事。青年意见领袖stormzhang、@码农翻身|刘欣、@Python爱好者社区|梁勇、@Hollis张洪亮、《Python3网络爬虫开发实战》作者崔庆才对《漫画算法》赞不...

weixin_40007515的博客 1645

小灰的《漫画算法》全面上架!

两周之前,小灰在公众号宣告了自己出书的消息,《漫画算法——小灰的算法之旅》开始预售。在短短的两周里,本书一度霸占着各大畅销榜榜首:(当当网计算机品类新书榜)在5月2日那一...

程序员小灰的博客 7621

《漫画算法》读书笔记

《漫画算法》读书笔记 在图书馆借阅算法书时,看到了一本非常吸引我的算法书——《漫画算法》。算法还能以漫画的方式展示出来吗?我带着我的疑惑翻开了这本书,里面的语言非常接地气,通俗易懂,让我觉得这本书非读不可。 这本书一共讲解了六章知识点,下面让我们一起来了解吧。 第一章 算法概述 本章主要的知识点是算法和数据结构,时间复杂度和空间复杂度。 通过本章的学习,我学到了: 1)在计算机领域里,算法是一系列程序指令,用于处理特定的运算和逻辑问题。 2)衡量算法优劣的主要标准是时间复杂度和空间复杂度。 3)数据结构是数

weixin_43894437的博客 347

漫画算法python版下载_漫画算法:小灰的算法之旅 PDF 全格式完整版

给大家带来的一篇关于算法相关的电子书资源,介绍了关于漫画算法、小灰、算法之旅方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小115.22 MB,魏梦舒编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:7.1。内容介绍本资源为完整全格式完整版(非试看版)小灰的算法经典故事给算法这颗“子弹”包上了“糖衣”,让算法的杀伤力潜藏于内,表面已不可怕,萌萌达Q弹讨人喜欢。从基本数据结构,到各...

weixin_39933484的博客 4850

漫画:什么是 “哈夫曼树” ?

————— 第二天 —————————————————概念1:什么是路径?在一棵树中,从一个结点到另一个结点所经过的所有结点,被我们称为两个结点之间的路径。上面的二叉树当中,从根结...

程序员小灰的博客 6095

漫画了解程序世界

2019年汇总 算法 漫画:寻找无序数组的第k大元素(修订版) Table of Contents 2019年汇总 2018汇总 2017汇总 漫画:如何将一个链表“逆序”? 漫画:什么是加密算法? 漫画:什么是 “图”?(修订版) 漫画:深度优先遍历 和 广度优先遍历 漫画:图的 “最短路径” 问题 漫画:Dijkstra 算法的优化 漫画:图的 “多源” 最短路径 漫画:有趣的 “切蛋糕“ 问题 概念 漫画:什么是 HTTPS 协议? 写给对 ”游戏...

wjx_jasin的博客 365
上一篇: 漫画:什么是堆排序?
下一篇: 漫画:什么是计数排序?
废言Pro
博客等级 码龄16年 1092粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值