首页 > 其他分享 >数据结构:堆 heap

数据结构:堆 heap

时间:2023-08-06 12:12:16浏览次数:37  
标签:大顶 heap 元素 pop key 小顶 数据结构 节点

堆分为小顶堆和大顶堆,其本质是一颗完全二叉树,不同点在于:

除叶子节点外,小顶堆的每个父节点的key都要比其左右两个子节点的key小;大顶堆的每个父节点的key都要比其左右两个子节点的key大。

其中,key是节点的取值,index为节点在树中的索引或者位置。小顶堆/大顶堆的特点在于,其根节点一定是整个数中最小或者最大的元素,这个也是其区别于其他数据结构最大的特点

以大顶堆为例,先来说说其最主要的两个操作addpop是如何实现的:

.add()

  • 在往已有的大顶堆中添加元素时,将新元素作为树的最后的一个节点
  • 比较新节点与其父节点:如果新节点的值大于父节点,那么交换父节点和新节点的位置(其实就是交换两个元素的值)
  • 重复上述步骤,直到新节点比其父节点小,或者当前新节点的位置已经是根节点了,那么停止上述循环即可,此时大顶堆更新完毕。

.pop()

从大顶堆中弹出元素,是指弹出堆的根节点,也就是弹出堆中取值最大的元素。弹出根节点之后,需要对堆进行调整,以使得其还是一个大顶堆

  • 将堆的最后一个叶子节点移到根节点的位置
  • 从根节点开始,比较根节点和其左右子节点的元素大小,若根节点不是都比子节点大,那么根节点与其较大的一个子节点进行交换
  • 只要存在子节点,那么继续比较父节点和左右子节点的大小,直到当前节点已经是叶子节点或者它比它的左右子节点取值都大,那么停止循环,最大堆已经更新完毕

小顶堆的刚好相反,每一个子树的父节点key值总是小于其两个子节点的key值,因此pop和push方法与大顶堆的原理也十分相似。

参考:

https://zhuanlan.zhihu.com/p/77583063?utm_id=0

标签:大顶,heap,元素,pop,key,小顶,数据结构,节点
From: https://www.cnblogs.com/Higgerw/p/17609257.html

相关文章

  • C/C++ 数据结构-直接选择排序
    #include<iostream>#include<Windows.h>usingnamespacestd;voidswap(int*num1,int*num2){inttemp=*num1;*num1=*num2;*num2=temp;}intmain(){intret[]={161,156,170,164,158,180,159,185,172,176};intlen=......
  • 数据结构(一)数据结构与算法
    目录算法时间复杂度T(n)=O(f(n))空间复杂度S(n)=O(f(n))算法算法是一系列程序指令,用于处理特定的运算和逻辑问题。例:1+2+3...+100inti,sum=0,n=100;for(i=1;i<=n;i++){ sum=sum+i;}printf("%d",sum);等差数列:Sn=(a1+an)*n/2=n*a1+n*(n-1)*d......
  • 【笔记】数据结构专题
    恐怖一大堆Ynoi,一大堆不会的以后再来吧https://vjudge.csgrandeur.cn/article/39088.5数据结构扫描线P5490【模板】扫描线对坐标离散化。维护\(a,b\),\(a\)是相邻两个矩形高度差,\(b_i\)初始全零,操作是\(b[l,r]+=v\),询问\(\sum_{i}a[b_i\geq1]\)。维护\(\min,\sum......
  • 【数据结构】散列表
    这种查找结构与线性表和树形结构都不同,前两者的共同特点是关键字与记录位置之间没有确定关系,需要从一个起点不断进行比较查找位置。可以知道散列表(哈希表)是一种完全不同机制的查找结构,不采用基于比较选择的查找机制,而是直接在关键字与位置之间建立映射。所以在讨论它时也和上面......
  • C/C++ 数据结构五大核心算法之贪心算法_钱币找零问题
    贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪婪算法并没有固定的算法解决框架,......
  • 考研数据结构——每日一题[二叉排序树]
    3786.二叉排序树你需要写一种数据结构,来维护一些数,其中需要提供以下操作:插入数值x。删除数值x。输出数值x的前驱(前驱定义为现有所有数中小于x的最大的数)。输出数值x的后继(后继定义为现有所有数中大于x的最小的数)。题目保证:操作1插入的数值各不相同。操作......
  • C/C++ 数据结构五大核心算法之回溯法-N皇后问题
    N皇后问题:在n*n的棋盘上要摆n个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数n,返回n皇后的摆法数。#include<iostream>#include<math.h>#defineN8usingnamespacestd;intq[N+1];//q[i]表示第i个皇后在第i行上的第q[i]列intcheck(i......
  • 数据结构-算法-01-算法初步
     ......
  • 树上数据结构
    树上问题树链剖分学习笔记重链剖分对树进行重链优先搜索,暴力求一条路径的复杂度为logn模板voidtree_build(intu,intfa){//重链优先搜索 siz[u]=1; f[u]=fa; hson[u]=0; for(auto&v:adj[u]){deep[v]=deep[u]+1; if(v==fa)continue; tree_build(v,u);......
  • 【数据结构 | 入门】堆栈与队列(问题引入&实现&算法优化)
    ......