堆及其java手写实现

堆(Heap)是计算机科学中一种常用且高效的数据结构,通常被实现为一个完全二叉树。这个树形结构中的每个节点都有一个关联的值,并且这个值遵循一定的规则,从而使得堆具备特殊的性质,主要分为两种类型:大顶堆和小顶堆。

基本概念:

  • 完全二叉树:这是一种特殊的二叉树,除了最后一层外,每一层都被完全填满,最后一层的节点都尽可能地靠左排列。

  • 数组表示:由于完全二叉树的特性,堆常通过数组来紧凑存储,其中数组的索引关系反映了节点间的父子关系。例如,在数组中,索引i的节点的父节点是索引i/2(向下取整),而其左、右孩子分别是索引2i和2i+1。

堆的性质:

  • 大顶堆:在每个节点上,父节点的值总是大于或等于其孩子的值。因此,堆的根节点是整个堆中的最大值。

  • 小顶堆:与大顶堆相反,每个节点的值总是小于或等于其孩子的值,使得堆的根节点是整个堆中的最小值。

1 代码实现

package org.example.code;/*** @author Mazai-Liu* @time 2024/6/22*/
public class MyHeap {private int[] heapArray;private int heapSize;public MyHeap(int maxHeapSize) {heapArray = new int[maxHeapSize + 1];heapSize = 0;heapArray[0] = Integer.MIN_VALUE; // 使用哨兵元素,简化索引计算}public MyHeap(int[] nums) {heapArray = new int[nums.length + 1];System.arraycopy(nums, 0 , heapArray, 1, nums.length);heapSize = nums.length;heapArray[0] = Integer.MIN_VALUE; // 使用哨兵元素,简化索引计算for(int i = heapSize / 2; i >= 1; i --) {minHeapify(i);}}// 向堆中插入一个元素public void insert(int value) {if (heapSize == heapArray.length - 1) {throw new IllegalStateException("Heap is full.");}heapSize++;heapArray[heapSize] = value;int current = heapSize;while (heapArray[current] < heapArray[current / 2]) {swap(current, current / 2);current = current / 2;}}// 删除并返回堆中的最小元素public int top() {if (isEmpty()) {throw new IllegalStateException("Heap is empty.");}int root = heapArray[1];heapArray[1] = heapArray[heapSize];heapSize--;minHeapify(1);return root;}// 查看堆顶元素public int peek() {if (isEmpty()) {throw new IllegalStateException("Heap is empty.");}return heapArray[1];}// 检查堆是否为空public boolean isEmpty() {return heapSize == 0;}// 调整堆,使其满足小根堆性质private void minHeapify(int index) {int left = 2 * index;int right = 2 * index + 1;int smallest = index;if (left <= heapSize && heapArray[left] < heapArray[index]) {smallest = left;}if (right <= heapSize && heapArray[right] < heapArray[smallest]) {smallest = right;}if (smallest != index) {swap(index, smallest);minHeapify(smallest);}}// 交换两个元素的位置private void swap(int i, int j) {int temp = heapArray[i];heapArray[i] = heapArray[j];heapArray[j] = temp;}// 主函数用于测试public static void main(String[] args) {int[] nums = new int[]{3,1,9,5,4,6,7,2,0,8};MyHeap minHeap = new MyHeap(nums);while(!minHeap.isEmpty()) {System.out.println(minHeap.top());}}
}

2 用途

  1. 优先级队列:堆是实现优先级队列的常见方式,可以快速插入元素和删除(提取)最高优先级的元素(即堆顶元素)。

  2. 堆排序:利用堆的性质可以进行高效的排序,特别是对于大量数据的排序非常有效。

  3. 任务调度:在操作系统中用于决定哪些进程或任务优先执行。

  4. Top k、数据流中位数问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

方差分析【单/双因素方差分析】

文章目录 方差分析一、单因素方差分析&#xff08;Analysis of Variance&#xff09;1.方差分析在做什么&#xff1f;2.方差分析的思路&#xff1a;3.方差分析中的计算&#xff1a;4.构造F统计量&#xff1a; 二、双因素方差分析(Two-way ANOVA)1.双因素方差分析在做什么&#…

时序预测 | Matlab基于Transformer多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于Transformer多变量时间序列多步预测&#xff1b; 2.多变量时间序列数据集&#xff08;负荷数据集&#xff09;&#xff0c;采用前96个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&#xff1b; 3…

53【场景作图】纵深感

1 想清楚什么是前 什么是后 如果背景虚化,就不要处理地很平面,如果很平面,就留一个清晰的边缘 2 重叠 遮挡 被遮挡的物体会更远

Java中的内存管理:从堆到栈的深入解析

Java中的内存管理&#xff1a;从堆到栈的深入解析 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我将为大家详细介绍Java中的内存管理&#x…

微信小程序在独立分包中安装自定义依赖组件,构建自定义 npm 依赖

在微信小程序app.json文件中创建一个独立分包 然后在分包文件夹下 创建一个 package.json文件&#xff0c;在文件中添加你要安装的依赖文件及版本 在终端中开始安装依赖&#xff1a;npm i 依赖安装完成后&#xff0c;会产生一个 node_modules文件 需要项目的根目录下的projec…

动态规划:基本概念

Dynamic Programming 动态规划&#xff08;Dynamic Programming, DP&#xff09; 是一种算法设计技巧&#xff0c;通常用来解决具有重叠子问题和最优子结构性质的问题。它通过将问题分解为更小的子问题&#xff0c;逐步解决这些子问题并将结果存储起来&#xff0c;以避免重复计…

【深度学习】python之人工智能应用篇——图像生成技术(二)

说明&#xff1a; 两篇文章根据应用场景代码示例区分&#xff0c;其他内容相同。 图像生成技术&#xff08;一&#xff09;&#xff1a;包含游戏角色项目实例代码、图像编辑和修复任务的示例代码和图像分类的Python代码示例 图像生成技术&#xff08;二&#xff09;&#xff1a…

外星人Alienware m18R1 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

Redis源码学习:从头开始掌握Redis核心设计

Redis 代码整体架构 了解 Redis 代码的整体架构将帮助我们快速定位各个功能模块对应的代码文件&#xff0c;并全面了解 Redis 的功能。 Redis 目录结构 Redis 的源码总目录下包含四个子目录&#xff1a;deps、src、tests 和 utils。每个目录都有其特定的作用。通过了解目录结…

React逻辑复用的方式都有哪些

在日常开发中&#xff0c;能够优雅的复用组件和逻辑&#xff0c;是优秀开发者的职责。在react中&#xff0c;复用逻辑的方式有很多&#xff0c;可以适用于不同的业务场景。今天说三个比较有代表性的&#xff0c;Render Props、HOC、Hooks Render Props 创建一个接受函数作为其…

PyQt学习之简介

1.Python图形界面称为程序的用户交互界面&#xff0c;英文称之为 UI (user interface) Tkinter 基于Tk的Python库&#xff0c;Python官方采用的标准库&#xff0c;优点是作为Python标准库、稳定、发布程序较小&#xff0c;缺点是控件相对较少。 wxPython 基于wxWidgets的Py…

“拿来主义”学习边框动画(附源码)

“拿来主义”学习边框动画&#xff0c;附源码&#xff0c;CV可用 扫码关注&#xff1a;小拾岁月&#xff0c;发送 “边框动画”&#xff0c;获取源码。 需求分析 从边框的旋转动画&#xff0c;我们可以看出&#xff0c;可以在按钮元素的下方添加给 360旋转 的元素。同时&…

观察者模式(大话设计模式)C/C++版本

观察者模式 扩展&#xff1a;观察者模式——委托 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15905936.html #include <iostream> #include <list> #include <memory> #include <string> using namespace std;// Observer类 抽象观…

人工智能导论笔记

有关知识表示和推理的零碎知识点 人工智能导论复习题和概念-CSDN博客 机器学习篇 机器学习分类&#xff08;根据样本数据是否带有标签&#xff09;&#xff1a;监督的机器学习、无监督的机器学习、半监督学习。 监督学习又称为“有教师学习”。在监督学习中&#xff0c;模型…

MySQL 面试突击指南:核心知识点解析2

事务并发可能引发的问题 MySQL 是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有多个客户端与之连接,每个客户端与服务器连接后,可以称为一个会话(Session)。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就…

在 RK3568 上构建 Android 11 模块:深入解析 m、mm、mmm 编译命令

目录 Android 编译系统概述编译命令简介 环境准备使用 m、mm、mmm 编译模块编译整个源码树编译单个模块编译指定目录下的模块 高级应用并行编译清理编译结果编译特定配置 在 Android 开发中&#xff0c;特别是在 RK3568 这样的高性能平台上&#xff0c;有效地编译和管理模块是确…

什么是距离选通型水下三维激光扫描仪?(下)

距离选通激光水下成像的发展 距离选通激光成像技术始于上世纪60年代&#xff0c;受制于高性能脉冲激光器和选通成像器件发展的制约&#xff0c;激光距离选通成像技术在随后的二十年发展缓慢&#xff0c;直到20世纪90年代&#xff0c;随着硬件技术的不断成熟&#xff0c;该技术…

Prompt 提示词工程:翻译提示

近期在对计算机学习时&#xff0c;许多内容需要看原始的英文论文&#xff0c;对于我这种学渣来说特别不友好&#xff0c;&#x1f937;&#x1f3fb;‍♀️无奈只能一边看翻译&#xff0c;一边学习。 之前有搜到过专门的翻译工具&#xff0c;无奈都是按照字数算费用的&#xf…

【FreeRTOS】删除任务 用遥控器控制音乐

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 学习视频&#xff1a;【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教程 基于STM32&#xff0c;以实际项目为导向&#xff09;】 【精准空降到 01:22】 https://www.bilibili.com/video/BV1…

模拟原神圣遗物系统-小森设计项目,设计圣遗物词条基类

项目分析 首先需要理解圣遗物的方方面面 比如说圣遗物主词条部分和副词条部分都有那些特点 稍等一会&#xff1a;原神&#xff0c;启动&#xff01; 在此说明了什么&#xff1f; 这是完全体 &#xff1a;主副 词条都有 如果 升级直接暴击率 那么就留点 或者是另外的元素充能 …