heapq库的使用——python代码
1、基本概念
heapq是Python中的一个内置模块,它是一个实现堆排序算法的工具,heapq的全写是heap queue,是堆队列的意思。
在介绍用法之前,我们需要先知道优先队列的定义。队列大家应该都不陌生,也是非常基础简单的数据结构。我们可以想象成队列里的所有元素排成一排,新的元素只能从队尾加入队列,元素要出队列只能通过队首,不能中途从队列当中退出。而优先队列呢,是给队列当中的元素每一个都设置了优先级,使得队伍当中的元素会自动按照优先级排序,优先级高的排在前面。
堆是一种特殊的树形数据结构,堆中父节点的值总是小于或等于其子节点的值(最小堆),或大于等于其子节点的值(最大堆)。Python 中的 heapq
模块提供了最小堆的实现,但你可以通过一些技巧使用它来实现最大堆。
2、常用函数
(1)heapq.heappush(heap, item) 将元素 item
加入堆中,保持堆的性质。
1 import heapq
2
3 heap = []
4 heapq.heappush(heap, 10)
5 heapq.heappush(heap, 5)
6 heapq.heappush(heap, 7)
7 print(heap) # 输出: [5, 10, 7],5 是堆顶元素
(2)heapq.heappop(heap) 弹出并返回堆中最小的元素,同时保持堆的性质。
1 heapq.heappop(heap) # 输出: 5
2 print(heap) # 输出: [7, 10]
(3)heapq.heappushpop(heap, item) 将元素 item
加入堆中,然后弹出并返回堆中最小的元素。效率比先调用 heappush
再调用 heappop
要高。
1 heapq.heappushpop(heap, 8) # 输出: 7,8 被加入后,7 是最小的元素被弹出
2 print(heap) # 输出: [8, 10]
(4)heapq.heapreplace(heap, item)
弹出堆中最小的元素,并将新元素 item
加入堆中。这个操作与 heappushpop
不同的是,它首先弹出元素,然后插入新元素。
1 heapq.heapreplace(heap, 6) # 输出: 8
2 print(heap) # 输出: [6, 10]
(5)heapq.heapify(iterable)
将一个可迭代对象转化为堆,线性时间复杂度。
1 nums = [5, 7, 9, 1, 3]
2 heapq.heapify(nums)
3 print(nums) # 输出: [1, 3, 9, 7, 5]
heapify() 函数将普通的列表转换为堆
当你对列表 nums = [5, 7, 9, 1, 3]
使用 heapq.heapify(nums)
时,heapq
并不是像常规排序算法那样对整个列表进行升序排列,而是将列表转化为 最小堆。在最小堆中,堆顶(第一个元素)是最小的元素,但其余元素并不保证有序。每个父节点都小于或等于它的子节点。
(6)heapq.nlargest(n, iterable)
返回可迭代对象中的前 n
个最大元素,返回的结果是按降序排列的。
1 nums = [1, 8, 3, 10, 5]
2 print(heapq.nlargest(3, nums)) # 输出: [10, 8, 5]
(7)heapq.nsmallest(n, iterable)
返回可迭代对象中的前 n
个最小元素,返回的结果是按升序排列的。
1 print(heapq.nsmallest(3, nums)) # 输出: [1, 3, 5]
(8)实现最大堆
Python 的 heapq
模块实现的是最小堆,如果需要最大堆,可以将所有的元素取负,进行堆操作后,再取负恢复。
1 import heapq
2
3 # 使用负数来实现最大堆
4 max_heap = []
5 heapq.heappush(max_heap, -1 * 10)
6 heapq.heappush(max_heap, -1 * 5)
7 heapq.heappush(max_heap, -1 * 7)
8
9 # 弹出最大元素
10 print(-1 * heapq.heappop(max_heap)) # 输出: 10
heapq
模块的基本操作主要是围绕最小堆来实现的,通过 heappush
插入新元素,heappop
弹出最小元素,heapify
可以将列表转化为堆。通过负数技巧也可以实现最大堆。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律