heapq.heapify构建小顶堆的流程

news2024/9/24 11:21:10

代码示例

import heapq

lst = [2, 3, 4, 6, 9, 1, 5]
heapq.heapify(lst)
print(lst)

流程解释

  1. 初始列表:

    • 列表 lst 在开始时是 [2, 3, 4, 6, 9, 1, 5]
  2. 调用 heapq.heapify(lst):

    • heapify 函数将 lst 转换为一个小顶堆(min-heap)。
    • 在小顶堆中,任意一个父节点的值都小于或等于其子节点的值。
  3. 如何构建小顶堆:

    • 从最后一个非叶子节点开始,逐个向上进行“下沉”操作(sift down),调整节点以满足堆的性质。
    • 对于列表的索引和树形结构的关系:对于索引 i 的节点,其左子节点在 2*i + 1,右子节点在 2*i + 2

实际步骤:

  • 初始列表:

    2
    ├── 3
    ├── 4
    ├── 6
    ├── 9
    ├── 1
    └── 5
    
  • 从最后一个非叶子节点开始:

    • 最后一个非叶子节点索引为 len(lst)//2 - 1(对于这个例子,索引为 2,值为 4)。
  1. 处理索引 2(值 4):

    • 左子节点为 1(索引 5),右子节点为 5(索引 6)。
    • 1 是最小的,交换 4 和 1:
    2
    ├── 3
    ├── 1
    ├── 6
    ├── 9
    └── 4
    └── 5
    
  2. 处理索引 1(值 3):

    • 左子节点 6(索引 3),右子节点 9(索引 4)。
    • 没有交换,因为 3 小于它的子节点。
  3. 处理索引 0(值 2):

    • 左子节点 3(索引 1),右子节点 1(索引 2):
    • 最小的是 1,交换 21:
    1
    ├── 3
    ├── 2
    ├── 6
    ├── 9
    └── 4
    └── 5
    
  4. 最终输出:

    • 完成后,lst 变为 [1, 3, 2, 6, 9, 4, 5]
    • 但是为了符合最小堆的性质,最终顺序可能需要调整(可能还需要进一步的下沉)。
      在这里插入图片描述

完整堆的结果应该是:

运行后 lst 会变为 [1, 3, 2, 6, 9, 4, 5],并且这是最小堆的结构。

总结

heapq.heapify 的作用是将一个列表变为小顶堆,其核心在于“下沉”操作,确保每个父节点的值都小于或等于任何子节点的值。这种操作的时间复杂度为 O(n)。完成后,你可以通过 heapq.heappop 等操作获取元素,仍然会保持堆的特性。

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

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

相关文章

Spring框架漏洞(附修复方法)

Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应…

《UniverSeg: Universal Medical Image Segmentation》ICCV2023

摘要 这篇论文提出了一种名为 UniverSeg 的方法,它能够解决未见过的医学图像分割任务,而无需额外的训练。现有的深度学习模型通常无法泛化到新的解剖结构、图像模式或标签上。UniverSeg 利用一种新的 CrossBlock 机制,通过查询图像和定义新分…

利用tkinter制作简易计算器,页面美观,计算保留4位小数

import tkinter as tk import time window tk.Tk() window.title("简易计算器") window.geometry(300x400) content def btn_onclick(data):global contentif data"AC" or data "MC":expression.set()result.set()content elif data :result…

无人机长生不老秘籍

机身保养 外观检查 1.检查机器表面整洁无划痕无针孔凹陷擦伤、畸变等损坏情况 2.晃动机身,仔细听机身内部有无松动零件或者螺丝在机身内部 桨叶检查 1.有无裂痕、磨损、变形等缺陷,如有明显缺陷建议更换 2.卡扣、紧固件有无松脱或失效,…

嵌入式学习之路 14(C语言基础学习——指针操作一维整型数组)

一、指针基础 指针的概念 地址表示内存单元的编号,也被称为指针。指针既是地址,也是一种专门用于处理地址数据的数据类型。 例如,变量a的地址或者十六进制表示的0x1000都可以视作指针。 指针变量的定义 语法:基类型 * 指针变…

探索灵办AI:智能办公的好帮手

引言 随着AI工具的增多,选择合适的AI助手变得尤为重要。ChatGPT的订阅费用高且功能单一,很多小伙伴开始寻找更具性价比和多功能的替代品。灵办AI以其便捷、高效、多功能的特点,成为许多朋友的新宠。 灵办AI助手是一款多功能的全能AI助手&am…

智能名片信息交流系统应用场景解决方案

智能名片作为传统名片在数字化时代的进化产物,集成了移动互联网、大数据和人工智能等先进技术,为商务交流和客户关系管理带来了全新的体验。 系统主要功能 01内容聚合与展示 企业信息展示:智能名片不仅包含个人基本信息,还能展示…

MDIO C22协议访问MMD寄存器

以太网PHY芯片中SMI(Serial Management Interface)串行管理接口,也称MDIO(Management Data Input/Output),通常作为MII管理接口(MII Management Interface)。有两根线,分别为双向的MDIO和单向的MDC,用于以太网设备中上层对物理层(PHY)的管理。 MDIO接口有两种协议…

LVX+keepalived群集

Keepalived 双 机 热 备 基 础 知 识 Keepalived 起初是专门针对LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover) 和健康检查(Health Checking) 功能——判断 LVS负载调度器、节点服务器的可用性,当master 主机出现故障及时切换到b…

MacOS Anaconda 安装教程及虚拟环境创建

一、下载 Anaconda 1、Anaconda 官网 2、清华大学开源软件镜像站 点 Date 按时间排序,根据自己 Mac 芯片类型下载对应最新版本的。 Intel 芯片的下载 x86_64 版本的Apple m1 芯片的下载 arm64 版本的 二、安装 Anaconda 将安装包下载到本地后,双击安…

人工智能|人工智能教育的发展现状及趋势

智能的热潮正席卷全球。国家在人工智能领域展开战略布局,人工智能人才成为国家急需的高层次技术人才。据领英发布的《全球 Al 领域人才报告》显示,国内人工智能人才缺口达到 500 多万。 毫无疑问,人工智能将不可阻挡地影响所有产业。给自己一…

随手记1.0

easyexcel多级表头导出各级设置样式(继承HorizontalCellStyleStrategy实现) package com.example.wxmessage.entity;import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;…

探索 Amazon Q Developer 那些有趣的功能

我在 McKinsey 2024 年 5 月 30 日提供的一项名为“The state of AI in early 2024-Gen AI adoption spikes and starts to generate value”的调研中读到这么一句话:人工智能在组织中最常见的两个使用职能是:“市场营销和销售”以及“产品和服务开发”&…

vue3-ts:husky + prettier / 代码格式化工具

一、Prettier简介 Prettier是一个流行的代码格式化工具,它的主要作用是帮助开发者自动规范化代码的格式,提高代码的可读性和一致性。Prettier通过解析代码并使用自己的规则重新打印它,以确保代码风格的一致性和符合预设的格式化标准。 二、…

计网学习(四)——网络层

一、网际协议IP 互联网采用的设计思路:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务”,即IP数据报在网络中传输时是不可靠的服务,可能会出现数据丢失等情况TCP/IP体系中网络层常常被称为网际层或IP层与IP协议一起使用…

35分钟教你从0到1,水出SCI(精品),学术裁缝必修课_来自B站水论文的程序猿

系列文章目录 文章目录 系列文章目录一、抽象理解二、具体做法1、什么是Baseline(基础实验)2、怎么和导师说3、怎么做压低baseline 4、怎么写 一、抽象理解 一篇论文A:西红柿炒鸡蛋 一篇论文B:芹菜炒肉 你就可以:西红柿炒肉 二、具体做法 1、什么是Baseline(基础…

视频压缩文件太大了怎么缩小?6个视频压缩技巧,速度收藏起来!

高清视频文件,尤其是那些以 1080p 和 720p 清晰度为特征的视频,通常都拥有相当大的体积,会占据大量计算机存储空间。因此,为了更好地将它们进行分享和存储,您可能需要对它们进行压缩,以减小它们的尺寸。然而…

【秋招笔试】2024-08-07-YT游戏(研发岗)-三语言题解(CPP/Python/Java)

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的题目比较典,…

资料分析6-其他类

一、拉动增长、增量贡献率和容斥问题 1. 拉动增长 拉动增长部分增量/整体前期,即x/A 例题1(2018 年陕西):2017 年,我国电信业务收入12620 亿元,比上年增长6.4%,增速同比提高1 个百分点。……2…

递归:计算思维的核心

引言 人类对这个世界的认识是从特例到普遍,从具体到抽象,从简单到复杂的,是一个递推(Iterative)的过程。这种人类固有的认知与思维方式令我们可以轻易的理解具体的事物,但同时却限制了我们的抽象能力和大局…