数据结构与算法-索引堆及其优化

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、索引堆的基本概念
      • 二、索引堆的操作
      • 三、索引堆的实现
        • 1. 示例数组
        • 2. 索引堆的构建
        • 3. 修改优先级
        • 4. 删除元素
      • 五、总结

引言

索引堆是一种特殊的数据结构,它结合了堆和索引数组的优点,能够高效地支持动态优先队列操作。索引堆通常用于实现优先队列,特别适用于需要频繁修改元素优先级的场景。本文将深入探讨索引堆的基本原理、实现步骤,并通过具体的案例代码详细说明索引堆的每一个细节。

一、索引堆的基本概念

索引堆是一种特殊的堆数据结构,它包含两个主要部分:

  1. 堆数组:存储堆中的元素。
  2. 索引数组:存储堆中元素在堆数组中的位置。

索引堆具有以下特性:

  • 堆序性质:堆中的元素满足最大堆或最小堆的性质。
  • 索引映射:通过索引数组可以快速定位到堆中元素的位置。
  • 动态调整:支持高效地插入、删除和修改元素的优先级。

二、索引堆的操作

索引堆支持以下主要操作:

  1. 插入元素:将新元素添加到堆数组的末尾,并更新索引数组。
  2. 删除元素:删除指定索引对应的元素,并调整堆和索引数组。
  3. 修改优先级:修改指定索引对应元素的优先级,并调整堆以保持堆序性质。
    在这里插入图片描述

三、索引堆的实现

接下来,我们将通过一个示例来详细了解索引堆的实现步骤。

1. 示例数组

考虑一个整数数组 values = [5, 2, 4, 6, 1, 3],以及对应的索引数组 indices = [0, 1, 2, 3, 4, 5]

2. 索引堆的构建

构建索引堆的过程包括:

  1. 初始化:将数组中的元素按顺序放入堆数组,并将索引放入索引数组。
  2. 构建最大堆:从最后一个非叶子节点开始,向下调整以保持堆序性质。
class IndexedHeap:def __init__(self):self.heap = []  # 堆数组self.indices = []  # 索引数组self.index_map = {}  # 索引映射def heapify(self, i):largest = ileft = 2 * i + 1right = 2 * i + 2# 如果左孩子大于根if left < len(self.heap) and self.heap[left] > self.heap[largest]:largest = left# 如果右孩子大于当前最大的if right < len(self.heap) and self.heap[right] > self.heap[largest]:largest = right# 如果最大的不是根if largest != i:# 更新索引映射self.index_map[self.indices[i]] = largestself.index_map[self.indices[largest]] = i# 交换堆数组和索引数组self.heap[i], self.heap[largest] = self.heap[largest], self.heap[i]self.indices[i], self.indices[largest] = self.indices[largest], self.indices[i]self.heapify(largest)def build_max_heap(self):# 从最后一个非叶子节点开始for i in range(len(self.heap) // 2 - 1, -1, -1):self.heapify(i)def insert(self, value, index):self.heap.append(value)self.indices.append(index)self.index_map[index] = len(self.heap) - 1self.up_heap(len(self.heap) - 1)def up_heap(self, i):parent = (i - 1) // 2# 如果当前节点比父节点大if parent >= 0 and self.heap[i] > self.heap[parent]:# 更新索引映射self.index_map[self.indices[i]] = parentself.index_map[self.indices[parent]] = i# 交换堆数组和索引数组self.heap[i], self.heap[parent] = self.heap[parent], self.heap[i]self.indices[i], self.indices[parent] = self.indices[parent], self.indices[i]self.up_heap(parent)def delete(self, index):i = self.index_map[index]last_index = len(self.heap) - 1# 更新索引映射self.index_map[self.indices[last_index]] = idel self.index_map[index]# 交换堆数组和索引数组self.heap[i], self.heap[last_index] = self.heap[last_index], self.heap[i]self.indices[i], self.indices[last_index] = self.indices[last_index], self.indices[i]# 删除最后一个元素del self.heap[last_index]del self.indices[last_index]# 调整堆if i < len(self.heap):self.heapify(i)self.down_heap(i)def down_heap(self, i):largest = ileft = 2 * i + 1right = 2 * i + 2# 如果左孩子大于根if left < len(self.heap) and self.heap[left] > self.heap[largest]:largest = left# 如果右孩子大于当前最大的if right < len(self.heap) and self.heap[right] > self.heap[largest]:largest = right# 如果最大的不是根if largest != i:# 更新索引映射self.index_map[self.indices[i]] = largestself.index_map[self.indices[largest]] = i# 交换堆数组和索引数组self.heap[i], self.heap[largest] = self.heap[largest], self.heap[i]self.indices[i], self.indices[largest] = self.indices[largest], self.indices[i]self.down_heap(largest)# 示例数组
values = [5, 2, 4, 6, 1, 3]
indices = [0, 1, 2, 3, 4, 5]# 创建索引堆实例
heap = IndexedHeap()# 插入元素
for i, value in enumerate(values):heap.insert(value, indices[i])# 构建最大堆
heap.build_max_heap()# 打印堆数组和索引数组
print("Heap Array:", heap.heap)
print("Index Array:", heap.indices)
3. 修改优先级

修改优先级的过程包括:

  1. 更新堆数组:更新指定索引对应的元素值。
  2. 调整堆:根据更新后的值,调整堆以保持堆序性质。
def change_priority(self, index, new_value):i = self.index_map[index]old_value = self.heap[i]# 更新堆数组self.heap[i] = new_value# 如果新值比旧值大,则上浮调整if new_value > old_value:self.up_heap(i)# 如果新值比旧值小,则下沉调整else:self.down_heap(i)# 修改索引为2的元素的优先级
heap.change_priority(2, 8)# 打印堆数组和索引数组
print("Heap Array after changing priority:", heap.heap)
print("Index Array after changing priority:", heap.indices)
4. 删除元素

删除元素的过程包括:

  1. 交换元素:将要删除的元素与堆的最后一个元素交换。
  2. 调整堆:重新调整堆以保持堆序性质。
# 删除索引为1的元素
heap.delete(1)# 打印堆数组和索引数组
print("Heap Array after deletion:", heap.heap)
print("Index Array after deletion:", heap.indices)

五、总结

索引堆是一种非常实用的数据结构,尤其适用于需要频繁修改元素优先级的应用场景。在实际编程中,索引堆可以用于实现高效的优先队列,例如在图算法、任务调度等领域有着广泛的应用。通过上述实现,你可以根据自己的需求进一步扩展和优化索引堆的功能。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【数据结构与算法】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

数据结构与算法相关文章索引文章链接
数据结构与算法-插入排序数据结构与算法-插入排序
数据结构与算法-希尔排序数据结构与算法-希尔排序
数据结构与算法-归并排序数据结构与算法-归并排序
数据结构与算法-随机快速排序数据结构与算法-随机快速排序
数据结构与算法-双路快速排序数据结构与算法-双路快速排序
数据结构与算法-三路排序数据结构与算法-三路排序
数据结构与算法-关于堆的基本存储介绍数据结构与算法-关于堆的基本存储介绍
数据结构与算法-关于堆的基本排序介绍数据结构与算法-关于堆的基本排序介绍
数据结构与算法-优化堆排序数据结构与算法-优化堆排序

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的档案管理系统(带1w+文档)

基于SpringBootVue的档案管理系统(带1w文档) 基于SpringBootVue的档案管理系统(带1w文档) 随着信息化的不断发展&#xff0c;科技的进步也越来越大。软件编程是一个不断发展的行业&#xff0c;每个行业都必须进行适合自身特点的系统开发&#xff0c;才能在机构中生存和发展。当…

区块链技术在智能城市中的创新应用探索

随着全球城市化进程的加速和信息技术的快速发展&#xff0c;智能城市成为了未来城市发展的重要方向。在智能城市建设中&#xff0c;区块链技术作为一种去中心化、安全和透明的分布式账本技术&#xff0c;正逐渐展现出其在优化城市管理、提升公共服务和增强城市安全性方面的潜力…

【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架

简介 Vanna是基于检索增强(RAG)的sql生成框架 Vanna 使用一种称为 LLM&#xff08;大型语言模型&#xff09;的生成式人工智能。简而言之&#xff0c;这些模型是在大量数据&#xff08;包括一堆在线可用的 SQL 查询&#xff09;上进行训练的&#xff0c;并通过预测响应提示中最…

JVM: 堆上的数据存储

文章目录 一、对象在堆中的内存布局1、对象在堆中的内存布局 - 标记字段2、JOL打印内存布局 二、元数据指针 一、对象在堆中的内存布局 对象在堆中的内存布局&#xff0c;指的是对象在堆中存放时的各个组成部分&#xff0c;主要分为以下几个部分&#xff1a; 1、对象在堆中的…

真没想到BitLocker加密的系统碰上CrowdStrike蓝屏故障也能恢复如初!

网管小贾 / sysadm.cc 三声金钟响&#xff0c;六阵御鼓催。 百官列两扉&#xff0c;天子临朝威。 是日早朝&#xff0c;八宝金殿之中&#xff0c;天子端坐龙椅上。 群臣山呼&#xff1a;“万岁&#xff0c;万岁&#xff0c;万万岁……&#xff01;” 天子面沉似水、不怒自威…

【数学建模】【优化算法】:【MATLAB】从【一维搜索】到】非线性方程】求解的综合解析

目录 第一章&#xff1a;一维搜索问题 黄金分割法 股票交易策略优化 总结&#xff1a; 第二章&#xff1a;线性规划 线性规划&#xff08;Simplex 算法&#xff09; 生产计划优化 总结&#xff1a; 第三章&#xff1a;无约束非线性优化问题 梯度下降法 神经网络训练…

elementUI 的el-date-picker日期,开始时间不能大于结束时间

需求描述:form表单里有开始日期和结束日期,要求开始日期不能大于结束日期,但是开始日期可以等于结束日期。 效果如下: 实现代码: <el-form ref="form" :model="form" :rules="rules" label-width="140px"><el-form-it…

Docker镜像拉取失败解决方案

文章目录 问题及分析解决方案1.先排查DNS2.修改源3.重启docker服务 问题解决 问题及分析 今天我用docker拉取镜像的时候报错 error pulling image configuration: download failed after attempts6: dial tcp xxx.xx.xxx.xx:xxx: i/o timeout 连接超时大概率以下两个问题 1.DN…

队列...

队列的定义 队列是一种操作受限的线性表,只允许表的一端在进行插入,而在表的另一端进行删除,其操作特征为先进先出. 队头:允许删除的一端 队尾:允许插入的一端 队列的基本操作 InitQueue(&Q) 初始化 isEmpty(Q) 判断空 EnQueue(&Q,x)入队 DeQueue(&Q,&…

基于北京市空气质量影响因素研究系统【城市可换爬虫获取、LSTM、Flask、Echarts、MySQL、TensorFlow】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主研究背景国内外研究现状研究目的研究意义关键技术理论介绍数据采集数据分析与大屏设计大屏相关性分析LSTM模型训练系统集成展示总结每文一语 有需要本项目的代码或文档以及全部资源&#xf…

【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…

Python面试宝典第23题:分发糖果

题目 n 个孩子站成一排&#xff0c;给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求&#xff0c;给这些孩子分发糖果。 &#xff08;1&#xff09;每个孩子至少分配到 1 个糖果。 &#xff08;2&#xff09;相邻两个孩子评分更高的孩子会获得更多的糖果。 请…

【linux上快速安装python】

linux上安装python 1.下载必须的编译工具【前置条件】2. 下载python源码3.解压3.1 配置环境变量3.2 SSL证书生成4.配置安装5.配置软连接6. 给pip配置软连接7.使用pip安装gbase8sdeploy8. pip安装pyinstaller9.遇到问题 1.下载必须的编译工具【前置条件】 sudo yum install gcc…

苦学Opencv的第十四天:人脸检测和人脸识别

Python OpenCV入门到精通学习日记&#xff1a;人脸检测和人脸识别 前言 经过了十三天的不懈努力&#xff0c;我们终于也是来到了人脸检测和人脸识别啦&#xff01;相信大家也很激动吧。接下来我们开始吧&#xff01; 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识…

一些数据结构面试题

常见时间复杂度代码 时间复杂度&#xff1a;执行时间和数据规模之间的增长关系 O(logn) while (i <n) {i i * 2; } O(n * logn)

丹摩智算:如何在云端开发一个AI应用——基于UNet的眼底血管分割案例

目录 0 写在前面1 云实例&#xff1a;配置选型与启动1.1 登录注册1.2 配置SSH密钥对1.3 创建实例1.4 登录云实例 2 云存储&#xff1a;数据集上传与下载3 云开发&#xff1a;眼底血管分割案例3.1 案例背景3.2 网络搭建3.3 网络训练3.4 模型测试 总结粉丝福利 0 写在前面 DAMOD…

PHP回收废品平台系统小程序源码

&#x1f30d;绿色行动&#xff0c;从“回收废品平台系统”开始&#xff01;&#x1f69a; &#x1f6aa;【家门口的环保站&#xff0c;废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已&#xff0c;不知该如何处理&#xff1f;现在&#xff0c;“…

Vue3 加载条(LoadingBar)

效果如下图&#xff1a;在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小&#xff0c;单位 pxnumber2falsecolorLoading加载中颜色string‘…

二进制部署k8s集群之cni网络插件flannel和calico工作原理

3、部署 CNI 网络组件 在 master01 节点上操作 上传flannel-v0.21.5.zip并解压 unzip flannel-v0.21.5.zipscp flannel*.tar 192.168.80.20:/opt/k8s/ scp flannel*.tar 192.168.80.30:/opt/k8s/ node两个节点操作 cd /opt/k8s/ docker load -i flannel.tar docker load -i …

外设购物平台

目 录 一、系统分析 二、系统设计 2.1 系统功能设计 2.2 数据库设计 三、系统实现 3.1 注册功能 3.2 登录功能 3.3 分页查询所有商品信息功能 3.4 分页条件&#xff08;精确、模糊&#xff09;查询商品信息功能 3.5 购物车功能 3.6 订单管理功能 四、项…