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)  # 输出: 78 被加入后,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 可以将列表转化为堆。通过负数技巧也可以实现最大堆。

 

 

 

posted @   taohuaxiaochunfeng  阅读(348)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示

目录导航