堆结构(算法村第十四关青铜挑战)

堆结构是一种非常重要的基础数据结构,也是算法的重要内容,很多题目甚至只能用堆来进行。

由于堆的构造和维护过程都非常复杂,因此面试时一般不需要手写堆的实现过程,但是java、python、C++已经提供了一些工具,因此需要知道思路就可以。

本关主要介绍堆如何增删改查的,不用管代码怎么写,后面再介绍如何使用堆来解决问题

堆的概念与特征

堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一个一维数组中的结构。堆有两种结构,一种称为大顶堆,一种称为小顶堆。

  • 小顶堆:任意节点的值均小于等于它的左右孩子,并且最小的值位于堆顶,即根节点处。
  • 大顶堆:任意节点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根节点处。

有些地方也叫大根堆、小根堆,或者最大堆、最小堆。

区分优先队列与堆

优先队列:说到底还是一种队列,它的工作就是poll / peek出队列中最大/最小的那个元素,所以叫带有优先级的队列。能够实现优先功能的策略不一定只有堆,例如二项堆、平衡树、线段树、C++里会用二进制分组的vector来实现一个优先队列。

堆: 堆是一个很大的概念,它并不一定是完全二叉树。我们之前用完全二叉树是因为这样数据容易被数组储存。但是除了这种二叉堆之外,我们还有二项堆、斐波那契堆,这些堆就不属于二叉树。

所以说,优先队列和堆不是一个同level的概念 ,但是java的PriorityQueue就是堆实现的,因此在java领域可以认为堆就是优先级队列,优先级队列就是堆,换做其他场景则不行

堆的构造过程

若父节点下标为 i (从0开始记),则左孩子下标为 2i+1,左孩子下标为 2i+2.

所以,若左孩子的下标为 j ,则父节点下标为 (j - 1) / 2;若右孩子的下标为 j ,则父节点下标为 (j - 2) / 2

构造过程、插入操作、删除操作请移步链接

1.青铜挑战------堆结构 (yuque.com)

相关推荐
wfeqhfxz25887821 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
Aaron15881 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
_不会dp不改名_3 小时前
leetcode_3010 将数组分成最小总代价的子数组 I
算法·leetcode·职场和发展
你撅嘴真丑5 小时前
字符环 与 变换的矩阵
算法
早点睡觉好了5 小时前
重排序 (Re-ranking) 算法详解
算法·ai·rag
gihigo19985 小时前
基于全局自适应动态规划(GADP)的MATLAB实现方案
算法
ctyshr6 小时前
C++编译期数学计算
开发语言·c++·算法
zh_xuan6 小时前
最小跳跃次数
数据结构·算法
yumgpkpm6 小时前
2026软件:白嫖,开源,外包,招标,晚进场(2025年下半年),数科,AI...中国的企业软件产业出路
大数据·人工智能·hadoop·算法·kafka·开源·cloudera
孞㐑¥6 小时前
算法—队列+宽搜(bfs)+堆
开发语言·c++·经验分享·笔记·算法