Python中的堆
一、堆的理解
1、堆是在程序运行时,而不是在程序编译时,请求操作系统分配给自己某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
2、堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循任何次序,只要你喜欢。
3、对于一个堆heap来说,它最小的元素总是它的根节点,即heap[0]
二、堆的概念
堆是一个二叉树,其中每个父节点的值都小于或等于其所有子节点的值。整个堆的最小元素总是位于二叉树的根节点。python的heapq模块提供了对堆的支持。
堆数据结构最重要的特征是heap[0]永远是最小的元素
三、堆的相关操作
1.heapq.heappush(heap,item) #heap为定义堆,item 增加的元素;
heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.heappush()函数把值加入堆中;
import heapq heap = [] heapq.heappush(heap,1) heapq.heappush(heap,2) heapq.heappush(heap,3) heap #[1,2,3]
2.heapq.heapify(list) #将列表转换为堆
另外一种就是使用heap.heapify(list)转换列表成为堆结构;
>>> list = [1,2,3,5,1,5,8,9,6] >>> heapq.heapify(list) >>> list [1, 1, 3, 5, 2, 5, 8, 9, 6]
3、heapq.heappop(heap) #删除最小值,因为堆的特征是heap[0]永远是最小的元素,所以一般都是删除第一个元素。
>>> list [1, 1, 3, 5, 2, 5, 8, 9, 6] >>> heapq.heappop(list) 1 >>> list [1, 2, 3, 5, 6, 5, 8, 9]
4、heapq.heapreplace(heap.item) #删除最小元素值,添加新的元素值
>>> list [1, 2, 3, 5, 6, 5, 8, 9] >>> heapq.heapreplace(list,99) 1 >>> list [2, 5, 3, 9, 6, 5, 8, 99]
5、heapq.heapreplace(heap,item) #首先判断添加元素值与堆的第一个元素值对比,如果大,则删除第一个元素,然后添加新的元素值,购置不更改堆
>>> list [2, 5, 3, 9, 6, 5, 8, 99] >>> heapq.heappushpop(list,6) 2 >>> list [3, 5, 5, 9, 6, 6, 8, 99] >>> heapq.heappushpop(list,1) 1 >>> list [3, 5, 5, 9, 6, 6, 8, 99]
6、heapq.merge(…) #将多个堆合并
>>> list [3, 5, 5, 9, 6, 6, 8, 99] >>> h [1000] >>> for i in heapq.merge(h,list): ... print(i,end=" ") ... 3 5 5 9 6 6 8 99 1000
7、heapq.nlargest(n,heap) #查询堆中的最大元素,n表示查询元素个数
>>> list [3, 5, 5, 9, 6, 6, 8, 99] >>> heapq.nlargest(3,list) [99, 9, 8] >>>
8、heapq.nsmallest(n,heap) #查询堆中的最小元素,n表示查询元素的个数
>>> list [3, 5, 5, 9, 6, 6, 8, 99] >>> heapq.nsmallest(3,list) [3, 5, 5]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器