python实现最小堆
最小堆特点:
- 类似一颗完全二叉树
- 二叉树中所有的父节点的值都小于其子节点;
- 根节点的值必定是所有节点中最小的。
父节点值不大于子节点且根节点值最小称为最小堆,反之称为最大堆。最大堆和最小堆没有本质上的区别。如下图是一个典型的最小堆:
方法一:
从根节点(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实现最小堆相关推荐
- 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 ...
- python 最小堆类型: heapq
目录 1.heapq 的常用方法 2.几个例子 a.最小堆的创建以及增删 b.如何使用 heapq 创建最大堆 c.获取第 k 大/第 k 小数据 d.列表中的元素是元组 heapq 是 python ...
- python 中的最大堆和最小堆(heapq库)
目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...
- python库整理:heapq 最小堆
1,最小堆的创建 要创建堆,请使用初始化为[]的列表,或者可以通过函数heapify()将填充的列表转换为堆 2,主要函数 heappush(heap,item) 将值项推入堆,保持堆不变 heapq ...
- 【算法——Python实现】最大堆和最小堆
# _*_ encoding:utf-8 _*_ """ 最大堆 """class MaxHeap(object):# def __init ...
- python实现最大堆,最小堆和堆排序
目录 0.什么是堆 1.最大堆的实现 2.最小堆的实现 3.堆排序 0.什么是堆 小堆和大堆分为如下图: 堆需要满足的条件: 1. 必须是二叉树,且必须是完全二叉树 2. 各个父节点必须大于或小于左右 ...
- Python - 最小堆实现与应用
一.引言 前面写到了 最大堆的实现应用,趁热打铁把最小堆的也搞定,最小堆一定意思上和最大堆的实现相同,这不过"大"的概念变成了"小",不同认知下,可以理解为两个 ...
- Java实现最小堆一
2019独角兽企业重金招聘Python工程师标准>>> Java实现最小堆一 堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. ...
- 使用最小堆使用优先级队列(c语言版本)
下面的例子来自Weiss的<数据结构与算法分析:c语言描述>,自己亲自敲了一遍,跑了个demo,并将结果记录下来. binheap.h的头文件声明 //description: 使最小堆实 ...
最新文章
- rpm 使用手册 (谷歌翻译)
- Qt Creator应用3D效果
- hive清空外表数据
- python anaconda和pycharm_Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项...
- 【全网最实用】最常用Windows快捷键和Windows命令整理
- 网络爬虫学习笔记——网络爬虫简介
- 2022数学建模美赛D题详细思路获取
- 23种设计模式之代理模式(动态代理)
- 核心乐理---五线谱基础
- python使用cer证书进行https访问接口
- 简单聊聊PostgreSQL buffer与OS cache
- android网络图片查看器,Android网络应用(图片查看器)
- 目标检测 图像分割 MASK-RCNN
- openssl evp
- UE4(一):游戏起点流程图
- 设计模式(10)--蝇量模式
- Quartz查询所有的定时任务
- 腾讯:企鹅帝国的风雨路
- 广州穗雅医院健康小贴士:秋冬季节唇炎防护指南
- 强化学习入门8—深入理解DDPG
热门文章
- 如何安装mysql在linux,如何在Linux中安装MySQL?
- linux命令行使用ppt,linux图形界面与命令行.ppt
- HTML5实现DTMF(电话拨号按键信号)解码、编码,代码简单易于移植
- 微信公众平台添加深圳通余额查询功能
- Web Component 详解
- TiDB数据库常用监控指标-TiDB
- 计算机通信与网络(二)—— 物理层(一)—— 数据与信号
- Silverlight4.0(1) 之 第一个Silverlight程序
- MacOS环境下安装dlib(清华源)
- vacode允许c_在Windows10上用VSCode搭建C语言环境