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

Dijkstra算法与优先队列优化实践指南 最短路径算法是图论中的基础算法,广泛应用于物流配送、网络路由等场景。Dijkstra算法作为经典的单源最短路径算法,其核心思想是通过贪心策略逐步确定各节点到源点的最短距离。传统实现使用普通队列时间复杂度为O(V²),而引入优先队列后能优化至O((V+E)logV),特别适合处理现代大规模稀疏图数据。优先队列通过堆结构动态维护节点距离排序,确保每次处理距离最近的未访问节点,这种数据结构与算法的黄金组合在工程实践中能实现数十倍的性能提升。本文以物流路径优化为典型应用场景,详解优先队列版Dijkstra的实现技巧 阅读详情
#Created By: Chen Da

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

    #通过比较新添加的项与父项的大小,如果该项小于父项则交换,从而维持堆的结构属性
    def swap_up(self,i):
        while i // 2 > 0:
            if self.heap_list[i] < self.heap_list[i // 2]:
                tmp = self.heap_list[i]
                self.heap_list[i] = self.heap_list[i//2]
                self.heap_list[i//2] = tmp
            i //= 2

    def insert(self,i):
        self.heap_list.append(i)
        self.curr_size += 1
        self.swap_up(self.curr_size)

    #寻找当前节点的最小子节点
    def find_min_child(self,i):
        if i * 2 + 1 > self.curr_size:
            return i * 2
        else:
            if self.heap_list[i * 2] < self.heap_list[i * 2 + 1]:
                return i * 2
            return i * 2 + 1

    #交换节点与其子节点直到都满足正确的位置
    def swap_down(self,i):
        while (i * 2) <= self.curr_size:
            min_child = self.find_min_child(i)
            if self.heap_list[i] > self.heap_list[min_child]:
                tmp = self.heap_list[i]
                self.heap_list[i] = self.heap_list[min_child]
                self.heap_list[min_child] = tmp
            i  = min_child

    def del_min(self):
        min_value = self.heap_list[1]
        #将最后一项交换到首项
        self.heap_list[1] = self.heap_list[self.curr_size]
        self.curr_size -= 1
        self.heap_list.pop()
        #维持堆正确的结构属性
        self.swap_down(1)
        return min_value

    #利用列表构建堆的方法
    def build_heap(self,lyst):
        i = len(lyst) // 2      #从树的中间开始
        self.curr_size = len(lyst)
        self.heap_list = [0] + lyst[:]
        while i > 0:
            self.swap_down(i)
            i -= 1

    def get_list(self):
        return self.heap_list

def test_binary_heap():
    bh = Binary_heap()
    bh.build_heap([3,5,7,1,2,9,4,11,17])
    print(bh.get_list())
    assert bh.del_min() == 1
    print(bh.get_list())
    bh.insert(15)
    print(bh.get_list())



if __name__ == "__main__":
    test_binary_heap()

 

吃透《数据结构与算法分析》参考答案:从堆排序到VSCode调试的进阶指南 数据结构与算法是计算机专业的核心基础,也是笔试面试中的高频考点。理解基本概念与算法原理,是分析复杂度和优化代码的前提。以堆排序算法为例,掌握建堆与堆调整过程,能有效解决Top K等实际问题;而快速幂算法C++实现则体现了二进制分治思想,在数论与模运算场景中广泛应用。借助这些经典算法,配合VSCode配置C/C++环境进行调试观察,能极大提升工程实践能力。围绕《数据结构与算法分析(C++语言描述)》参考答案的使用方法,探讨如何通过对比实现、复杂度分析和边界测试,将课本知识转化为应对期末复习与算法面试的实战能力 阅读详情

相关推荐

二叉堆 最小堆 Python 实现

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

数据结构(Python版):二叉堆(Binary Heap)

二叉堆(Binary Heap)是一种节点数据项有序的完全二叉树结构。二叉堆中,子节点数据项必须小于(或大于)其父节点的数据项,这被称为:堆次序(Heap Order)。所以二叉堆中任何一条(从根节点到叶节点的)路径均是一个已排序数组,若堆数据项中的最小值位于根节点,则称为最小堆(min heap)或小根堆;若堆数据项中的最大值位于根节点,则称为最大堆(max heap)或大根堆。二叉堆(Binary Heap)定义的操作如下:BinaryHeap()方法,二叉堆初始化中采用一个列表来保存堆数据,其中表首下

xunyishuai5020的博客 1167

【CVPR 2025】低光增强HVI论文精读与源码复现---part1 论文网络精读

【CVPR 2025】本文参考论文HVI: A New Color Space for Low-light Image Enhancement part1 在文章中对论文核心网络与原理展开详细解释 part2 对论文公开代码的arch网络与其他核心部分展开详细解释

BOB_BOB_BOB_的博客 3267

python数据结构——二叉堆

一、堆 数据结构 堆(heap) 是一种优先队列。队列是一种先进先出的数据结构。队列的一个重要变种称为优先级队列。使用优先队列能够以任意顺序增加对象,并且能在任意的时间(可能在增加对象的同时)找到(也可能移除)最小的元素,也就是说它比python的min方法更加有效率。 在优先级队列中,队列中的项的逻辑顺序由它们的优先级确定。最高优先级项在队列的前面,最低优先级的项在后面。因此,当你将项排入优先级...

vivian_ll的博客 715

信贷审批中的那些坑:从零开始搭建风控策略体系的5个关键步骤

本文深入探讨了信贷审批中的风控策略体系搭建,从数据陷阱识别、规则冲突诊断到反欺诈攻防,提供了5个关键步骤的实战指南。重点解析了如何通过特征工程、决策树优化和模型可解释性技术,构建动态平衡的风控体系,有效降低逾期风险并提升审批效率。

weixin_29253711的博客 414

RK3568-Linux-麒麟系统---更新制作麒麟rootfs

RK3568 Linux系统 麒麟国产麒麟镜像

qiuzw2003的博客 5360

数据结构与算法Python版 二叉堆与优先队列

用Python实现抽象数据类型-二叉堆。优先队列Priority Queue。二叉堆的实现-非嵌套列表。抽象数据类型-二叉堆。二叉堆的应用-堆排序。

分享、交流、合作 1474

STM32F407与W5100S的SPI通信实战:从硬件连接到TCP服务器搭建

本文详细介绍了STM32F407微控制器通过SPI接口驱动W5100S以太网模块,并搭建TCP服务器的完整实战过程。内容涵盖硬件连接、SPI驱动配置、网络参数设置及Socket编程,重点解析了SPI通信时序、W5100S寄存器操作和TCP连接管理,为嵌入式网络通信开发提供实用指南。

weixin_29173777的博客 194

信息竞赛进阶指南--二叉堆(模板)

// 二叉堆 int heap[SIZE], n; void up(int p) { while (p > 1) { if (heap[p] > heap[p/2]) { swap(heap[p], heap[p/2]); p/=2; } else break; } } void down(int p) { int s = p*2; while (s ...

日拱一卒,功不唐捐 3066

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 360

【MODIS处理工具】MRT(MODIS Reprojection Tool) 下载及安装

【MODIS处理工具】MRT(MODIS Reprojection Tool) 下载及安装

WW、forever的博客 2406

二叉堆相关知识点整理(Python实现)

目录二叉堆简介公式定理操作:建堆插入取值 二叉堆简介 做leetcode题目,解题说用二叉堆效率高,因此就有了这篇博客记录学习过程。二叉堆是一颗完全二叉树,满足其子节点总是小于父亲节点的特性(小根堆),大根堆则相反。python里可以使用heapd这个内置库操作堆,默认实现的是下根堆,如果加上负号,则可转换为大根堆 公式定理 一般使用数组来表示二叉堆,数组下标间有如下关系(具体推到过程,这里先挖个坑,下次回来填): 如果从下标从0开始存储,则下标为i的结点的主要关系为: 双亲:下取整 ((i-1)/2) 左

进击的WTVUA的博客 366

【NI Multisim 14.0原理图设计基础——元器件分类】

电阻(RESISTOR):该元器件栏中的电阻都是标称电阻,是根据真实电阻元器件而设计的,其电阻值不能改变。 排阻(RESISTOR PACK):相当于多个电阻并列封装在一个壳内,它们具有相同的阻值。 电位器(POTENTIOMETER):即可调电阻,可以通过键盘字母动态调节电阻,大写表示增加电阻值,小写表示减小电阻值,调节增量可以设置。 电容(CAPACITOR):所有电容都是无极性的,不能改变参数,没有考虑误差,也未考虑耐压大小。 电解电容器(CAP_ELECTROLIT):所有电容都是有极性的,“+”极

RL2698853114的博客 4万+

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

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

番茄大人的博客 643

【ZYNQ】OV5640 图像采集与显示

OV5640 是豪威(OmniVision)半导体公司推出的高性能的 CMOS 数字图像传感器,支持最高 500 万像素图像采集,支持 RAW RGB、RGB565、YCbCr422 等图像格式输出,可应用于手机、平板等电子设备。本文主要介绍如何使用 Zynq 驱动 OV5640 摄像头进行图像采集,并通过 HDMI 实时显示。

洋洋Young的博客 1433

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

yangwen663200的博客 1117

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python数据结构与算法分析(第二版)

对列表进行加长操作,比较不同方法的性能pop性能分析。

aha_xigua的博客 2551

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python内置高级数据结构

写作目的 在编程过程,特别是线上编程的过程中,总会需要用到很多高级的数据结构,但是python中的一些高级数据结构并没有那么的“明显”,这里梳理一下。 栈 栈在python中比较好实现,直接用List数据结构就可以代替。add方法用append代替,有内置的pop()方法,时间复杂度O(1),至于peek()方法可以直接用索引-1代替。 myStack=[] myStack.append(1) m...

铁血军的小博客 1万+

Python·算法分类题库

欢迎关注【Python·算法分类题库】,持续更新中……

欢迎关注Blog:https://www.cnblogs.com/Chiaki17/category/2410756.html 1634

数据结构与算法#学习笔记01# | datas tructure初识数据结构以及常见的算法 (持续更新)

参考资料 GitHub 刘宇波: 算法与数据结构 - 课程官方代码仓 runoob 菜鸟网站 数据结构与算法 为什么要学习数据结构和算法? 随着应用程序变得越来越复杂和数据越来越丰富,几百万、几十亿甚至几百亿的数据就会出现,而对这么大对数据进行搜索、插入或者排序等的操作就越来越慢,数据结构就是用来解决这些问题的。 常见的数据结构 栈(Stack): 栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。 队列(Queue): 队列和栈类似,也是一种特殊的线性表。和栈不同

Naiva的博客 527

python堆排序代码_Python 堆与堆排序

堆排序与二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:由于其它几种堆(二项式堆,斐波纳契堆等)用的较少...

weixin_39866741的博客 118

java 堆排序算法_Heapsort 堆排序算法详解(Java实现)

Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析。同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择对这个算法进行分析主要是因为它用到了一个非常有意思的算法技巧:数据结构 - 堆。而且堆排其实是一个看起来复杂其实并不复杂的排序算法,个人认为heapsort在机器学习中也有重要作用。这里重新详解下关于...

weixin_36452379的博客 624

牛津大学算法与数据结构课程资源全解析:从基础到高阶的系统学习指南

算法与数据结构是计算机科学的核心基础,它们定义了数据组织和处理的逻辑框架,直接影响程序的效率和可扩展性。其原理涉及对时间与空间复杂度的分析,通过大O表示法等工具评估算法性能。掌握这些基础技术对于构建高性能软件、优化系统架构具有关键价值,广泛应用于搜索引擎、推荐系统、数据库索引和网络路由等场景。动态规划和哈希表等经典结构是解决复杂工程问题的利器。本文以牛津大学2026年春季算法课程为范本,系统梳理从数组、链表到图论、动态规划的学习路径,提供结合LeetCode等平台的实战方法,帮助开发者构建坚实的算法思维与工

weixin_33827731的博客 406

LeetCode练习九:树(下)——优先队列、堆排序

为了代码的简洁,我们建堆时,将下标为0的位置空出来不用,根节点从1开始。给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素,你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。将数组转化为大顶堆,重复从大顶堆中取出数值最大的节点,并让剩余的堆结构继续维持大顶堆性质。:把移走了最大值元素以后的剩余元素组成的序列再构造为一个新的堆积(前面讲的新key下沉)。我们可以使用优先队列(大顶堆)来存储长度为k的窗口内的数组,这样堆顶元素一定是滑动窗口内的最大值。我们只能看到滑动窗口内的。

qq_56591814的博客 1038

【Python编程】堆:heapq 实现

堆是非线性的树形的数据结构,有两种堆,大根堆与小根堆。我们一般使用二叉堆来实现优先级队列,它的内部调整算法复杂度为 logN。堆是一个二叉树,其中小根堆每个父节点的值都小于或等于其所有子节点的值。整个小根堆的最小元素总是位于二叉树的根节点。python 的 heapq 模块提供了对堆的支持,heapq 堆数据结构最重要的特征是 heap[0] 永远是最小的元素。heapq库中的堆默认是小根堆。

Data · Model · Agent · Repeat 1039

python数据结构二叉树的查找算法_在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历...

独白:利用算法进行查找指定元素,最近学习二分查找和二叉树遍历。二分查找前提是在有序中进行查找,二叉树引入了树的概念。树的概念其中有许多小知识点,也是一种新的数据结构。还是之前的感悟,需了解其本质才会写出更好的算法。二分查找二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中...

weixin_29114331的博客 406
上一篇: 16_数据结构与算法_遍历树(前序、中序、后序)_Python实现
下一篇: 18_数据结构与算法_图(邻接表)_Python实现
沉住气CD
博客等级 码龄9年 547粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值