当前位置: 首页 > news >正文

数据结构之堆

堆的定义与基本概念

堆是一种特殊的完全二叉树,也叫优先级队列,满足以下性质之一:

  • 最大堆:任意节点的值大于或等于其子节点的值(根节点为最大值)。
  • 最小堆:任意节点的值小于或等于其子节点的值(根节点为最小值)。

堆的存储方式

堆通常通过数组实现,利用完全二叉树的特性进行索引映射:

  • 对于节点 i(从 0 开始计数):
    • 父节点索引:(i - 1) // 2
    • 左子节点索引:2i + 1
    • 右子节点索引:2i + 2

堆的操作

插入元素(上浮)向上调整多用于插入

  1. 将新元素添加到数组末尾。
  2. 比较新元素与其父节点的值,若违反堆性质则交换。
  3. 重复上浮过程直至满足堆性质。

删除堆顶元素(下沉)向下调整多用于构建堆和删除元素

  1. 交换堆顶与数组末尾元素,并删除末尾元素。
  2. 从堆顶开始,比较当前节点与子节点的值,若违反堆性质则与较大(最大堆)或较小(最小堆)的子节点交换。
  3. 重复下沉过程直至满足堆性质。

堆的构建

时间复杂度O(n)(自底向上调整)。

  1. 从最后一个非叶子节点开始(索引 n//2 - 1)。
  2. 对每个节点执行下沉操作,确保子树满足堆性质。

代码示例(Java)

import java.util.ArrayList;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: zhany* Date: 2025-10-24* Time: 19:48*/
public class Piorory {int[] elem;int usedSize;public Piorory(){this.elem = new int[10];}public void initElem(int[] array) {for (int i = 0; i < array.length; i++) {this.elem[i] = array[i];this.usedSize++;}}public void creatHeap(){for (int parent = (this.usedSize-2)/2; parent >=0; parent--) {siftDown(parent,this.usedSize);}}
//向下调整主要是用于构建堆和删除顶部元素private void siftDown(int parent, int usedSize) {int child = 2*parent +1;while(child<usedSize){if(child+1<usedSize && elem[child] <elem[child+1]){child ++;}if(elem[child] >elem[parent]){swap(elem,child,parent);parent = child;child = 2*parent+1;} else{break;}}}private void swap(int[]elem,int child, int parent) {int tmp = elem[child];elem[child] = elem[parent];elem[parent] = tmp;}//向上主要是用于插入元素public void shifUp(int child){int parent = (child-1)/2;while(parent >= 0){if (elem[child] > elem[parent]) {swap(elem,child,parent);child = parent;parent = (child -1)/2;} else{break;}}}public void offer(int val){if(isFull()){elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize] = val;shifUp(usedSize);usedSize++;}public  boolean isFull(){return  usedSize == elem.length;}public boolean isEmpty(){return usedSize == 0;}public int peek(){if (isEmpty()) {return -1;}return elem[0];}public void printHeap() {for (int i = 0; i < usedSize; i++) {System.out.print(elem[i] + " ");}System.out.println();}
}
http://www.dtcms.com/a/528331.html

相关文章:

  • 【Linux学习笔记】日志器与线程池设计
  • 【Linux系统编程】编辑器vim
  • 鸿蒙ArkTS入门教程:小白实战“易经”Demo,详解@State、@Prop与List组件
  • 扩散模型与UNet融合的创新路径
  • 从入门到精通的鸿蒙学习之路——基于鸿蒙6.0时代的生态趋势与实战路径
  • 704.力扣LeetCode_二分查找
  • 如何做企业网站宣传wordpress 显示空白
  • 机器学习库的线性回归预测
  • 旅游网站开发研究背景北京欢迎您
  • 做网站要学什么东西企业网站运维
  • Orleans Grain Directory 系统综合分析文档
  • 从PN结到GPIO工作模式
  • 面向社科研究者:用深度学习做因果推断(三)
  • 深度学习-MNIST手写数字识别(MLP)
  • K8s 静态持久化存储详解
  • wordpress seo 能提高网站速度吗
  • GitHub等平台形成的开源文化正在重塑特尔恩恩
  • 追根索源:换不同的词嵌入(词向量生成方式不同,但词与词关系接近),会出现什么结果?
  • 视频与音频碰撞,谷歌 Veo 3.1,生成“有声电影”,人物对话超震撼
  • 【PID】基本PID控制 chaprt1 学习笔记
  • 【大语言模型 103】推理服务监控:性能指标、故障诊断与自动恢复实战
  • 网站广东海外建设集团有限公司做网站工资多钱
  • Julia 字符串处理指南
  • volatile关键词探秘:从咖啡厅的诡异订单到CPU缓存之谜
  • 嵌入式Lua脚本编程核心概念
  • VScode开发环境搭建(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • 基于springboot的车辆管理系统设计与实现
  • WPF GroupBox 淡入淡出
  • Dify从入门到精通 第33天 基于GPT-4V构建图片描述生成器与视觉问答机器人
  • 网页制作与网站建设实战教程视频网站一般用什么数据库