算法系列(十)堆实现优先队列

Dijkstra算法介绍及其优先队列优化和斐波那契堆优化 Dijkstra算法介绍及其优先队列优化和斐波那契堆优化 文章目录一、dijkstra算法概述二、实现dijkstra算法需要掌握的算法知识1、从数据中剔除最小项(函数ExtractMin())2、松弛操作3、伪代码分析三、最小优先队列概述四、最小优先队列伪代码分析1.维护堆的性质2.建堆3.剔除最小节点:4.关键字减值(松弛操作,具体实现中将此函数命名为relax())五、例题分析1. 首先设法存储输入的数据2. 设计最小优先队列3.实现Dijkstra算法(限于题目要求,略显臃肿):4.与优先队列 阅读详情

在算法系列(九)平衡二叉查找树AVL树中介绍了AVL树。这篇文章主要讲解优先队列。

一般都使用二叉堆来实现优先队列。暂时之说这种实现。

堆的定义和性质

堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:

Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]

即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。

堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,

满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。

由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。

堆的存储

一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。


堆的基本操作--插入删除


插入的策略叫做上滤,删除的策略叫做下滤。

堆排序

首先可以看到堆建好之后堆中第0个数据是堆中最小的数据。取出这个数据再执行下堆的删除操作。这样堆中第0个数据又是堆中最小的数据,重复上述步骤直至堆中只有一个数据时就直接取出这个数据。

代码实现

// 向堆中插入元素
	public static void insert(List heap, int value) {
		heap.add(value);
		// 开始上升操作
		heapUp2(heap, heap.size() - 1);
		// heapUp(heap, heap.size() - 1);

	}
// 非递归实现
	public static void heapUp2(List heap, int index) {
		int parent = 0;
		for (; index > 1; index /= 2) {
			// 获取index的父节点的下标
			parent = index / 2;

			// 获得父节点的值
			int parentValue = (Integer) heap.get(parent);
			// 获得index位置的值
			int indexValue = (Integer) heap.get(index);

			// 如果大于就交换
			if (parentValue > indexValue) {
				swap(heap, parent, index);
			}
		}
	}
	/**
	 * 删除堆中最小的值,也就是删除位置是1的值,也就是根节点的值 操作原理是:当删除根节点的数值时,原来的位置就会出现一个孔
	 * 填充这个孔的方法就是,把最后的叶子的值赋给该孔,最后把该叶子删除
	 * 
	 * @param heap
	 */
	public static void deleteMin(List heap) {
		// 把最后的一个叶子的数值赋值给1个位置
		heap.set(1, heap.get(heap.size() - 1));
		// 下滤操作
		heapDown2(heap, 1);
		// heapDown(heap, 1);
		// 把最后一个位置的数字删除
		heap.remove(heap.size() - 1);
	}
// 非递归实现
	public static void heapDown2(List heap, int index) {
		int child = 0;// 存储左儿子的位置

		int temp = (Integer) heap.get(index);
		int n = heap.size() - 2;
		// 如果有儿子的话
		for (; 2 * index <= n; index = child) {
			// 获取左儿子的位置
			child = 2 * index;
			// 如果只有左儿子
			if (child == n) {
				child = 2 * index;
			} // 如果右儿子比左儿子的数值小
			else if ((Integer) heap.get(child) > (Integer) heap.get(child + 1)) {
				child++;
			}

			// 如果数值最小的儿子比temp的值小
			if ((Integer) heap.get(child) < temp) {
				// 交换堆中的child,和index位置的值
				swap(heap, child, index);
			} else {
				break;
			}
		}
	}


算法实现代码github地址为https://github.com/robertjc/simplealgorithm

后续会不断补充,有些地方写的可能有问题,请多指教。


欢迎扫描二维码,关注我的公众账号



算法之Java优先队列:堆实现与进阶应用解析 在编程学习的道路上,数据结构与算法的掌握至关重要。今天,我们一同深入研究Java中的优先队列,特别是基于堆的实现方式及其进阶应用,希望能和大家共同进步,提升我们在算法领域的认知与实践能力! 阅读详情

相关推荐

算法之Java优先队列:从初级实现到堆的深度解析

在编程学习的道路上,深入理解数据结构与算法是提升能力的关键。今天,我们一起深入研究Java中的优先队列,从初级实现方式到基于堆的数据结构,希望能和大家共同进步,让我们在算法的世界里收获更多知识!

wj_rdk的博客 1507

数据结构:二叉树,AVL树和优先级队列:优先级队列(Priority Queues)

优先级队列(Priority Queues)     优先级队列是存储具有自然顺序的元素的集合。 从优先级队列中删除项目总是产生最小的元素。   A priority queue is a collection that stores elements that have a natural order. Removing an item from a pr...

//柏拉图的双斜杠 872

图解算法:堆、堆排序、优先队列

堆、堆排序、优先队列可以看成就是一个东西;堆是一种非常重要的数据结构,堆排序是基于堆这种数据结构实现的;优先队列可以用堆这种数据结构来实现,也可以用其他数据结构实现。优先队列可以用来实现有优先级的任务调用(一些任务在池子里等待,优先级最高的先被优先取出执行)

zfj321的博客 1427

数据结构——优先级队列(堆)

优先级队列(堆)超详细解答,速看!

qq_62274623的博客 3025

[算法]优先队列之配对堆

配对堆的核心要义在于合并,只要掌握到合并的精髓就能很快的手撸一个配对堆。由于配对堆的插入复杂度只有常数级别,在通常情况下弹出最小值的性能也会由于二叉堆(Java、Python等语言中优先队列的默认实现),所以在做Prim时会有优势。

身披白袍的博客 905

堆与优先队列:从理论到应用

堆和优先队列是解决优先级相关问题的强大工具,从理论上讲,它们提供了对数级别的时间复杂度,在实践中表现出色。无论是系统编程、算法设计还是数据处理,掌握堆数据结构及其变种,都能帮助开发者设计出更高效的解决方案。

刘念卿的博客 1040

优先级队列(堆)的实现

该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。在这种情况下,。这种数据结构就是优先级队列(Priority Queue)。

2301_77572338的博客 790

优先队列和堆:原理、实现及应用

优先队列和堆是数据结构中的重要概念,它们在各种算法和应用中都有广泛的应用。通过本文的介绍,我们深入了解了优先队列和堆的原理、实现方法以及一些常见的应用场景。优先队列和堆的设计使得我们能够高效地处理具有优先级的元素集合,从而在诸如调度算法、图论、数据压缩等领域发挥重要作用。在实际应用中,了解优先队列和堆的特性以及如何正确地使用它们至关重要。选择合适的数据结构和算法可以极大地提高程序的效率和性能,并且能够更加优雅地解决各种问题。

一键难忘的博客 1237

优先队列(堆)

这里写自定义目录标题场景功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 #用堆实现优先队列 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解

qq_44234405的博客 1555

Python 算法基础篇:堆和优先队列的实现与应用

堆和优先队列是常用的数据结构,它们在算法和程序设计中有着广泛的应用。本篇博客将重点介绍堆和优先队列的原理、实现以及它们在不同场景下的应用。我们将使用 Python 来演示堆和优先队列的实现,并通过实例展示每一行代码的运行过程。

小蓝枣的博客 1319

堆——优先队列的实现

用数组表示的完全二叉树,堆是一种常用来实现优先队列的树形数据结构。堆通常以树形结构组织元素,但使用数组来存储这些元素。这种方法可以高效地管理完全二叉树的结构。以下是一个更详细的解释以及如何在C语言中实现这个概念。

码明的博客 931

Dijkstra算法堆/优先队列优化

Dijkstra算法堆/优先队列优化前言额外知识简介堆与优先队列STL库重载Dijkstra分析及优化分析优化代码实现存储结构边点优先队列函数初始化添加边Dijkstra主函数后记 前文:Dijkstra算法&&邻接表数组 前言 ​ 1、本文中所采用的存储结构依然是邻接表数组,只是较上一篇文章中的结构稍微发生了一些变化,但本质是一样的,若不懂可参考前文; ​ 2、本文将涉及到堆...

Mark-2000的博客 6814

Renesas:定时器输入捕获

一、PWM输入捕获 1、Smart Configurator配置 注意:在使用前,需要使能对应的定时器!否侧无法正常进行输入捕获! 2、脉冲宽度的获取 如何区分高低电平的脉冲宽度:最常用的方法就是在触发中断后,判断IO口的高低电平,来确认是上升沿触发的中断还是下降沿触发的中断。 若无法进入中断,可查看:Renesas:配置中断的常规流程 (1)中断方式(Smart Configurator生成的代码) #pragma interrupt r_Config_TAUB0_0_i...

不吃鱼的猫的博客 2479

【堆】堆的基本概念及操作,堆与优先队列

Heap;

2401_87820834的博客 2210

threejs加载3dtiles(倾斜摄影)数据

1、安装3dTilesRenderer 插件 使用npm 安装 npm install 3d-tiles-renderer --save 或者去官网下载都行 GitHub - NASA-AMMOS/3DTilesRendererJS: Renderer for 3D Tiles in Javascript using three.js 2、使用 首先引入,在填入3dtiles数据的地址,可以是文件路径也可以是网站路径 const tilesRenderer = new TilesRend..

weixin_39481659的博客 1万+

滚动轴承振动信号特征解析与故障诊断模型构建

本文深入解析了滚动轴承振动信号的三大来源与特征,并详细阐述了从时域、频域到时频域的特征提取方法。通过构建基于机器学习(如随机森林、SVM)或深度学习的故障诊断模型,结合实战代码示例,为设备维护工程师提供了一套从信号分析到智能诊断的完整解决方案,旨在实现精准的故障识别与预测性维护。

qsc901234567的博客 368

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

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

白大锅的博客,毕设WangLoveBai_999 8399

告别虚拟机!在WSL2的Ubuntu里5分钟跑通LVGL v9.2图形界面(附SDL2配置避坑)

本文详细介绍了如何在WSL2的Ubuntu子系统中快速配置LVGL v9.2图形库的SDL2模拟环境,帮助嵌入式开发者在5分钟内跑通第一个图形界面示例。通过WSL2和VSCode的远程开发插件,实现Windows系统下无缝使用Linux工具链,大幅提升开发效率。

weixin_28736335的博客 424

[算法系列]优先队列,堆与堆排序

优先队列,堆与堆排序 1 优先队列 有时我们在处理有序元素时,并不一定要求他们全部有序. 很多情况下我们会收集一些元素, 处理当前最大的元素, 然后再收集更多元素, 再处理当前最大元素 … 这种情况下, 一个合适的数据结构一个支持两种操作 : 删除最大元素和 插入元素. 这种数据类型叫做 优先队列. 我们可以使用有序或无序的数组或链表实现.使用无序序列是解决这个问题的 惰性方法, 我们仅在必要的时...

lawfree的博客 3207

2022北京高考数学压轴题21题:Python暴力枚举验证k≥7的5种反例

本文探讨了2022北京高考数学压轴题21题的编程解法,通过Python暴力枚举验证k≥7的5种反例。文章详细介绍了m-连续可表数列的定义、问题转化与约束条件,并提供了暴力枚举算法设计和优化技巧,帮助读者理解如何用编程思维解决数学问题。

weixin_33552698的博客 232

数字IC后端实现之快速获取innovus中drv violation的所有net list

数字IC后端设计实现之快速获取innovus中drv violation的所有net list

weixin_37584728的博客 3347

优先队列和堆

什么是优先队列? 听这个名字就能知道,优先队列也是一种队列,只不过不同的是,优先队列的出队顺序是按照优先级来的;在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列ADT(Abstract Data Type)来完成操作,优先队列ADT是一种数据结构,它支持插入和删除最小值操作(返回并删除最小元素)或删除最大值操作(返回并删除最大元素); 这些操作等价于队列的enQueue和deQueue操作,区别在于,对于优先队列,元素进入队列的顺序可能与其被操作的顺序不同,作业调度是优先队列的一个应

数据工匠记 1257

从GWAS到单细胞:利用seismic包精准定位疾病相关的关键细胞亚群与驱动基因

本文详细介绍了如何利用seismic包将GWAS与单细胞测序数据结合,精准定位疾病相关的核心细胞亚群与驱动基因。通过创新的统计算法和实战案例,帮助研究者从遗传汇总数据中挖掘关键生物学机制,提升疾病研究的精准度和效率。

weixin_29215815的博客 441

算法学习记录05——优先队列到最小堆

使用最小堆构建优先队列,LeetCode力扣经典题:合并 k 个有序链表

m0_57268389的博客 995

PCB板设置20H 原则理解

20H原则是PCB设计中抑制EMI辐射的关键方法,要求电源层比相邻地层内缩20倍介质厚度(20H)。在四层板中实现20H原则需采用S-G-P-S层叠结构,确保GND与PWR紧邻。具体步骤包括:确定GND-PWR间介质厚度H,计算20H值(通常80-120mil),并在设计软件中将电源层四周内缩20H,同时保持地层完整不内缩。注意避免常见误区,如混淆介质厚度、地层内缩等。该原则能有效限制边缘场辐射,降低EMI干扰,是四层板EMC设计的重要规范。

qq_37999850的博客 689

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

优先队列的详解(包含优先队列的初级实现以及堆的实现方式)

优先队列一、优先队列的概念二、优先队列的API三、优先队列的初级实现(一)、数组实现(无序)(二)、数组实现(有序)(三)、链表表示法(四)、图表分析四、堆的定义(一)、堆的概念(二)、二叉堆表示法五、堆的算法(一)、堆实现的比较和交换方法(二)、由下至上的堆有序化(上浮)(三)、由上至下的堆有序化(下沉)(四)、堆的类定义以及相关方法 一、优先队列的概念 ​ 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。

hyyyya的博客 1764

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: Android差分升级原理和实现方式
下一篇: Android屏幕适配
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值