Java数据结构--堆

article/2025/11/7 15:35:42

一.堆的定义及本质

要知道在Java中,堆是以优先级队列来表示的。因此学会了堆,我们也就学会优先级队列

1.堆的定义

当一颗二叉树的每个节点都大于等于它的两个子字节时,它被称为堆有序。而堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级储存

总而言之堆具有一下性质:

①堆逻辑上是一颗完全二叉树,但本质上确是数组

②堆中的某个节点总是不大于或不小于其父节点的值

2.堆的分类

堆分为大顶堆与小顶堆

①大顶堆:每个结点的值都大于或等于其左右孩子结点的值。
②小顶堆:每个结点的值都小于或等于其左右孩子结点的值。

定义是不是看上去难懂丫,那我们来根据图来了解一下吧:

3.完全二叉树

完全二叉树就是除了叶子节点之外,其余节点都有左右孩子的二叉树

下图就是一个完全二叉树(也是一个大顶堆)

7c51715811634cc98e2b5ee17bd9fd00.jpg

堆本质上是一个数组,图中粉色序列就是堆在数组中索引,蓝色序列就是堆在数组中储存的值

二.Java API中的PriorityQueue类

我们学习堆,首先就要来了解堆是如何创建并如何使用的

下面我们来看一下Java中的PriorityQueue类,并据此创建堆,完成堆的一些基本操作

1.构造方法

c2aa9dd608464205bb4f7a170d2f5dac.jpg

在这里我们要知道最主要的两点:

①创建小顶堆,构造方法中不用传入任何值

②创建大顶堆,要在构造方法中填入相应的规则

在下面我们会一一创建

2.方法摘要

48dcf0c69dc04a2099b8136a3ed34526.jpg

其中最主要且需要我们掌握的就是

增( offer ) 删( poll )查( peek )等方法

3.堆的使用

ef2e60d17e724dd39a309a4d8ebbd4bd.jpg

 在大顶堆中传入的相应规则中,其中是一个匿名内部类,类中的compare方法是我们要重写的接口

ce84210a3fc04e93a21cd76c7a44853c.png

三.堆的实现(大顶堆)

了解了堆是如何使用的,那么下面我们就来实现一下吧

堆的本质是数组,因此成员变量中要用数组arr,有效长度size,以及数组容量capacity

当然数组是有限的,若数组溢出,我们就要扩容数组

下面我们来写出最基本的成员变量及方法

1f925d05b6274905b712cfc8231f670b.jpg

 1.建堆heapify

如果我们要将一个数组传入到堆中,一个一个的向其中添加效率太慢了,因此我们可以实现一个建堆的构造方法,可以直接将数组传入,从而直接为我们创建好堆

思路:找到最后一个非叶子节点,从后向前依次下潜(与其左右两个孩子的最大者进行交换,重复此操作,直到到叶子节点)

我们来根据下面的堆来了解一下

首先我们找到最后一个非叶子节点7,但它比它的左右两个孩子5和3大,因此进行下一个节点2的操作

4298a783f5a146ee9d6a849bf6955f31.jpg

 我们进行2节点的操作,我们找到其最大的右孩子5,与其交换

8ee7d0d56bad47b6b2174ed6579b2c7e.jpg

 768a7da78b364778b8ed15f302d0217b.jpg

 我们再进行下一个节点1的操作,我们找到其最大的右孩子7与其交换

7fd8a5313c4e4cd08534cbb32d1ca190.jpg

 6882157880874646aa66dfd3b02bb139.jpg

 再继续,它最大的是左孩子6,交换

02e6c5c3b9774cb397468777531f3871.jpg

 这样我们就建成了一个大顶堆了

以上思路也叫做弗洛伊德建堆算法

dcf842d827fb499ab52c3f41841e8bf2.jpg 

052494173cc7429e829b41d6d6f8b9d2.jpg 

 2. poll移除堆顶元素

思路:数组的最后一个元素是最容易删除的,因此我们要删除堆顶元素,就将堆顶元素与最后一个叶子节点交换,再删除最后一个节点,再将交换的堆顶元素下潜

67e743e5efaf432895c7077c022d5c7c.jpg

3. peek获取堆顶元素

ee73408c814d40e2aaa50cd4b7454c48.jpg 

 4. offer添加元素

思路:将要添加的元素上浮(其与父节点比较,大于父节点交换,重复此操作,直到堆顶)

b87d91d516b64e40ab02506bda06e8fc.jpg

 5.结果显示

3d8aaa2101364e2292d9029922996b27.jpg

d0f1542518474377a43101ae8f2cf3e2.jpg 

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/7oUJUXJk.shtml

相关文章

Java数据结构之堆

堆的概念 堆逻辑上是一棵完全二叉树堆物理上是保存在数组中满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆反之,则是小堆,或者小根堆,或者最小堆堆的基本作用是快速找集合中的最…

常用三极管引脚定义

给大家总结了常用封装的三极管的引脚定义 配套的视频讲解 常用三极管引脚定义

常用电子器件 ——三极管

说明:   本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。   QQ 群 号&#xf…

三极管开关特性

三极管在我们数字电路和模拟电路中都有大量的应用,在我们开发板上也用了多个三极管。在我们板子上的 LED 小灯部分,就有这个三极管的应用了,图 3-5 的 LED 电路中的 Q16就是一个 PNP 型的三极管。 图 3-5 LED 电路 三极管的初步认识 三极管…

常用三极管入门级电路设计(如何选型和搭电路?)

转自: 常用的三极管电路设计-电阻到底是怎么选的(修正后)-面包板社区 硬件基础知识---如何设计一个三极管放大电路_学无止境的专栏-CSDN博客_uce怎么算 今天的内容超级简单,主要给硬件新手写点东西,关于三极管实用方…

三极管相关知识点

1.两种类型的三极管图示如下,基极(Base)、集电极(Collector)和发射极(Emitter),等效二极管电路如图所示 2.三极管的几种工作状态, 3.三极管做开关功能时,工…

三极管的一些基本知识

导通条件 NPN型三极管的导通条件是C点电位>B点电位>E点电位,三极管饱和导通的条件是Ub>Ue,Ub>Uc。 PNP型三极管的导通条件是E点电位>B点电位>C点电位,三极管饱和导通的条件是Ue>Ub,Uc>Ub。 NPN型三极管 1、定义: …

三极管的几点应用

关注星标公众号,不错过精彩内容 直接来源 | 巧学模电数电单片机 在复杂多变的模拟电路中,少不了学习三极管,过往的血泪史,不想再提,什么正偏反偏都给我统统滚蛋!今天来点实际的。 三极管有三个工作状态&…

【三极管】

文章目录 一、图片(NPN - PNP)二、导通、截至、饱和条件(一)NPN(二)PNP 三、三极管的作用(一)开关作用 1、同或、异或、或非、与非—真值表 ① 同或:相同为1&#…

三极管常用封装的引脚排列

描述 三极管具有三个引脚,定义分别为基极b、集电极c、发射极e,在设计电路和设计封装时,这三个引脚的顺序必须和封装对应一致,否则电路无法正常工作,三极管常用的封装有:直插TO-92,贴片SOT-23、S…

电子元器件篇---三极管

目录 简介 三极管基本参数 2.1、封装形式 2.2、特征频率 2.3、工作电压/电流 2.4、电流放大倍数 2.5、集电极发射极反向击穿电压 2.6、最大允许耗散功率 三极管种类 三极管用途 4.1共射放大电路 4.2共集放大电路 4.3共基放大电路 4.4开关和反相电路 4.5稳压作用 简…

三极管的基础知识(上)

一、半导体三极管 1.作用 主要用于放大电路、开关电路。 2.三极管的结构与类型 (1)结构:三极管有两个PN结(集电结、发射结)、三个区(集电区、基区、发射区)、三个电极(集电极、基…

三极管

三极管 一.三极管介绍参考资料 二. 三极管的作用1.开关来使用 2.二级驱动3.放大信号4.三极管还可以用来反向5.隔离参考来源 pnp型三极管电压总结 一.三极管介绍 三极管是最重要的电子元器件之一,成功制作世界上第一只半导体三极管的美国物理学家约翰巴丁(John Bard…

三极管与mos管通俗讲解

文章目录 一、三极管1.结构2.应用 二、mos管1.结构及原理2.mos管通断3.mos管最常用作用4.应用5.MOS管的栅极和源极之间的电阻 一、三极管 1.结构 电流控制型元器件,只要基极B有输入(或输出)电流就可以对这个晶体管进行控制了 三极管有三个…

三极管基础知识

二极管的导电特性 1. 正向偏置 在电子电路中,将二极管的正极接在高电位端,负极接在低电位端,二极管就会导通,这种连接方式,称为正向偏置。必须说明,当加在二极管两端的正向电压很小时,…

三极管基础分类, 参数选择及常见型号对比

三极管基础 具体的原理就不说了, N型和P型都是通过硅和锗参杂不同的元素带来的电子富余或缺少从而产生内在的电动势, 这里说的是如何帮助记忆. 半导体类型 P型半导体, p-type Semiconductor, p-type 这个名称代表的是 the positive charge of a hole, 知道这个就很好记忆了N…

常用三极管的区别 9012 9013 9014 9015 8550 8050

常用三极管的区别 9012 9013 9014 9015 8550 8050 转载自: http://hi.baidu.com/2000258051/blog/item/26f90b97f75ed66954fb961e.html 9013、9014均为NPN型三极管,最大耗散功率Pcm为0.625W;最大集电极电流Icm为0.5A;集电极-基极击…

常用三极管汇总

常用三极管汇总 一、插件三极管 型号基本参数类型封装应用说明实物图PcVCBOVCEOVEBOhFEIC2SC26550.9W50V50V5V--2ANPNTO-92L高速开关管,用于大电流PWM推挽驱动与2SA1020互补 2SC90130.625W40V20V5V84-2020.5ANPNTO-92与SS9012互补同KSP2222A2N55510.63W180V160V6V3…

React项目打包 优化详解

项目打包和优化-项目打包 目标:能够通过命令对项目进行打包 步骤: 在项目根目录打开终端,输入打包命令:npm run build 等待打包完成,打包后的内容被放在项目根下的 build 文件夹中 项目打包和优化-项目本地预览 …

React vscode 创建 react 项目流程【超详细】

文章目录 一、安装node二、配置淘宝镜像三、配置 vscode(win10)四、全局安装脚手架五、创建项目编写第一个 react 程序教程 一、安装node 请在官网下载安装:https://nodejs.org/zh-cn/vscode 中 点击 ( ctrl ) 调出终端输入指令node -v&…