在 Python 中实现最小堆

news2024/11/16 17:53:51

树是一种非线性数据结构,其中元素排列在多个级别。 堆是一种基于树的数据结构。

它是一棵完全二叉树,即每个父节点都有两个子节点。 堆实现不同的算法,对其他结构进行排序,对队列进行优先排序等。

堆有两种类型 - 最大和最小。 这些基于子节点与父节点相比的值。

本篇文章将介绍最小堆及其在 Python 中的实现。


Python 中的最小堆

每个父节点都小于或等于最小堆中的子节点。 它遵循升序,优先级总是与较小的节点。

对于给定的节点 n,其左子节点位于 2n+1,右子节点位于 2n+2。

请参见下图。

Python 中的最小堆

在 Python 中,最小堆可以通过两种方式实现。 这些将在下面讨论。


在 Python 中创建一个类来实现最小堆

我们可以创建一个类来实现 Python 中的最小堆。 我们将用堆的大小初始化类对象,并定义方法来执行元素的插入过程并将它们映射到各自的索引。

例子:

import sys
class min_heap:
    def __init__(self, size):
        self.storage=[0]*size
        self.size = size
        self.heap_size = 0
        self.Heap = [0]*(self.size + 1)
        self.Heap[0] = sys.maxsize * -1
        self.parent = 1
        self.root=1
    def parent_idx(self,idx):
        return (idx-1)//2
    def lf_child_idx(self,idx):
        return 2*idx+1
    def rt_child_idx(self,idx):
        return 2*idx+2
    def has_parent(self,idx):
        return self.parent_idx(idx)>=0
    def insert(self,idx):
        if self.heap_size >= self.size :
            return
        self.heap_size+= 1
        self.Heap[self.heap_size] = idx
        heap = self.heap_size
        while self.Heap[heap] < self.Heap[heap//2]:
            self.swap(heap, heap//2)
            heap = heap//2
    def swap(self, left, right):
        self.Heap[left], self.Heap[right] = self.Heap[right], self.Heap[left]
    def print_heap(self):
        for i in range(1, (self.heap_size//2)+1):
            print("Parent:",str(self.Heap[i]),"Lt: "+str(self.Heap[2 * i]),"Rt: ",str(self.Heap[2 * i + 1]))

min_heap = min_heap(10)
min_heap.insert(5)
min_heap.insert(1)
min_heap.insert(8)
min_heap.insert(2)
min_heap.insert(3)
min_heap.insert(7)
min_heap.insert(9)
min_heap.insert(6)
min_heap.insert(10)
min_heap.print_heap()

输出:

Parent: 1 Lt: 2 Rt:  7
Parent: 2 Lt: 5 Rt:  3
Parent: 7 Lt: 8 Rt:  9
Parent: 5 Lt: 6 Rt:  10

insert() 方法将元素添加到堆中。 使用 swap() 方法管理元素的索引和顺序,该方法使用 rt_child_index()lt_child_index() 函数根据父节点的值调整子节点的级别。

使用类的 print_heap() 函数迭代最小堆并按顺序显示。


使用 heapq 模块在 Python 中实现最小堆

Python提供了一个heapq模块,可以在不创建其他类的情况下实现堆数据结构。 该模块确保每次弹出堆的最小元素以保持最小堆结构。

我们将使用一个列表来维护堆的节点。 使用 heappush() 函数添加元素,并相应地维护顺序,以便维护 Min Heap 的结构。

heappop() 从堆中弹出最小的元素,即根节点。

例子:

import heapq as heap
lst=[ ]
heap.heappush(lst,7)
heap.heappush(lst,1)
heap.heappush(lst,5)
heap.heappush(lst,4)
heap.heappush(lst,8)
heap.heappush(lst,3)
print("Heap: ",lst)
print("Parent Node: ",heap.heappop(lst))
print("Child Nodes: ",lst)

输出:

Heap:  [1, 4, 3, 7, 8, 5]
Parent Node:  1
Child Nodes:  [3, 4, 5, 7, 8]

在上面的例子中,我们使用了一个列表 lst 来维护堆。 添加元素,并使用 heappush() 函数自动调整它们的顺序。

显示最小堆。 使用 heappop() 方法弹出父节点并显示。

移除父节点后,剩余的子节点也会显示出来。

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

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

相关文章

【计算机组成原理·笔记】总线控制

总线控制 总线上连接多个部件&#xff0c;为了解决&#xff1a; 什么时候由哪个部件发送信息如何给信息传送定时如何防止信息丢失如何避免多个部件同时发送如何规定接受信息的部件 等一些列问题&#xff0c;需要总线控制线进行统一管理&#xff0c;这就是总线控制&#xff0…

必须有公网IP吗?内网穿透如何实现外网访问

很多中小型公司或个人都有将自己内网的服务、应用&#xff0c;如远程桌面、网站、数据库、公司的管理系统、FTP、管家婆、监控系统等等&#xff0c;发布到外网&#xff0c;实现异地访问的需求。但往往面临一个普遍的问题&#xff0c;就是没有公网IP&#xff0c;即没有IP v4的公…

KEYSIGHT是德DSOX4034A 示波器 350 MHz

KEYSIGHT是德DSOX4034A 示波器 350 MHz&#xff0c;是德4000 X 系列拥有一系列引以为傲的配置&#xff0c;包括采用了电容触摸屏技术的 12.1 英寸显示屏、InfiniiScan 区域触摸触发、100 万波形/秒捕获率、MegaZoom IV 智能存储器技术和标配分段存储器。 是德DSO-X4034A 主要特…

scrcpy: 在电脑上使用Android手机

文章目录 1. 目的2. 配置2.0 配置思路2.1 安装 scrcpy 2.02.2 添加 udev 规则2.3 手机设置权限2.4 开启 scrcpy 1. 目的 打算在电脑上使用手机上的 App&#xff0c;如京东读书&#xff0c;或QQ。不用电脑版对应软件的原因是&#xff0c;电脑上需要重新登录&#xff0c;有些软件…

JSP SSM 学生综合测评管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM 学生综合测评管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

零基础快速搭建私人影音媒体平台

目录 1. 前言 2. Jellyfin服务网站搭建 2.1. Jellyfin下载和安装 2.2. Jellyfin网页测试 3.本地网页发布 3.1 cpolar的安装和注册 3.2 Cpolar云端设置 3.3 Cpolar本地设置 4.公网访问测试 5. 结语 转载自cpolar极点云的文章&#xff1a;零基础搭建私人影音媒体平台【…

RabbitMQ集群架构模式

搭建Mirror镜像集群&#xff1a; 4369是erlang的发现端口 5672是rabbitmq的通信端口 15672是rabbitmq的可视化控制台的端口号 25672是erlang底层发送消息和分配消息的底层端口 firewall-cmd --zonepublic --add-port4369/tcp --permanent firewall-cmd --zonepublic --add-port…

Springboot+vue.js高校校园社交个人博客相册网站系统

基于java语言设计并实现了高校社交系统。该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用Springboot框架&#xff0c;选择MySQL作为后台数据库。系统主要包括用户、个人动态、个人相册、动态类型、留言板、交流论坛等功能模块。近几年来&#xff0c;由于计算机技术的快速…

chatgpt赋能python:Python列表中如何找出前三名成绩

Python列表中如何找出前三名成绩 在数据分析和编程中&#xff0c;Python语言被广泛使用。其中&#xff0c;列表是Python中最常用的数据类型之一。列表可以存储多个值&#xff0c;并且这些值可以是不同的数据类型。Python列表很强大&#xff0c;因为它提供了许多内置函数和方法…

划水2年半,薪资还没新人多,不要太真实...

上个月公司来了许多新面孔&#xff0c;其中一个是个00后&#xff0c;这位兄弟毕业后&#xff0c;在某软件公司干了一年&#xff0c;现在跳槽到我们公司薪资20K&#xff0c;已经超过公司很多老油条了。因为我和他年纪相差不大&#xff0c;所以和他聊得来&#xff0c;才知道&…

Educational Codeforces Round 149 (Rated for Div. 2)(A—D、F)

文章目录 A. Grasshopper on a Line1、问题2、分析3、代码 B. Comparison String1、问题2、分析3、代码 C. Best Binary String1、问题2、分析3、代码 D. Bracket Coloring1、问题2、分析3、代码 E. Playoff Fixing1、问题2、分析3、代码 F. Editorial for Two1、问题2、分析3、…

数据库期末复习(6)基于哈希和B+树的索引查询

免责声明 练习题没有答案 图片都是自己做的 仅供参考 可扩展哈希表和练习 笔记 数据库--- 索引结构 (2)--可扩展哈希表及增删查_旅僧的博客-CSDN博客 练习 首先默认 局部深度都是1 然后进行插入 之后分裂 按照课件上的操作进行。 线性哈希表

插入排序,选择算法与快速排序(c语言,Java语言)

插入排序 原理&#xff1a;从数组的第二个元素开始,将数组中的每一个元素按照&#xff08;升序或者降序&#xff09;规则插入到已排好序的数组中以达到排序的目的。 插入排序并不是将元素取出来&#xff0c;插入到合适位置&#xff0c;之后的元素的位置依次加一&#xff0c;而…

在职阿里8年,一个31岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;13届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&am…

【STL】stack、queue基本使用和模拟实现

目录 前言 stack 接口介绍 模拟实现 queue 接口介绍 模拟实现 没有迭代器 deque介绍 前言 stack 和 queue 本质上是一种容器配接器&#xff0c;就像我们平时充电时使用的电源适配器&#xff0c;能够将电压转换成设备能够接受的程度。 其通过封装特定容器作为其底层…

我的测试之路:从入坑测试到月薪15k...

“干过保险卖过房&#xff0c;做过销售做过网管”这是我毕业后前两年的真实写照&#xff0c;因为所学网络安全专业不好找工作&#xff0c;毕业之后为了生活只能将就的干着这种门槛低的工作。后来一次同学聚会被同学带下坑后&#xff0c;正式转行软件测试。 刚入坑的两年&#…

【自动化测试实战】从 0 到 1 搭建 Dubbo 接口自动化测试

前言 1、Dubbo 接口自动化测试框架实现逻辑 2、框架具体功能 3、关键实践 3.1 下载 provider 的 jar 包&#xff0c;并代理声明 zookeeper 设置 3.2 邮件发送功能 3.3 封装 Dubbo 接口信息类 3.4 利用 JMeter 调用 provider 服务&#xff0c;并断言&#xff0c;邮件报警…

音视频基础及海思sample_venc解读

1、sample的整体架构 (1)sample其实是很多个例程&#xff0c;所以有很多个main (2)每一个例程面向一个典型应用&#xff0c;common是通用性主体函数&#xff0c;我们只分析venc (3)基本的架构是&#xff1a;venc中的main调用venc中的功能函数&#xff0c;再调用common中的功…

python基于DeeplabV3Plus开发构建裂缝分割识别系统,并实现裂缝宽度计算测量

在我之前的文章中已经有不少基于裂缝场景的数据开发构建的模型了&#xff0c;感兴趣的话可以自行移步阅读&#xff0c;如下&#xff1a; 《基于yolov5sbifpn实践隧道裂缝裂痕检测》 《基于YOLOV7的桥梁基建裂缝检测》 《水泥路面、桥梁基建、隧道裂痕裂缝检测数据集》 《基…

SpringBoot异步执行方法

1. 源码跟踪 1.简单描述 在SpringBoot2.0.9之前需要手动自定义线程池(如下2.1), 然后指定线程池的名称 SpringBoot2.0.9以及之前的版本,使用的线程池默认是SimpleAsyncTaskExcutor, , 之后的版本使用的是ThreadpoolTaskExecutor 并且不需要手动的创建当前线程池(但往往我们…