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

heapq.heapify构建小顶堆的流程

代码示例

import heapqlst = [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 等操作获取元素,仍然会保持堆的特性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电脑新加的硬盘如何分区?新加硬盘分区选MBR还是GPT
  • ⭕️【论文阅读】《Interactive Class-Agnostic Object Counting》
  • Spring-包扫描
  • Go sdk下载和配置环境变量
  • 60、PHP 实现 单词查找树算法
  • M.2接口
  • STM32 GPIO 模块
  • VsCode无法远程调试
  • 如何理解供应链控制塔?详解供应链控制塔类型与架构!
  • MiniCPM-V: A GPT-4V Level MLLM on Your Phone 手机上的 GPT-4V 级多模态大模型
  • 哪个牌子手持洗拖一机好?多款热门家用洗地机推荐
  • Java | Leetcode Java题解之第324题摆动排序II
  • Mac安装nvm以及配置环境变量
  • Docker高级应用讲解
  • ForkJoin框架的解析
  • ES6系列(二)变量的解构赋值
  • Git初体验
  • JavaWeb(学习笔记二)
  • Java方法详解
  • linux安装openssl、swoole等扩展的具体步骤
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Python 反序列化安全问题(二)
  • Redash本地开发环境搭建
  • Webpack 4x 之路 ( 四 )
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 力扣(LeetCode)22
  • 码农张的Bug人生 - 见面之礼
  • 那些年我们用过的显示性能指标
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一道面试题引发的“血案”
  • 在Mac OS X上安装 Ruby运行环境
  • 【云吞铺子】性能抖动剖析(二)
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (12)Linux 常见的三种进程状态
  • (8)STL算法之替换
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)appium-desktop定位元素原理
  • (转)重识new
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .describe() python_Python-Win32com-Excel
  • .NET 快速重构概要1
  • .Net(C#)常用转换byte转uint32、byte转float等