【python床头书】 heapq 堆队列算法参数用法示例详解

本文详细介绍了Python的heapq模块,提供了一种实现堆队列算法的方法,包括函数用法、基本示例和优先队列实现注意事项。heapq可用于创建堆、维护堆性质,并提供了heappush、heappop等函数,支持堆排序和优先队列的实现。
摘要由CSDN通过智能技术生成

【python床头书】 heapq 堆队列算法函数方法示例详解

源自专栏《Python床头书、图计算、ML目录(持续更新)

概览

本模块提供了堆队列算法(也称为优先队列算法)的实现

堆是一种二叉树结构,其中每个父节点的值都小于或等于其子节点的值。这个实现使用数组来表示堆,对于所有的k,满足 heap[k] <= heap[2k+1] 和 heap[k] <= heap[2k+2],索引从零开始计数。为了比较方便,不存在的元素被视为无穷大。堆的一个有趣特性是它的最小元素总是位于根节点 heap[0]。

以下API与教科书中的堆算法有两个不同之处:(a) 使用基于零的索引。这样做使得节点索引与其子节点索引之间的关系稍微不太明显,但更适合Python使用基于零的索引。(b) 我们的弹出方法返回的是最小元素,而不是最大元素(在教科书中称为“最小堆”,而“最大堆”由于适用于原地排序,在文本中更为常见)。

这两点使得我们可以将堆视为普通的Python列表而没有令人惊讶的地方:heap[0] 是最小元素,并且 heap.sort() 可以维持堆的特性!

函数方法

要创建一个堆,可以使用初始化为空列表的方式,或者通过函数 heapify() 将已经存在的列表转换为堆。

提供了以下函数:

  • heapq.heappush(heap, item):将值 item 推入堆中,同时保持堆的特性。
  • heapq.heappop(heap):从堆中弹出并返回最小的元素,同时保持堆的特性。如果堆为空,则引发 IndexError。要访问最小元素而不弹出它,请使用 heap[0]。
  • heapq.heappushpop(heap, item):将 item 推入堆中,然后从堆中弹出并返回最小的元素。这个组合操作比先调用 heappush() 再调用 heappop() 更高效。
  • heapq.heapify(x):原地将列表 x 转换为一个堆,时间复杂度为线性。
  • heapq.heapreplace(heap, item):从堆中弹出并返回最小的元素,并推入新的元素。堆的大小不会改变。如果堆为空,则引发 IndexError。

这一步操作比先进行 heappop() 然后进行 heappush() 更高效,并且在使用固定大小的堆时更为合适。pop/push 组合总是返回堆中的一个元素,并用 item 替换它。

返回的值可能比添加的 item 更大。如果不希望出现这种情况,请考虑使用 heappushpop()。它的 push/pop 组合返回两个值中较小的一个,并将较大的值保留在堆中。

该模块还提供了基于堆的三个通用函数。

  • heapq.merge(*iterables, key=None, reverse=False):将多个已排序的输入合并为单个已排序的输出(例如,合并来自多个日志文件的时间戳条目)。返回排序值的迭代器。

  • 类似于 sorted(itertools.chain(*iterables)),但返回一个可迭代对象,不会一次性将数据全部加载到内存中,并且假定每个输入流已经按照从小到大的顺序排序。

  • 有两个可选参数,必须作为关键字参数指定。

    • key 指定一个接受一个参数的函数,用于从每个输入元素中提取比较键。默认值为 None(直接比较元素)。

    • reverse 是一个布尔值。如果设置为 True,则将输入元素合并得到的结果与按照相反顺序进行比较时的行为相同。要实现类似于 sorted(itertools.chain(*iterables), reverse=True) 的行为,所有的可迭代对象必须按照从大到小的顺序排序。

    在3.5版本中进行了更改:添加了可选的 key 和 reverse 参数。

  • heapq.nlargest(n, iterable, key=None):从由可迭代对象 iterable 定义的数据集中返回包含 n 个最大元素的列表。如果提供了 key 参数,则指定一个接受一个参数的函数,用于从 iterable 中的每个元素中提取比较键(例如,key=str.lower)。等效于 sorted(iterable, key=key, reverse=True)[:n]

  • heapq.nsmallest(n, iterable, key=None):从由可迭代对象 iterable 定义的数据集中返回包含 n 个最小元素的列表。如果提供了 key 参数,则指定一个接受一个参数的函数,用于从 iterable 中的每个元素中提取比较键(例如,key=str.lower)。等效于 sorted(iterable, key=key)[:n]

后两个函数对于较小的 n 值表现最佳。对于较大的值,使用 sorted() 函数更高效。当 n==1 时,使用内置的 min() 和 max() 函数更高效。如果需要重复使用这些函数,请考虑将可迭代对象转换为实际的堆。

</

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值