【数据结构】堆{更新中}

数据结构面试的常客,一文带你深入了解堆 和链表、二叉树以及数组这些热门的数据结构相比,堆相对比较冷门。如果你对数据结构了解不深的话,可能很少听说。但是我们经常用到它,虽然可能你并不一定能感知到。比如说优先队列,我们就经常使用。我们需要用到这样一个数据结构,能够根据我们存入数据的优先级进行排序,将优先级高的排在前面。在和调度相关的一些系统和算法当中,优先队列是必然会用到的。但是很少有人知道,优先队列说是一个队列,但其实是通过堆实现的。 那么堆究竟是一个怎样的数据结构呢? 堆的定义 堆的实质其实是二叉树,并且还不是一般的二叉树,而是比较特别的二 阅读详情

 

堆的产生

堆的产生问题背景:如何在一堆动态变化的数中,以O(1)的复杂度获取最值。

堆的目标:一个数组,支持删除元素和添加元素,保证首元素永远是数堆中的最值。

数组树形化:比如给出数组  [7,9,8,1,10] , 一层一层依次从左到右加入节点,构造出如下图所示的一颗树,该种树形称为完全二叉树。

数组树形化
完全二叉树

对于数组 a,其所有元素的父子关系满足\left\{\begin{matrix} a[i].l = a[2*i+1] \\ a[i].r = a[2*i+2] \end{matrix}\right. ,(2*i+1>=a.length,null)。

完全二叉树:每一层节点都是满的,最底下一层叶子节点从左到右也是满的。

完全二叉树的数组化:可以用数组存储,按层次从左到右遍历树节点。比如下图。

完全二叉树数组化
完全二叉树层次遍历数组化

堆的定义:

  • 逻辑上是一个完全二叉树,支持删除元素和添加元素,保证根元素永远是数堆中的最值。其所有子树也都是堆。
  • 物理存储上,因为完全二叉树的节点可由数组存储,所以是一个数组,所有节点的父/子节点在数组中的位置,可由公式计算得到。以 [7,9,8,1,10] 为例,数组位置从 0 开始计。 9 的位置是 1 ,其父节点位置是  $\lfloor 1/2 \rfloor$ = 0 ,左子节点下标是 2*1+1 = 3 ,右子节点下标是 2*1+ 2= 4。

堆示例: [7,9,8,1,10] 就不是堆,因为 7 不是最值,且以 9 为根的子树,根也不是最值。 [10,9,8,1,7] 是堆,树形化后如下图所示:

满足堆定义的数组
堆

 

建堆

建堆的目标:以前面的数组   [7,9,8,1,10] 为例,调整元素位置,使之对应的完全二叉树,符合堆定义。

建堆的思路:把问题分解,从最小的树开始调整。

建堆过程
建堆过程图示
  • 先找到完全二叉树中最低层的父节点。按父子关系公式逆运算,元素下标是  $\lfloor len/2 \rfloor$ ,就是 9。该树只有最多三个节点,父节点与子节点中最大的节点互换位置,如果父节点最大就按兵不动。此时该元素( 9 )为根的子树满足堆定义。
  • 继续往前调整节点,此时元素下标是 $\lfloor len/2 \rfloor$ -1,就是 7,父子节点进行同样的比较互换操作 (7,10,8) ,如果有更换(10与 7 互换了),那么无法保证新的子节点值 7 是子树的最大值,所以需要继续将该子节点 7 和其子节点 1,9 进行同样的比较互换操作,一直进行到比较时无需更换,或者没有子节点为止。
  • 继续往前发现已经到数组首元素前面了,结束。
  • 前面对节点 7 一路向下的比较调整,称为向下调整。而前面从最低父节点 9 开始的建堆,我自称为向前建堆。

插入与删除元素

插入和删除的背景:

 

 

微信小程序报错:“errno“:600001,“errMsg“:“uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net:: uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::ERR_NAME_NOT_RESOLVED,uniApp微信小程序使用uni.uploadFile出现报错,微信小程序如何解决wx.uploadFile报错,如何解决这个问题,微信小程序真机报错,微信小程序报错"errno":600001,"errMsg":"uploadFile:fail errcode:-105 cronet_error_code:-105 error_m 阅读详情

相关推荐

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8170

堆的基本操作(更新,插入,删除)

#include<stdio.h> #include<iostream> #include<algorithm> #include<queue> #include<string.h> using namespace std; int tree[1000]; int n; void siftdown(int i)//建立最小堆 { ...

Zenith_Habitant的博客 1117

从DBC到ARXML:用RTA-CAR7实现车载通信协议栈自动化生成全流程

本文详细介绍了如何利用ETAS RTA-CAR7工具链,特别是ISOLAR-A和RTA-BSW ConfGen,实现从车载通信DBC文件到AUTOSAR ARXML系统描述文件,再到基础软件(BSW)协议栈代码的自动化生成全流程。该流程通过深度配置、信号路由、PDU复用及规则定制,大幅提升开发效率与一致性,是应对现代汽车电子复杂网络开发的关键实践。

brandy的博客 220

最大堆-插入/删除/排序-图解

原文地址:http://www.java3z.com/cwbwebhome/article/article1/1362.html?id=4745  堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树。最小堆便是每个节点的值都   设有n个元素的序列{k1,k2,...,kn},当且仅当满足下列关系时,称之为堆。    堆的三种基本操作(以下以

1737

3DSlicer冠脉分割实战:从DICOM导入到三维重建的完整流程(附常见问题解决)

本文详细介绍了使用3DSlicer进行冠脉分割的完整流程,从DICOM数据导入到三维重建,涵盖环境配置、视图优化、心脏区域分割及冠脉精细分割等关键步骤。针对常见问题提供实用解决方案,帮助医学影像从业者高效完成心血管结构分析,提升诊断准确性。

weixin_29271053的博客 627

智能家居DIY:用51单片机实现三合一环境监测(温湿度+烟雾+自动灭火)

本文详细介绍了如何利用STC89C52单片机打造智能家居三合一环境监测系统,集成温湿度检测、烟雾报警和自动灭火功能。从硬件选型、电路设计到软件编程,提供完整的DIY方案,帮助读者构建高性价比的家庭安全防护系统,特别适合智能家居爱好者和电子DIY初学者。

yhn4567890的博客 689

【数据结构】堆的基本操作

本篇博客主要来介绍堆的基本结构和操作,其中重要的点在于堆的向上调整和向下调整的实现,这两个函数的实现是堆这个数据结构最核心的地方,也是后面我们实现堆排序和TOP-K问题的关键。

Brant_zero的博客 1379

如何用 Python 实现自动化测试?详细步骤和代码示例

Python自动化测试实战指南 本文系统介绍了使用Python构建自动化测试体系的完整方案。主要内容包括: 环境搭建:Python 3.8+虚拟环境配置,安装pytest、Selenium等核心测试库 分层测试实现: 单元测试:通过计算器示例演示pytest断言和异常测试 API测试:使用requests库进行RESTful接口验证 UI测试:Selenium WebDriver实现网页交互测试 高级特性: 使用fixture管理测试依赖 参数化实现数据驱动测试 生成HTML和Allure测试报告 GitH

m0_64424835的博客 448

数据结构之堆的基本操作

今天我们来说一说堆,堆是一个完全二叉树,堆分大堆和小堆。 小堆: 这个树的根节点是这个树中的最小的元素 对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值. 大堆: 这个树的根节点是这个树种的最大元素 对于任意一个子树来说, 子树的根节点, 大于左右孩子节点的值. 下面我们画图来说明一下。 下面我们实现堆的基本操作 1、定义一个堆 我们定义一个堆的结构体,将堆...

yummy_alice的博客 532

飞书文档API深度使用指南:如何用n8n社区节点绕过HTTP Request的复杂配置

本文详细解析了如何利用n8n社区节点简化飞书文档API的集成过程,绕过复杂的HTTP Request配置。通过n8n-feishu-lite社区节点,开发者可以轻松实现飞书文档的创建、编辑和查询操作,大幅提升自动化工作流的效率。文章还提供了高级应用场景和性能优化建议,帮助开发者更好地利用飞书开放平台的API功能。

weixin_29227585的博客 83

多传感器标定全栈系统学习教程

无论是激光雷达(Lidar)、毫米波雷达(Radar)、相机(Camera)还是惯导(IMU),传感器之间的精确标定直接决定了系统的可靠性与性能。本文将以系统化的视角,梳理多传感器标定的核心知识体系,并分享一套覆盖全栈技术的学习路径。Calibration)是实现点云与图像融合的前提,而雷达与车辆的标定(Radar2Car)则是精准速度估计的关键。:Lidar2Car、Camera2Car的快速标定流程,标定板布置规范。:从单传感器标定入手(如相机内参),逐步过渡到多传感器联合标定。

weixin_41792788的博客 904

数据结构-堆和PriorityQueue

通过之前的介绍,队列是一种先进先出(FIFO)的数据结构,但是优先情况下,操作的数据可能带有优先级,并不希望按照队列原始的顺序进行出栈,可能优先级高的元素想先出队列在生活中有一个很常见的例子:当你在用听歌的时候,突然接到电话,音乐会自动停止,而执行通话的操作优先级队列(PriorityQueue)是一种特殊的队列,其中的每个元素都有一个优先级,队列会根据优先级来决定元素的出队顺序,优先级高的元素先出队,优先级低的元素后出队,如果两个元素的优先级相同,则按照它们入队列的顺序出队。

2301_76928097的博客 1401

手把手教你学simulink实例:基于Simulink的风力发电系统建模与仿真

风力发电作为一种清洁、可再生的能源形式,近年来得到了快速发展。风力发电系统的性能优化和控制策略设计对于提高发电效率、降低运行成本具有重要意义。本项目旨在使用MATLAB/Simulink平台,对风力发电系统进行建模与仿真,研究其动态特性,并验证控制策略的有效性。通过建立风力发电机、传动系统、发电机及电力电子变换器等子系统的模型,实现对风力发电系统的全面分析。

MHD0815的博客 557

浅谈数据结构_堆[更新中]

定义堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: - 堆总是一棵完全二叉树; - 堆中某个节点的值总是不大于或不小于其父节点的值;操作假设现在有一个堆(小根堆): tot=1; 现在加入一个数7,我们将其看作一个节点,加入到堆: 这是我们发现没有改变堆的性质,于是我们不用理他,接着加入数3,同理,生成节点,加入到堆: 堆的性质依旧没有改变,继续加入数0:

kyrie lrving的博客 328

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构(长期更新)第10讲:堆

上节课我们学习了树的基本知识,这节课我们来介绍一种特殊的二叉树——堆(Heap)为什么说堆是一种特殊的二叉树呢?堆首先是一棵满完全二叉树(回顾定义,即除了最后一层每一层的结点的度都达到最大2)分类:堆分为大堆(大根堆)和小堆(小根堆)大根堆即每个子树的父结点都大于子结点,小根堆即每个子树的父结点都小于子结点结构:堆作为树结构的一种,自然是遵循树的结构逻辑结构:树的逻辑结构和顺序表的逻辑结构完全不同,是非线性的存储结构:树的存储结构有两种,线性存储和链式存储,下面我们将围绕两种存储结构详细展开。

2401_88066253的博客 537

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【数据结构】FibonacciHeap 斐波那契堆(更新时间:2016-04-07)

FibonacciHeap 斐波那契堆 Doge 今天已经怒怼了一下午的数据结构projec-bonus,写了大概500+的代码,已经不省人事。 关于斐波那契堆的相关内容来自于转载,请戳原文链接查看! 下面附上链接:斐波那契堆与二项堆

KuroNeko黑猫 486

java 堆的数据结构_数据结构之堆

// heap.java// demonstrates heaps// to run this program: C>java HeapAppimport java.io.*;////////////////////////////////////////////////////////////////class Node{private int iData; // ...

weixin_28939623的博客 172

堆的初识

v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}p/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}v/:textbox {display:none;}幻灯片 6.O {color:w

饕饕不绝的专栏 693

堆的实现 Heap

一定要注意堆排序和堆操作的区别和联系。堆的一个特点是原地操作,所以不要申请新的空间来存堆,原地操作即可。 堆的最初始操作是堆的建立、堆的调整,进阶操作是堆的新元素插入和堆的元素删除。这里的插入和删除是可以对堆中的任何一个元素进行的。而堆排序实际上是堆操作的一个片面的应用,其插入和操作都是在堆的起始和末尾进行的。

LUCKYOJ 2344

【数据结构】什么是堆

#

weibo_dm的博客 2万+

堆

堆(heap)亦被称为:优先队列(priority queue) 逻辑定义:n个元素序列{k1,k2...ki...kn},当且仅当满足下列关系时称之为堆: (ki<= k2i,ki<= k2i+1)或者(ki>= k2i,ki>= k2i+1), (i = 1,2,3,4...n/2) 堆的实现通过构造二叉堆(binary heap),实为二叉树的一种;由于...

weixin_30483013的博客 96

【数据结构】树(堆、哈夫曼树、二叉排序树、AVL树、)(更新中....)

但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。若二叉树中最多只有最下面两层的结点的度数可以小于2,并且最下面一层的叶子结点都依次排列在该层最左边的位置上,则这样的二叉树称为完全二叉树(complete binary tree)注意:由于变化前C的平衡因子不一定为0,可能是0,-1,1,3种情况下,A,B的最终平衡因子有所不同。插入某个节点后,如果该节点的父节点的平衡因子==0,则它的爷爷一定平衡。

ProcedureStone的博客 789

AtCoder Beginner Contest 170 E Smart Infants 堆+难点在于如何删除堆中指定节点

AtCoder Beginner Contest 170 比赛人数10527 比赛开始后4分钟看到A题,在比赛开始后第5分钟看到所有题 总目录详见https://blog.youkuaiyun.com/mrcrack/article/details/104454762 在线测评地址https://atcoder.jp/contests/abc170/tasks/abc170_e ...

mrcrack的博客 591

POJ 2442 Sequence (堆)

一道好题,利用堆求前N小和 题目给出m个长度为n数组,每个数组抽一个数字的和的前n小 算法描述: sort(all data) build_heap for data[0][0]+data[1][0], data[0][0]+data[1][1]...... for(i from 1 to end)        for(j from 0 to end)

xtq的专栏 1338

动态堆

在一个最小堆中减少其中元素的值,这个堆能够动态地维护结构。这样就不需要多次对程序进行排序。 [0]=  0  1 ||[1]=  1  2 ||[2]=  4  3 ||[3]=  9  9 ||[4]=  16  10 ||[5]=  5  6 ||[6]=  16  7 ||[7]=  9  8 ||[8]=  4  4 ||[9]=  1  5 || [0]=  0  2 ||[1]=

chenbingchenbing的专栏 851

堆应用

额,我又回来啦!!!

bright_light_in_dark的博客 667
上一篇: 【算法】有意思的算法题(附pyhon3代码){更新中}
下一篇: 【数据结构】红黑树{更新中}
vectorX
博客等级 码龄11年 37粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值