【数据结构与算法】如何构建最小堆

news2024/12/28 3:01:18

最小堆的定义

最小堆,作为一种独特且重要的数据结构,它是一种特殊的二叉树。在这种二叉树中,有一个关键的规则:每一个父节点所存储的值,都必然小于或者等于其对应的子节点的值。这一规则确保了根节点总是承载着整个堆中的最小数值。

例如,下面这样一个简单的结构就是最小堆:

    1
  /   \
 3     2

在这个例子中,根节点的 1 毫无疑问是整个堆中数值最小的元素。

最小堆的表示

一般来说,最小堆是通过数组形式来表示。最小堆是完全二叉树,而对于一棵完全二叉树:

如果一个节点的编号为 i ,那么它的左子节点的编号为 2 * i + 1 ,右子节点的编号为 2 * i + 2

例如,节点 0 的左子节点编号为 2 * 0 + 1 = 1 ,右子节点编号为 2 * 0 + 2 = 2

节点 1 的左子节点编号为 2 * 1 + 1 = 3 ,右子节点编号为 2 * 1 + 2 = 4 ,以此类推。

这种编号规则使得在数组中表示完全二叉树时,可以方便地通过索引计算来快速找到节点的子节点,从而高效地进行最小堆的相关操作,如插入、删除等。

最小堆的操作

插入操作

当我们要将一个新元素插入到最小堆中时,首先会将这个元素添加在堆的末尾位置。随后,通过一系列细致的比较和交换操作,逐步将这个新元素向上调整,直至其处于一个合适的位置,从而确保最小堆的性质始终得以维持。

删除操作

在删除操作中,我们针对的是最小堆的根节点,因为它代表着整个堆中的最小值。执行删除操作时,会将堆中的最后一个元素移动到根节点的位置。然后通过比较找到最小值,并将其与堆的根节点交换。然后,重复这个过程,直到堆中的元素全部满足最小堆的性质。

示例

首先,假设我们给定一个特定的序列:

在这里插入图片描述

那么,其最小堆的构建过程会是这样:

在这里插入图片描述

需要特别留意的是,每次在将新的节点插入到堆的最后位置时,都必须与父节点进行严谨的比较操作,直至完全符合最小堆的性质要求。

然后我们删除一个元素
在这里插入图片描述

先将4移动到根节点,然后与两个子节点比较找到最小值

Python 内置的 heapq

在 Python 语言中,heapq 模块为我们提供了以下主要方法:

  1. heapq.heappush(heap, item) :此方法用于将 item 插入到 heap 当中,并且在插入过程中始终维持堆的固有性质。
  2. heapq.heappop(heap) :其功能是弹出并返回 heap 中的最小元素。
  3. heapq.heapify(heap) :能够将给定的列表 heap 直接转换为一个堆,而且是在原地进行修改。

依靠 heapq 模块的这些强大功能,我们能够迅速且高效地构建和操作最小堆。

比如:

import heapq

heap = [5, 2, 8, 1]
heapq.heapify(heap)  # 将列表转换为堆

heapq.heappush(heap, 3)  # 插入元素

print(heapq.heappop(heap))  # 弹出并返回最小元素

最小堆的应用

优先队列

在众多需要依据元素优先级来进行处理的场景当中,最小堆都能够发挥出显著的重要作用,从而成为构建优先级队列的理想之选。比如在复杂的任务调度场景里,任务往往被赋予不同的优先级。在这种情况下,具有最高优先级(也就是拥有最小的优先级值)的任务将会被优先安排处理。这一特性使得最小堆能够在这种需要精确排序和快速处理的环境中表现出色,极大地提高了任务处理的效率和准确性。

排序算法

以堆排序为例,其充分利用了最小堆所独有的特性,从而得以实现对数据的高效排序。堆排序的过程中,通过巧妙地构建和调整最小堆,能够以相对较少的操作次数和较低的时间复杂度完成对大量数据的排序工作。与其他常见的排序算法相比,堆排序在处理大规模数据时具有明显的优势,能够在较短的时间内获得准确的排序结果。

TOPK 问题

在面对 TOPK 问题时,可以精心维护一个设定了最大容量的最小堆。当堆中的元素数量达到最大容量时,将位于堆顶的元素弹出。与此同时,把新的元素插入到堆中。通过这种动态的调整和更新,能够确保在任何时刻,堆中都保存着当前最为关键的前 K 个元素。这一方法在处理大量数据并需要快速筛选出特定数量的重要元素时非常有效,极大地提高了数据处理的效率和针对性。

图算法

在某些复杂的图算法中,例如迪杰斯特拉算法用于求解最短路径时,最小堆能够发挥关键作用。它能够从众多尚未访问的节点当中,精准且高效地挑选出距离源点最近的节点。这一特性使得在处理大规模的图数据时,可以快速找到最优的路径或者解决方案,显著减少了计算时间和资源消耗。


2024/08/18

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

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

相关文章

机器学习(3)-- 一元线性回归

文章目录 线性回归训练模型测试模型线性回归方程测试实用性 总结 线性回归 线性回归算法是一种用于预测一个或多个自变量(解释变量)与因变量(响应变量)之间关系的统计方法。这种方法基于线性假设,即因变量是自变量的线…

【学习笔记】Day 16-17

一、进度概述 1、ddnet_main 相关代码学习(预计 3-4 天) 二、详情 1、顶层结构 关于代码顶层结构的一些思考和总结,其中下图为师兄代码的文件结构 总结: 对于一个优秀的代码,其文件结构一定也是清晰的&#…

随笔五、开发板连接WIFI并通过SSH连接泰山派

摘要:通过wifi连接内网,电脑通过SSH连接泰山派 1. 泰山派接入WIFI 泰山派开发板SDK已经集成wifi_start.sh脚本,在脚本后面直接输入wifi名字和密码就能连接wifi rootRK356X:/# wifi_start.sh wifi名字 wifi密码 查看ip地址,wlan0就…

洛谷 P6359 [CEOI2018] Cloud computing

题目本质:贪心01背包(dp) 题目思路:dp[i][j] 表示考虑前 i 台计算机,能够获得 j 个核心时,所能获得的最大价值。将其可以优化为dp[i] 表示能够获得 i 个核心时,所能获得的最大价值。 状态转移…

jira敏捷开发管理工具视频教程Confluence工作流协同开发(2024)

正文: 随着Jira敏捷开发方法论的普及,Jira已经成为全球软件开发团队管理项目、任务和问题的首选工具。为了帮助团队更好地掌握Jira的核心功能,精心准备了一套全面开发技术及案例视频教程——《Jira敏捷开发管理工具视频教程Confluenc…

学习大数据DAY38 hive 安装与配置

目录 hadoop 大数据平台-hive 组件部署介绍 hadoop 大数据平台-Hive 部署步骤 教学视频 上机作业 hadoop 大数据平台-hive 组件部署介绍 metastore:保存关于表、列、分区、数据格式、存储位置等各种元数据信 Driver:负责与 Hive 服务器建立网络连接,使客户端能…

Unity的动画系统

目录 Unity动画系统的最新更新和改进有哪些? 如何在Unity中高效地使用Animator组件进行复杂动画制作? Unity动画系统中的动画混合和分层功能是如何工作的? 动画混合( blend tree) 动画分层 在Unity中创建和管理动…

一键运行RocketMQ5.3和Dashboard

一键运行RocketMQ5.3和Dashboard 目录 一键运行RocketMQ5.3和Dashboard通过Docker Compose 来一键启动运行的容器包括docker-compose.yml文件运行命令启动本地效果查看 参考信息 通过Docker Compose 来一键启动 运行的容器包括 NameServerBrokerProxyDashBoard docker-compo…

RabbitMQ消息队列总结(❤❤❤❤❤)

RabbitMQ那些事 参考一. `RabbitMQ`介绍1.1 Java工程师1.1.1 RabbitMQ学习目标1.1.2 消息队列介绍1.1.3 RabbitMQ介绍各自属性介绍(❤❤❤)二. `RabbitMQ`安装1. 基于Linux1.1 安装1.2 常用命令1.3 后台管理开启与面板介绍三. 客户端`SDK`操作(❤❤了解)1. 客户端依赖2. 生产者…

微信消息防撤回插件

该软件可以恢复别人撤回的消息。 版本特色: 1、看到对方撤回的消息 2、多账号可正常登录 修改原理,如下图: 使用说明: 1、需电脑登录 2、解压后,双击start_wechat.bat来运行软件 下载地址:Wechat防撤…

UE基础 —— 资产和内容包

目录 直接导入资产 使用资产 创建资产 资产引用 管理资产 移动和复制资产 删除资产 导出资产 迁移资产 资产元数据 在虚幻编辑器UI中使用元数据 使用资产元数据 自动重新导入 查找资产引用 替换引用工具 Class Viewer 全局资产选取器 Property Matrix 引擎项…

以node / link文件表征的道路网络-----基于南京公路公开数据做路径规划(下)------dijkstra算法的一些简单花样

在不改变dijkstra算法本身的情况下,完全可以从数据源的角度出发,解决我们的一些简单需求: 比较初级且粗暴的玩法,可以是强行赋予一些link极端的路段长度。 对于我们坚决不希望车辆行驶的道路、禁行区、或是危险区,就…

局域网基础技术详解

虽然在学校学了计算机网络,但还是有些东西要自己去了解。所以这篇博客也算是学校课程和我在网上查找资料总结的一些关于局域网基础技术知识。 一、傻瓜式交换机 一种即插即用、未管理的交换机,不需人工配置的低端交换机。只提供基本的网络连接功能&#…

koa+puppeteer爬虫实践

最近工作中遇到一个使用nodejs实现爬虫程序的任务。需求背景是这样的:公司运营的一个老项目运营那边最近提了SEO优化的需求,但是项目本身并没有做SSR(服务端渲染),公司的要求是花费的人力成本最低,代价最小。在经过一番调研之后团…

Route路由 Vue2

1.路由的概念 2.路由的基本使用 1.安装 因为我们使用的是Vue2 所以使用的 router 是 3版本 当使用Vue3 的时候就使用 router4 npm i vue-router3 2.简单使用 /router/index.js //该文件专门创建整个应用的路由器import VueRouter from vue-router; //引入组件 import MyA…

谷粒商城实战笔记-179~183-商城业务-检索服务-SearchRequest和SearchResponse构建

文章目录 一,179-商城业务-检索服务-SearchRequest构建-检索1,Controller接口 二,180-商城业务-检索服务-SearchRequest构建-排序、分页、高亮&测试三,181-商城业务-检索服务-SearchRequest构建-聚合四,182-商城业…

x64汇编语言与逆向工程实战指南(一)

逆向程序demo网址:https://crackmes.one/,下载的压缩包密码均为.cracksme.one或cracksme.de 实例一:基本 网络钓鱼密码程序 破解 目录 1. DIE确定程序基本信息1.1 DIE程序与下载1.2 分析demo的架构 2. x64dbg调试获取密码2.1 功能初探2.2 调试…

C++基础——合集

1.C关键字(C98) C总计63个关键字,C语言32个关键字 2.命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的…

虚拟机可以玩Steam游戏吗?虚拟机怎么玩Steam Windows游戏 PD19虚拟机玩Steam

你有没有在苹果电脑上玩游戏的需求呢?很多人认为只有“双系统”才能实现Mac电脑运行Windows操作系统,其实不然,近些年来,虚拟机技术在不断发展,越来越多的苹果用户开始使用虚拟机在苹果设备上玩游戏。Steam是一个非常受…

【运维高级内容--KEEPALIVED高可用集群】

目录 1.简介 2.实现master/slave的 Keepalived 单主架构 3.vip通行 (ping通: 4.启用日志功能 5.实现独立子配置文件 6.非抢占式模式 7.抢占延迟模式 8.单播配置 9.keepalived状态切换的通知脚本 10.双主结构:两个虚拟路由(多主模式&…