最小堆特点:

  • 类似一颗完全二叉树
  • 二叉树中所有的父节点的值都小于其子节点;
  • 根节点的值必定是所有节点中最小的。

父节点值不大于子节点且根节点值最小称为最小堆,反之称为最大堆。最大堆和最小堆没有本质上的区别。如下图是一个典型的最小堆:

方法一:
从根节点(index = 0)遍历到最后一个拥有子节点的节点(index = N//2 -1),将父节点与其子节点值作比较,必要时进行交换即可。完成一次上述过程后就能完成最底层节点的归位了。元素个数为N的二叉树层数为ceil(log2n),因此一共执行floor(log2n)次上述过程就能实现最小堆的建堆了。

如下例:

import math
def heap(li):n=len(li)for i in range(0,int(math.log(n,2))):for j in range(0,n//2):if 2*j+2<n and li[2*j+2]<li[2*j+1]:k=2*j+2else:k=2*j+1if li[k]<li[j]:li[k],li[j]=li[j],li[k]
d
if __name__ == '__main__':li=[1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]heap(li)print(li)

结果:[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]

方法2:
思路还是一样,这次从最后一个拥有子节点的节点向上遍历

import mathdef heap2(li,root):if 2*root+1<len(li):if 2*root+2<len(li) and li[2*root+2]<li[2*root+1]:k=2*root+2else:k=2*root+1if li[k]<li[root]:li[k],li[root]=li[root],li[k]heap2(li,k)
if __name__ == '__main__':for i in range(len(li)//2-1,-1,-1):heap2(li,i)print(li)

结果:[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]

python实现最小堆相关推荐

  1. LeetCode 973. K Closest Points to Origin--TopK 问题--最小堆--C++,Python解法

    题目地址:K Closest Points to Origin - LeetCode We have a list of points on the plane. Find the K closest ...

  2. python 最小堆类型: heapq

    目录 1.heapq 的常用方法 2.几个例子 a.最小堆的创建以及增删 b.如何使用 heapq 创建最大堆 c.获取第 k 大/第 k 小数据 d.列表中的元素是元组 heapq 是 python ...

  3. python 中的最大堆和最小堆(heapq库)

    目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...

  4. python库整理:heapq 最小堆

    1,最小堆的创建 要创建堆,请使用初始化为[]的列表,或者可以通过函数heapify()将填充的列表转换为堆 2,主要函数 heappush(heap,item) 将值项推入堆,保持堆不变 heapq ...

  5. 【算法——Python实现】最大堆和最小堆

    # _*_ encoding:utf-8 _*_ """ 最大堆 """class MaxHeap(object):# def __init ...

  6. python实现最大堆,最小堆和堆排序

    目录 0.什么是堆 1.最大堆的实现 2.最小堆的实现 3.堆排序 0.什么是堆 小堆和大堆分为如下图: 堆需要满足的条件: 1. 必须是二叉树,且必须是完全二叉树 2. 各个父节点必须大于或小于左右 ...

  7. Python - 最小堆实现与应用

    一.引言 前面写到了 最大堆的实现应用,趁热打铁把最小堆的也搞定,最小堆一定意思上和最大堆的实现相同,这不过"大"的概念变成了"小",不同认知下,可以理解为两个 ...

  8. Java实现最小堆一

    2019独角兽企业重金招聘Python工程师标准>>> Java实现最小堆一 堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. ...

  9. 使用最小堆使用优先级队列(c语言版本)

    下面的例子来自Weiss的<数据结构与算法分析:c语言描述>,自己亲自敲了一遍,跑了个demo,并将结果记录下来. binheap.h的头文件声明 //description: 使最小堆实 ...

最新文章

  1. rpm 使用手册 (谷歌翻译)
  2. Qt Creator应用3D效果
  3. hive清空外表数据
  4. python anaconda和pycharm_Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项...
  5. 【全网最实用】最常用Windows快捷键和Windows命令整理
  6. 网络爬虫学习笔记——网络爬虫简介
  7. 2022数学建模美赛D题详细思路获取
  8. 23种设计模式之代理模式(动态代理)
  9. 核心乐理---五线谱基础
  10. python使用cer证书进行https访问接口
  11. 简单聊聊PostgreSQL buffer与OS cache
  12. android网络图片查看器,Android网络应用(图片查看器)
  13. 目标检测 图像分割 MASK-RCNN
  14. openssl evp
  15. UE4(一):游戏起点流程图
  16. 设计模式(10)--蝇量模式
  17. Quartz查询所有的定时任务
  18. 腾讯:企鹅帝国的风雨路
  19. 广州穗雅医院健康小贴士:秋冬季节唇炎防护指南
  20. 强化学习入门8—深入理解DDPG

热门文章

  1. 如何安装mysql在linux,如何在Linux中安装MySQL?
  2. linux命令行使用ppt,linux图形界面与命令行.ppt
  3. HTML5实现DTMF(电话拨号按键信号)解码、编码,代码简单易于移植
  4. 微信公众平台添加深圳通余额查询功能
  5. Web Component 详解
  6. TiDB数据库常用监控指标-TiDB
  7. 计算机通信与网络(二)—— 物理层(一)—— 数据与信号
  8. Silverlight4.0(1) 之 第一个Silverlight程序
  9. MacOS环境下安装dlib(清华源)
  10. vacode允许c_在Windows10上用VSCode搭建C语言环境