Python数据结构——二叉堆的实现

【数据结构Python描述】自底向上构建二叉堆实现及其O(n)时间复杂度分析 采用自底向上方式构建二叉堆的理论分析、Python实现以及O(n)最坏时间复杂度分析 阅读详情

优先队列的二叉堆实现

在前面的章节里我们学习了“先进先出”(FIFO)的数据结构:队列(Queue)。队列有一种变体叫做“优先队列”(Priority Queue)。优先队列的出队(Dequeue)操作和队列一样,都是从队首出队。但在优先队列的内部,元素的次序却是由“优先级”来决定:高优先级的元素排在队首,而低优先级的元素则排在后面。这样,优先队列的入队(Enqueue)操作就比较复杂,需要将元素根据优先级尽量排到队列前面。我们将会发现,对于下一节要学的图算法中的优先队列是很有用的数据结构。

我们很自然地会想到用排序算法和队列的方法来实现优先队列。但是,在列表里插入一个元素的时间复杂度是O(n),对列表进行排序的时间复杂度是O(nlogn)。我们可以用别的方法来降低时间复杂度。一个实现优先队列的经典方法便是采用二叉堆(Binary Heap)。二叉堆能将优先队列的入队和出队复杂度都保持在O(logn)。

二叉堆的有趣之处在于,其逻辑结构上像二叉树,却是用非嵌套的列表来实现。二叉堆有两种:键值总是最小的排在队首称为“最小堆(min heap)”,反之,键值总是最大的排在队首称为“最大堆(max heap)”。在这一节里我们使用最小堆。

二叉堆的操作

二叉堆的基本操作定义如下:

  • BinaryHeap():创建一个空的二叉堆对象

  • insert(k):将新元素加入到堆中

  • findMin():返回堆中的最小项,最小项仍保留在堆中

  • delMin():返回堆中的最小项,同时从堆中删除

  • isEmpty():返回堆是否为空

  • size():返回堆中节点的个数

  • buildHeap(list):从一个包含节点的列表里创建新堆

下面所示代码是二叉堆的示例。可以看到无论我们以哪种顺序把元素添加到堆里,每次都是移除最小的元素。我们接下来要来实现这个过程。

剩下原文链接

二叉堆 最小堆 Python 实现 个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 直接执行该文件会执行文件中的测试样例 使用时在头部如此声明 from binaryheap import BinaryHeap bh = BinaryHeap(heap_size) # heap_size为容量,bh为二叉堆对象 立即下载

相关推荐

Win10插网线显示未识别网络的三种解决方法

本文介绍了三种解决Win10插网线显示未识别网络问题的方法:更新或重启网络设备驱动程序、重置Winsock目录、启用Network Setup Service服务。这些方法都是基于常见的网络问题和解决方案而设计的,适用于大多数Win10用户。如果你遇到了这一问题,可以按照上述步骤进行操作,相信一定能够找到解决问题的方法。需要注意的是,在进行任何操作之前,请务必备份重要数据以防万一。此外,如果你对计算机硬件或软件不熟悉,建议寻求专业人士的帮助以避免造成不必要的损失。

nntxthml的博客 6773

基本数据结构之二叉查找树

一、树的定义 线性数据结构: ArrayList、LinkedList及其组合HashMap。 非线性数据结构:树。 如上图,从数据结构进化的角度来看,树(tree) 的生成是 链表 进化而来。链(Linked) 每个节点最多只有一个 前驱节点 ,那么可以称这个 链 为 树(tree) 。 二、二叉查找树 1、定义:二叉树是每个节点最多只有两个子树的树。子树通常被称为左子树(Left subtr...

weixin_43185598的博客 273

Windows下Codex CLI binary报错排查与修复完整指南

在Windows开发环境中,命令行工具与图形界面应用的协同工作常常依赖于系统环境变量的正确配置。Codex CLI作为一款基于Node.js的智能编程命令行工具,其可执行文件(binary)的定位机制直接关系到桌面应用的正常启动。当用户执行npm更新或切换Node版本后,Codex CLI二进制文件路径可能发生漂移,从而触发“Unable to locate the Codex CLI binary”的报错。此类问题并非代码或账号异常,而是PATH路径、环境变量刷新及桌面应用缓存共同作用的结果。本文面向Wi

weixin_28718769的博客 305

数据结构-详解优先队列的二叉堆(最大堆)原理、实现和应用-C和Python

一、堆的基础 1.1 优先队列和堆 优先队列(Priority Queue):特殊的“队列”,取出元素顺序是按元素优先权(关键字)大小,而非元素进入队列的先后顺序。 若采用数组或链表直接实现优先队列,代价高。依靠数组,基于完全二叉树结构实现优先队列,即堆效率更高。一般来说堆代指二叉堆。 优先队列的完全二叉树(堆)表示 1.2 堆 堆序性: 父节点元素值比孩子节点大(小) 最大堆(M...

SHIDA优快云的博客 2319

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 391

Python爬取腾讯视频m3u8加密流实战(附完整代码)

本文提供了一份详细的Python实战教程,指导如何通过抓包分析、模拟请求头与载荷,破解腾讯视频的m3u8加密流防盗链机制,并附上完整代码实现视频片段的下载与合并。教程涵盖从侦察到代码实现的完整流程,并包含参数动态化、多线程下载等高级技巧与避坑指南,旨在帮助开发者掌握流媒体下载的核心技术。

weixin_29090089的博客 1614

【Python】一文带你学会数据结构中的堆、栈

栈(Stack)和堆(Heap)是计算机内存中常用的两种数据结构。它们在内存管理和数据存储方面具有不同的特点和用途。

Code_and516的博客 4034

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 215

python实现最小二叉堆---最小堆结构

insert(key)方法直接加入到列表末尾,无法保持“堆”次序,虽然对其他路径的次序没有影响,但对于其到根的路径可能破坏次序。在我们学习最小二叉堆代码实现之前,我们需要去了解一下,什么是最小二叉堆(也有最大二叉堆,也叫最大堆)。delMIn()方法---移走整个堆中最小的key:根节点heaplist[1]对于这个问题,我们得先知道“优先队列和二叉堆”它们之间的关系。我们学会了插入节点,那么相同的删除节点,也是轻而易举。那么,我们开始一步步的最小二叉堆的代码实现吧。逻辑结构上是为二叉树,但是实际实现是。

2301_80246346的博客 908

Coze智能体开发:搭建一个解析 PDF 文件的工作流

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 2814

yolov26改进 | 融合改进篇 | 基于 MobileNetV4 和双向特征金字塔网络BiFPN的融合改进(全网独家首发)

本文介绍BiFPN与MobileNetV4融合改进的YOLOv26。许多模块单独使用能够涨点,但直接叠加后可能因功能重复、通道不匹配、尺度冲突而掉点,因此融合前必须理解各模块作用。MobileNetV4利用UIB与Mobile MQA构建轻量主干,提升特征提取能力;BiFPN通过可学习权重完成双向多尺度融合,强化大、中、小目标的信息交互。两者优化Backbone与Neck,功能互补、结构冲突较少。本文提供代码、配置、消融对比及Codex修改思路,MobileNetV4也可替换其他主干,便于组合实验与二次创新

Snu77的博客 242

优先队列(二叉堆)原理及基础操作的python实现

此时我们需要将最后一个节点放入根节点,然后进行下滤操作,就完成了我们的删除最小值的操作,并且不会破坏堆序。

yangwen663200的博客 1117

搭建一个简单的 Django + Vue 项目

在本文中,我将为您详细介绍如何搭建一个简单的 Django + Vue 项目。Django 是一个使用 Python 编写的高级 Web 框架,而 Vue 是一个流行的 JavaScript 框架,用于构建用户界面。通过结合 Django 和 Vue,我们可以创建强大的全栈 Web 应用程序。创建 Django 项目设置 Django 后端创建 Vue 前端连接 Django 和 Vue让我们开始吧!

JfpBlockchain的博客 352

堆python_Python数据结构——二叉堆的实现

优先队列的二叉堆实现在前面的章节里我们学习了“先进先出”(FIFO)的数据结构:队列(Queue)。队列有一种变体叫做“优先队列”(Priority Queue)。优先队列的出队(Dequeue)操作和队列一样,都是从队首出队。但在优先队列的内部,元素的次序却是由“优先级”来决定:高优先级的元素排在队首,而低优先级的元素则排在后面。这样,优先队列的入队(Enqueue)操作就比较复杂,需要将元素根...

weixin_39823017的博客 339

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

[数据结构][Python]实现二叉堆

class BinaryHeap(object): def __init__(self): self.item_list = [0] def insert(self,new_item): self.item_list.append(new_item) self.item_list[0]+=1 self.upward_...

Twiss的博客 484

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【数据结构Python描述】二叉堆(heap)简介和Python手工实现及使用二叉堆实现优先级队列

数据结构堆的简介、Python手工实现及使用堆实现高效率优先级队列。

weixin_37780776的博客 3150

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

17_数据结构与算法_二叉堆_Python实现

#Created By: Chen Da #先实现一个二叉堆,基于完整二叉树 class Binary_heap(object): def __init__(self): self.heap_list = [0] #一个空的二叉堆以零作为第一个元素,方便后续的整除计算 self.curr_size = 0 #通过比较新添加...

一蓑烟雨任平生 429

数据结构51:二叉堆的python实现

目录 一、二叉堆操作的实现 二叉堆初始化 insert(key)方法 delMin()方法 一、二叉堆操作的实现 二叉堆初始化 采用一个列表来保存堆数据,其中表首下标为0的项无用,但为了后面代码可以用到简单的整数乘除法,仍保留它。 class BinHeap: def __init__(self): self.heapList = [0] self.currentSize = 0 insert(key)方法 首先,为了保持“完全二叉树”的性质,新

xddwz的博客 494

python列表元素替换的数据结构_Python 必知数据结构 二叉堆的实现

原标题:Python 必知数据结构 二叉堆的实现【数盟致力于成为最卓越的数据科学社区,聚焦于大数据、分析挖掘、数据可视化领域,业务范围:线下活动、在线课程、猎头服务、项目对接】来源: wzhvictor链接:https://segmentfault.com/a/1190000004153707 1优先队列的二叉堆实现在前面的章节里我们学习了“先进先出”(FIFO)的数据结构:队列(Queue)。队...

weixin_39710179的博客 148

数据结构与算法---二叉堆和二叉堆排序(python实现)

一、什么是二叉堆1. 堆的定义:堆(heap),这里指的堆是一种数据结构,不是内存模型中的堆。堆通常可以看作为一棵树,但这棵树得满足以下条件:a.  堆中任意节点的值总是不大于(不小于)其子节点的值;b.  堆总是一颗完全树。将任意节点不大于其子节点的堆叫做最小堆或小根堆,而将任意节点不小于其子节点的堆叫做最大堆或者大根堆。常见的堆有二叉堆,左倾堆,斜堆,二项堆,斐波那契堆等等。2. 二叉堆:二叉...

xuewen小渣渣的博客 3300

数据结构与算法(Python版)五十一:二叉堆的Python实现

二叉堆操作的实现 二叉堆初始化 采用一个列表来保存堆数据,其中表首下标为0的项无用,但为了后面代码可以用到简单的整数乘除法,仍保留它。 class BinHeap: def __init__(self): self.heapList = [0] self.currentSize = 0 insert(key)方法 首先,为了保持“完全二叉树”的性质,新key应该添加到列表末尾。会有问题吗? insert(key)方法 新key加在列表末尾,显然无法保持“堆”次序,

神薯片 2737

小白学数据结构——二、树与堆(基本概念及二叉树、二叉堆的python实现)

树1.基本概念 什么是树? 树是一种数据结构,可以表示层次关系。形状像一棵树。 最上面;树根 中间:树枝 最下:树叶 树的定义 它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点 没有父节点的节点称为根节点 每一个非根节点有且只有一个父节点 除了根节点外,每个

土豆洋芋山药蛋的博客 4638

python数据结构二叉树的查找算法_数据结构与算法_二叉树与二叉堆的Python实现...

数据结构和算法是计算机技术的基本功之一,北京大学的课程深入浅出,使用Python作为载体简化了编程难度。最近浏览了59-67,主要内容是树结构的介绍,二叉树结构及其实现(含完全二叉树定义与实现问题),二叉堆结构及其实现。并且以语法解析树为例探讨了树结构的应用。非线性数据结构-树树在计算机科学的各个领域中被广泛应用-操作系统,图形学,数据库系统,计算机网络。生物分类树:层次化-越接近顶层越普遍,越接...

weixin_39973492的博客 455

基于 Python 的数据结构与算法分析学习记录(6-10)—— 二叉堆实现

我们将利用二叉树的对数性质来表示我们的堆。 为了保证对数性能,我们必须保持树平衡。平衡二叉树在根的左和右子树中具有大致相同数量的节点。 一个完整的二叉树是一个树,其中每个层都有其所有的节点,除了树的最底层,从左到右填充。 完整二叉树的另一个有趣的属性是,我们可以使用单个列表来表示它。因为树是完整的,父节点的左子节点(在位置 p 处)是在列表中位置 2p 中找到的节点。 类似地,父节点的右子节点在列表

HeatDeath的博客 992

数据结构与算法(python):优先队列和二叉堆

参考自 MOOC数据结构与算法Python版 目录一、优先队列1.1 二叉堆Binary Heap实现优先队列 一、优先队列 队列有一种变体称为“优先队列”,优先队列的出队跟队列一样从队首出队,但在优先队列内部, 数据项的次序却是由“优先级”来确定:高优先级的数据项排在队首,而低优先级的数据项则排在后面。这样,优先队列的入队操作就比较复杂,需要将数据项根据其优先级尽量挤到队列前方。 有什么方案可以用来实现优先队列? 1.1 二叉堆Binary Heap实现优先队列 二叉堆能够将优先队列的入队和出队复杂度都保

番茄大人的博客 643
上一篇: python--接口类与抽象类
下一篇: 爬虫入门到精通-headers的详细讲解(模拟登录知乎)
try2035
博客等级 码龄8年 9粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值