Python中的堆和栈
创始人
2025-05-29 23:22:52

Python中的堆和栈

1.堆和栈

堆(Heap)和栈(stack)一般有两层含义:

​ (1)数据结构中,表示两种数据结构

​ (2)操作系统中,两种内存管理方式(系统对进程占用的内存空间的管理方式)

1.1数据结构

(1).栈:是一种操作受限的线性表,只能在一端(栈顶)插入/删除的操作,简称先进后出(First In Last Out)FILO。

​ 分为顺序表/链式表,底层分别由数组/链表实现,区别在于数组地址连续,链表地址不连续。

(2).堆:是一种满足父子节点关系(所有节点不大于或不小于其父节点)的完全二叉树,这一特性使其成为优先队列实现的基础。

​ 分为大顶堆(根节点最大)/小顶堆(根节点最小),底层存储一般用数组实现。

1.2操作系统

**(1).栈:**由操作系统分配释放,程序运行时自动拥有的小块内存(在编译期有编译器决定大小)用于存储函数调用栈/局部变量等,且栈在内存中由高地址向低地址增长,所以栈的空间有限(window默认1MB,Linux默认10MB),一旦局部变量申请过多/函数调用太深(递归未终止),会导致栈溢出,操作系统会直接将程序杀掉,操作方式类似数据结构中的栈。

**(2).堆:**由程序员分配释放,若未释放,程序结束时由操作系统释放。

区别:

  • 管理方式不同:栈由操作系统分配释放,堆需要手动申请释放(容易产生内存泄露)

  • 空间大小不同:每个进程拥有的栈远远小于堆大小

  • 分配方式不同:堆是按需申请,动态分配,速度较慢,容易产生内存碎片,栈(静态分配/动态分配:由操作系统完成,和堆动态分 配不同),速度较快.

使用栈:(像是去饭馆吃饭,只管点菜付钱,方便快捷,但是自由度小)

使用堆:(自己动手做饭,自由度大,想吃什么做什么,但是比较麻烦)

2.堆代码实现

class heap:def __init__(self,index):"""初始化一个空堆,采用数组存放"""self.data = []def get_parent_index(self,index)"""返回父节点下标"""if index ==0 or index >len(self.data)-1:return Noneelse:return (index-1)>>1  #二进制左移1位def sawp(self,index_a,index_b):"""交换数组中两个元素"""self.data[index_a],self.data[index_b] = self.data[index_b],self.data[index_a]def insert(self,d):# 先把元素放入数组末尾,在进行上浮或下沉找到对应位置,以大顶堆为例,self.data.append(d)index = len(self.data)-1parent = self.get_parent_index(index)# 循环,直到该元素成为堆顶,或小于父节点(对于大顶堆)while parent is not None and self.data[parent] < self.data[index]:# 交換self.swap(parent,index)index = parentparent = self.get_parent_index(parent)def removeMax(self):"""刪除栈顶元素"""remove_data = self.data[0]self.data[0]=self.data[-1]del self.data[-1]# 堆化self.heapify(0)return remove_datadef heapify(self,index):"""从上往下堆化,从index开始堆化"""total_index = len(self.data)-1while 1:max_value_index = indexif 2 * index + 1 <= total_index and self.data_list[2 * index + 1] > self.data_list[maxvalue_index]:maxvalue_index = 2 * index + 1if 2 * index + 2 <= total_index and self.data_list[2 * index + 2] > self.data_list[maxvalue_index]:maxvalue_index = 2 * index + 2if maxvalue_index == index:breakself.swap(index, maxvalue_index)index = maxvalue_index"""
请将 元素 1-10 放进堆,并展示建堆情况,及删除堆顶元素情况
实例如下:建堆: [10, 9, 6, 7, 8, 2, 5, 1, 4, 3]删除堆顶元素: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
"""
if __name__ == "__main__":myheap = heap()for i in range(10):myheap.insert(i + 1)print('建堆:', myheap.data_list)print("删除堆顶元素:", [myheap.removeMax() for _ in range(10)])

3.heapq常用方法

"""
python中只有最小堆,没有最大堆,(可以在插入元素取反,弹出也取反实现最大堆)
"""
import heapq 
# 一:创建堆
#1.定义空列表,使用heapq.heqppush(item)将元素加入到堆
heap =[]
heapq.heappush(heap,3)
#2.使用heapq.heapify(list)将列表转为堆结
heap = [3,0,9,1]
heapq.heapify(heap) # [0, 1, 9, 3]
# 二:插入元素
num = 3
heapq.heappush(heap,num)
# 三:刪除并返回堆顶元素
heapq.heappop(heap,num)
# 四:查询堆中最小的n个元素
n = 3
heap =[1,3,5,7,2,4,6,8]
print(heapq.nsmallest(n,heap))
print(heapq.nlargeest(n,heap)) # 最大
# 五:合并两个有序列表
array_a = [6,9,10,14,18]
array_b = [3,5,13,19,20]
array_merge = heapq.merge(array_a,array_b) # 返回一个生成器
print(list(array_merge))
# [3, 5, 6, 9, 10, 13, 14, 18, 19, 20]

4.常用场景

实现优先级队列

import heapq 
class PriorityQueue:def __init__(self):self._queue = []self._index = 0 def push(self,item,priority):# 默认由小到大,对priority取负# 存放元组heapq.heappush(self._queue,(-proority,self._index,item))self._index +=1def pop(self):return heapq.heappop(self._queue)[]queue = PriorityQueue()
q.push("小米",1)
q.push("iphone",2)
q.push("ThinkPad",3)
q.push("Dell",4)
q.pop()
# Dell

合并两个有序数组:采用heapq.merge

获取k个最小值

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...