Java数据结构之堆(Heap)

article/2025/11/7 15:13:14

文章目录

  • 一、基本概念
  • 二、上浮操作(siftUp)
  • 三、下沉操作(siftDown)
  • 四、数组堆化
  • 五、实现大根堆


提示:以下是本篇文章正文内容,Java系列学习将会持续更新

一、基本概念

  1. 堆在逻辑上就是一棵完全二叉树
  2. 堆在物理上是储存在数组中。
  3. 满足任意根节点值>=子树节点值,叫做大根堆、最大堆。
  4. 满足任意根节点值<=子树节点值,叫做小根堆、最小堆。
  5. 堆的基本作用是快速找集合中的最值

在这里插入图片描述

回到目录…

二、上浮操作(siftUp)

	/** 元素上浮操作 **/private void siftUp(int k) {//确认终止条件,当到达顶部时不需要继续上浮//并且只有该节点值>父节点时,才进行上浮while(k > 0 && list.get(k) > list.get((k - 1) / 2)){//交换该节点和父节点的val值swap(k, (k - 1) / 2);//更新索引为父节点的索引k = (k - 1) / 2;}}

回到目录…

三、下沉操作(siftDown)

原理
该节点和它的左右孩子比较,如果该节点值<孩子的值,则swap(cur.val, max(left.val,right.val));
并且继续向下比较,再让刚刚交换过的孩子节点和它的孩子作比较,直到叶子节点

	/** 元素下沉操作 **/private void siftDown(int k) {// 在确保有孩子的情况下,下沉while(2 * k + 1 < list.size()) {// 先认为左孩子是比较大的孩子int maxChild = 2 * k + 1;// 如果存在右孩子,且右孩子 > 左孩子,则 maxChild 记录右孩子的位置if(2 * k + 2 < list.size() && list.get(maxChild) < list.get(maxChild + 1)){maxChild += 1;}// 比较自己和大孩子的值if(list.get(k) < list.get(maxChild)){swap(k, maxChild);k = maxChild;}else{// 如果此时符合堆性质,则不需要再向下比较了,结束循环break;}}}

回到目录…

四、数组堆化

	//数组堆化,O(N)public MaxHeap(int[] arr) {this.list = new ArrayList<>(arr.length);//将元素放入list中for(int i : arr){list.add(i);}//从最后一个非叶子节点开始倒着下沉每一个节点,直到堆顶for (int i = (arr.length - 2) / 2; i >= 0; i --) {siftDown(i);}}

回到目录…

五、实现大根堆

/*** 自己实现大根堆*/
public class MaxHeap {private List<Integer> list;public MaxHeap() {this(10);}public MaxHeap(int size) {list = new ArrayList<>(size);}// 数组堆化public MaxHeap(int[] arr) {list = new ArrayList<>(arr.length);for(int i : arr) {list.add(i);}// 从最后一个非叶子节点的位置往上做下沉操作for (int i = (arr.length - 2) / 2; i >= 0; i --) {siftDown(i);}}// 上浮操作private void siftUp(int k) {// 和父节点比较大小做交换while(k > 0 && list.get(k) > list.get((k - 1) / 2)){swap(k, (k - 1) / 2);k = (k - 1) / 2;}}// 下沉操作private void siftDown(int k) {// 在确保有孩子的情况下,下沉while(k <= (list.size() - 2) / 2) {// 先认为左孩子是比较大的孩子int maxChild = 2 * k + 1;// 如果存在右孩子,且右孩子 > 左孩子,则 maxChild 记录右孩子的位置if(2 * k + 2 < list.size() && list.get(maxChild) < list.get(maxChild + 1)){maxChild += 1;}// 比较自己和大孩子的值if(list.get(k) < list.get(maxChild)){swap(k, maxChild);k = maxChild;}else{// 如果此时符合堆性质,则不需要再向下比较了,结束循环break;}}}// 添加元素public void add(int val) {// 先插到最后面list.add(val);// 从最后一节点开始上浮siftUp(list.size() - 1);}// 弹出最大堆的最大值public int extractMax() {int max = list.get(0);// 交换首尾元素的值swap(0, list.size() - 1);// 删掉最后一个元素的值(最大值)list.remove(list.size() - 1);// 第一个元素做下沉操作siftDown(0);return max;}// 交换private void swap(int i, int j) {int tmp = list.get(i);list.set(i, list.get(j));list.set(j, tmp);}@Overridepublic String toString() {return list.toString();}
}

回到目录…


总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是Java数据结构的学习,认识了堆,学习了堆的上浮、下沉操作原理,以及自己手写一个大根堆。之后的学习内容将持续更新!!!


http://chatgpt.dhexx.cn/article/DNOPts1h.shtml

相关文章

JVM--堆

45. JVM--堆 1. 堆的核心概述 一个进程对应一个JVM的实例&#xff0c;一个JVM实例中只有一个运行时数据区&#xff0c;里面只有一个方法区和堆&#xff0c;一个进程的多个线程共享方法区和堆&#xff0c;那就要考虑线程的安全问题。 每个线程各有一套程序计数器、本地方法栈、虚…

java中的堆

文章目录 一、堆的分类二、详述Java堆中各个区域1、堆大小2、新生代 ( Young ) 的划分3、工作原理4、GC日志 一、堆的分类 Java 中的堆是 JVM 管理的最大的一块内存空间&#xff0c;主要用于存放Java类的实例对象 其被划分为两个不同的区域&#xff1a;新生代 ( Young )和老年…

Java数据结构--堆

一.堆的定义及本质 要知道在Java中&#xff0c;堆是以优先级队列来表示的。因此学会了堆&#xff0c;我们也就学会优先级队列 1.堆的定义 当一颗二叉树的每个节点都大于等于它的两个子字节时&#xff0c;它被称为堆有序。而堆是一组能够用堆有序的完全二叉树排序的元素&…

Java数据结构之堆

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

常用三极管引脚定义

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

常用电子器件 ——三极管

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

三极管开关特性

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

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

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

三极管相关知识点

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

三极管的一些基本知识

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

三极管的几点应用

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

【三极管】

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

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

描述 三极管具有三个引脚&#xff0c;定义分别为基极b、集电极c、发射极e&#xff0c;在设计电路和设计封装时&#xff0c;这三个引脚的顺序必须和封装对应一致&#xff0c;否则电路无法正常工作&#xff0c;三极管常用的封装有&#xff1a;直插TO-92&#xff0c;贴片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.三极管的结构与类型 &#xff08;1&#xff09;结构&#xff1a;三极管有两个PN结&#xff08;集电结、发射结&#xff09;、三个区&#xff08;集电区、基区、发射区&#xff09;、三个电极&#xff08;集电极、基…

三极管

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

三极管与mos管通俗讲解

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

三极管基础知识

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

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

三极管基础 具体的原理就不说了, 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 转载自&#xff1a; http://hi.baidu.com/2000258051/blog/item/26f90b97f75ed66954fb961e.html 9013、9014均为NPN型三极管&#xff0c;最大耗散功率Pcm为0.625W&#xff1b;最大集电极电流Icm为0.5A&#xff1b;集电极-基极击…