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

数据结构===堆

文章目录

  • 概要
    • 2条件
    • 大顶堆
    • 小顶堆
  • 堆的实现
    • 插入元素
    • 删除堆顶元素
  • 堆代码
  • 小结

概要

堆,有趣的数据结构。

那么,如何实现一个堆呢?

堆,有哪些重点:

  1. 满足2条件
  2. 大顶堆
  3. 小顶堆

2条件

2条件:

  1. 堆是一个完全二叉树
  2. 堆中的每个节点的值都必须大于等于或小于等于其树中每个节点的值

堆要满足这2个条件,重点。即使后边插入数据,或者删除数据之后,还是要满足这2个条件来做调整。

大顶堆

特点:
每个节点的值都大于等于子树中每个节点值的堆。

小顶堆

特点:
每个节点的值都小于等于子树中每个节点值的堆。

堆的实现

实现一个堆,重要的操作:插入元素和删除堆顶元素

插入元素

堆化:顺着节点所在的路径,向上或者向下,对比,然后交换。
来看下插入的代码:

public class Heap {private int[] a; // 数组,从下标1开始存储数据private int n;  // 堆可以存储的最大数据个数private int count; // 堆中已经存储的数据个数public Heap(int capacity) {a = new int[capacity + 1];n = capacity;count = 0;}public void insert(int data) {if (count >= n) return; // 堆满了++count;a[count] = data;int i = count;while (i/2 > 0 && a[i] > a[i/2]) { // 自下往上堆化swap(a, i, i/2); i = i/2;}}}

删除堆顶元素

由大顶堆和小顶堆的定义可知,堆顶元素要么最大,要么最小;

public void removeMax() {if (count == 0) return -1; // 堆中没有数据a[1] = a[count];--count;heapify(a, count, 1);
}private void heapify(int[] a, int n, int i) { // 自上往下堆化while (true) {int maxPos = i;if (i*2 <= n && a[i] < a[i*2]) maxPos = i*2;if (i*2+1 <= n && a[maxPos] < a[i*2+1]) maxPos = i*2+1;if (maxPos == i) break;swap(a, i, maxPos);i = maxPos;}
}

堆代码

来看个完整的代码吧,这里给python的。如下:

import sys 
class BinaryHeap:def __init__(self, capacity):self.capacity = capacityself.size = 0self.Heap = [0]*(self.capacity + 1)self.Heap[0] = -1 * sys.maxsizeself.FRONT = 1def parent(self, pos):return pos//2def leftChild(self, pos):return 2 * pos       def rightChild(self, pos):return (2 * pos) + 1def isLeaf(self, pos):if pos >= (self.size//2) and pos <= self.size:return Truereturn Falsedef swap(self, fpos, spos):self.Heap[fpos], self.Heap[spos] = self.Heap[spos], self.Heap[fpos]def heapifyDown(self, pos):if not self.isLeaf(pos):if (self.Heap[pos] > self.Heap[self.leftChild(pos)] or self.Heap[pos] > self.Heap[self.rightChild(pos)]):if self.Heap[self.leftChild(pos)] < self.Heap[self.rightChild(pos)]:self.swap(pos, self.leftChild(pos))self.heapifyDown(self.leftChild(pos))else:self.swap(pos, self.rightChild(pos))self.heapifyDown(self.rightChild(pos))def insert(self, element):if self.size >= self.capacity :returnself.size+= 1self.Heap[self.size] = elementcurrent = self.sizewhile self.Heap[current] < self.Heap[self.parent(current)]:self.swap(current, self.parent(current))current = self.parent(current)def minHeap(self):for pos in range(self.size//2, 0, -1):self.heapifyDown(pos)def delete(self):popped = self.Heap[self.FRONT]self.Heap[self.FRONT] = self.Heap[self.size]self.size-= 1self.heapifyDown(self.FRONT)return poppeddef isEmpty(self):return self.size == 0def isFull(self):return self.size == self.capacity

小结

关于堆,就这么多吧

堆的概念跟推理还是相对来说简单的。比红黑树简单点。其实都一样的,只要按照那些规则,一条一条对着去理解;应该还好。

相关文章:

数据结构===堆

文章目录 概要堆2条件大顶堆小顶堆 堆的实现插入元素删除堆顶元素 堆代码小结 概要 堆&#xff0c;有趣的数据结构。 那么&#xff0c;如何实现一个堆呢&#xff1f; 堆 堆&#xff0c;有哪些重点&#xff1a; 满足2条件大顶堆小顶堆 2条件 2条件&#xff1a; 堆是一个…...

AAA、RADIUS、TACACS、Diameter协议介绍

准备软考高级时碰到的一个概念&#xff0c;于是搜集网络资源整理得出此文。 概述 AAA是Authentication、Authorization、Accounting的缩写简称&#xff0c;即认证、授权、记帐。Cisco开发的一个提供网络安全的系统。AAA协议决定哪些用户能够访问服务&#xff0c;以及用户能够…...

Nacos高频面试题及参考答案(2万字长文)

目录 Nacos是什么?它的主要功能有哪些? Nacos在微服务架构中扮演什么角色?...

CMakeLists.txt语法规则:条件判断中表达式说明四

一. 简介 前面学习了 CMakeLists.txt语法中的 部分常用命令&#xff0c;常量变量&#xff0c;双引号的使用。 前面几篇文章也简单了解了 CMakeLists.txt语法中的条件判断&#xff0c;文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;条件判断说明一-CSDN博客 CMa…...

Hive概述

Hive简介 Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据. 它是Facebook在2008年8月开源的一个数据仓库框架,提供了类似于SQL语法的HQL(HiveSQL)语句作为数据访问接口. Hive可以做复查统计分析之类的工作; 利用hdfs的存储空间,进行结构化数据的存储; 利…...

buuctf-misc-33.[BJDCTF2020]藏藏藏1

33.[BJDCTF2020]藏藏藏1 题目&#xff1a;藏了很多层&#xff0c;一层一层的剥开 常规思路&#xff0c;先使用010打开一下看看 binwalk不行用foremost 发现是pk文件也就是压缩包&#xff0c;并且包含了docx文件 这不binwalk分离一下文件&#xff1f;虽然可以看出有隐藏文件&…...

golang 基础知识细节回顾

之前学习golang的速度过于快&#xff0c;部分内容有点囫囵吞枣的感觉&#xff0c;写gorm过程中有很多违反我常识的地方&#xff0c;我通过复习去修正了我之前认知错误和遗漏的地方。 itoa itoa自增的作用在编辑error code时候作用很大&#xff0c;之前编辑springboot的error c…...

递归陷阱七例

目录 栈溢出 无限递归 大常数参数 递归深度过大 重复计算 函数调用开销 递归与迭代的选择 总结 递归是一种强大的编程技术&#xff0c;它允许函数调用自身。递归在很多情况下可以简化代码&#xff0c;使问题更容易理解和解决。然而&#xff0c;递归也容易导致一些常见的…...

【3D基础】坐标转换——地理坐标投影到平面

汤国安版GIS原理第二章重点 1.常见投影方式 https://download.csdn.net/blog/column/9283203/83387473 Web Mercator投影&#xff08;Web Mercator Projection&#xff09;&#xff1a; 优点&#xff1a; 在 Web 地图中广泛使用&#xff0c;易于显示并与在线地图服务集成。在…...

颈椎锻炼方式

1. 颈部伸展运动&#xff1a;坐直&#xff0c;慢慢将头向前伸展&#xff0c;直到感到轻微的拉伸&#xff0c;保持数秒钟&#xff0c;然后缓慢放松。重复10次。 2. 颈部旋转运动&#xff1a;坐直&#xff0c;慢慢将头向一侧转动&#xff0c;直到感到轻微的拉伸&#xff0c;保持…...

测试环境搭建:JDK+Tomcat+Mysql+Redis

基础的测试环境搭建&#xff1a; LAMPLinux(CentOS、ubuntu、redhat)ApacheMysqlPHP LTMJLinux(CentOS、ubuntu、redhat)TomcatMysql(Oracle)RedisJava 真实的测试环境搭建&#xff1a;&#xff08;企业真实的运维&#xff09; 基于SpringBoot&#xff08;SpringCloud分布式微…...

(delphi11最新学习资料) Object Pascal 学习笔记---第11章第1节(混合引用中的错误)

11.1.3 混合引用中的错误 ​ 在使用对象时&#xff0c;你通常应该只使用对象变量或接口变量来访问它们。混合使用这两种方法会破坏对象 Pascal 所提供的引用计数机制&#xff0c;并可能导致极难跟踪的内存错误。在实践中&#xff0c;如果你决定使用接口&#xff0c;你可能应该…...

代码随想录算法训练营第三天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表

对于链表完全陌生&#xff0c;但是看题目又觉得和数组一样的 链表理论基础 Q&#xff1a;什么是链表&#xff1f; A&#xff1a;链表是由一系列结点组成的。每一个结点由两部分组成&#xff1a;数据和指针。 203.移除链表元素 题目&#xff1a; 给你一个链表的头节点 head 和…...

如何利用仪表构造InfiniBand流量在数据中心测试中的应用

一、什么是Infiniband&#xff1f; 在当今数据爆炸的时代&#xff0c;数据中心作为信息处理的中心枢纽&#xff0c;面临着前所未有的挑战。传统的通信方式已经难以满足日益增长的数据传输需求&#xff0c;而InfiniBand技术的出现&#xff0c;为数据中心带来了全新的通信解决方…...

Kubernetes 文档 / 概念 / Kubernetes 架构 / 节点

Kubernetes 文档 / 概念 / Kubernetes 架构 / 节点 此文档从 Kubernetes 官网摘录 中文地址 英文地址 节点上的组件包括 kubelet、 容器运行时以及 kube-proxy。 管理 向 API 服务器添加节点的方式主要有两种&#xff1a; 节点上的 kubelet 向控制面执行自注册&#xff1b…...

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习

ICode国际青少年编程竞赛- Python-1级训练场-for循环练习 1、 for i in range(3):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()3、 for i in range(3):Dev.step(2)Dev.turnRight()Dev.step(2)Dev.turnLeft()4、 for…...

Flutter分模块开发、模块可单独启动、包含Provider

前言 当前案例 Flutter SDK版本&#xff1a;3.13.2 目前Flutter都是在一个项目中&#xff0c;创建不同目录进行模块开发&#xff0c;我进行Android原生开发时&#xff0c;发现原生端&#xff0c;是可以将每个模块独立运行起来的&#xff0c;灵感来自这&#xff1b; 折腾了几…...

Element-UI快速入门:构建优雅的Vue.js应用界面

Element-UI是一套基于Vue.js的组件库&#xff0c;提供了丰富的UI组件和交互效果&#xff0c;帮助开发者快速构建出美观、功能丰富的Web应用界面。本文将介绍如何快速入门Element-UI&#xff0c;并搭建一个简单的示例界面。 步骤一&#xff1a;安装Element-UI 首先&#xff0c…...

Flutter 中的 @immutable:深入解析与最佳实践

在 Flutter 开发中&#xff0c;immutable 注释扮演着至关重要的角色&#xff0c;用于标记不可变类。不可变类顾名思义&#xff0c;其状态一旦创建便不可更改&#xff0c;这与可变类截然不同。后者允许在创建后对实例进行修改。 immutable 的利好 引入不可变类可以带来诸多优势…...

Pandas数据可视化 - Matplotlib、Seaborn、Pandas Plot、Plotly

可视化工具介绍 让我们一起探讨Matplotlib、Seaborn、Pandas Plot和Plotly这四个数据可视化库的优缺点以及各自的适用场景。这有助于你根据不同的需求选择合适的工具。 1. Matplotlib 优点: 功能强大&#xff1a;几乎可以用于绘制任何静态、动画和交互式图表。高度可定制&a…...

终极指南:如何免费快速完成OFD转PDF的完整教程

终极指南&#xff1a;如何免费快速完成OFD转PDF的完整教程 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 如果你经常处理电子发票、政府公文或电子证照&#xff0c;那么OFD转PDF的需求一定不陌生。O…...

DLSS Swapper:3个技巧彻底改变你的游戏性能优化体验

DLSS Swapper&#xff1a;3个技巧彻底改变你的游戏性能优化体验 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款革命性的游戏性能优化工具&#xff0c;它让你能够轻松管理NVIDIA DLSS、AMD FSR和Int…...

3步永久保存微信聊天记录:WeChatMsg开源工具让你真正拥有个人数据主权

3步永久保存微信聊天记录&#xff1a;WeChatMsg开源工具让你真正拥有个人数据主权 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Tr…...

5个技巧完全掌握Video Subtitle Remover:AI硬字幕去除终极指南

5个技巧完全掌握Video Subtitle Remover&#xff1a;AI硬字幕去除终极指南 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除&#xff0c;无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API&#xff0c;本地实现。AI-based…...

魔兽争霸3终极优化工具:5分钟搞定所有兼容性问题

魔兽争霸3终极优化工具&#xff1a;5分钟搞定所有兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》在现代电脑上的各种问…...

从选型到调试:MCP2517FD与ATA6563收发器搭配实战避坑指南

从选型到调试&#xff1a;MCP2517FD与ATA6563收发器搭配实战避坑指南 在工业控制和车载电子系统中&#xff0c;CAN FD总线技术正逐步取代传统CAN总线&#xff0c;成为高速数据传输的新标准。作为硬件工程师&#xff0c;我们常常面临这样的挑战&#xff1a;如何在有限的项目周期…...

如何用WeChatMsg将微信聊天记录永久保存为个人数字资产

如何用WeChatMsg将微信聊天记录永久保存为个人数字资产 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …...

低查重AI写教材指南:借助工具,快速打造优质教材!

关于AI教材创作工具的介绍 在编写教材时&#xff0c;资料的支持是至关重要的&#xff0c;但传统的资料整合方式已经逐渐不能满足现代的需求。以往&#xff0c;需要从课标文档、学术研究到教学案例&#xff0c;信息常常散落在知网、教研平台等多个地方&#xff0c;想要筛选出有…...

从零打造机甲战士:我的STM32 RoboMaster开发实战入门

1. 从玩具到战士&#xff1a;为什么选择STM32开发RoboMaster机器人 第一次看到RoboMaster比赛视频时&#xff0c;我被那些灵活移动、精准射击的机甲深深震撼。作为一个电子爱好者&#xff0c;我立刻萌生了自己打造参赛机器人的想法。但在选择开发平台时&#xff0c;我遇到了所有…...

构建AI增强的第二大脑:从知识管理到智能创造的实战指南

1. 项目概述&#xff1a;构建你的第二大脑AI助手 在信息爆炸的时代&#xff0c;我们每天都在被海量的文章、播客、笔记和想法淹没。你有没有过这样的经历&#xff1a;明明记得读过一篇非常有洞见的文章&#xff0c;但需要用到时却怎么也想不起具体内容&#xff0c;甚至连标题都…...