python- Heap queue(堆队列模块)

这个模块提供了一种实现对于堆队列算法,也是被人们所知的优先级队列算法。

堆是一个二叉树它的父结点小于等于子结点的值。它使用了heap[k] <= heap[2k+1] 和heap[k] <= heap[2k+2] 对于所有的k,计算元素从0开始。为了方便比较,不存在的元素被视为无穷大。对于一个堆,令人感兴趣的属性就是它的根heap[0]。

在不同的教科书的堆算法下的api是不同的,主要有两个方面:我们使用基于0的索引。这让结点跟结点对于它们子节点来说有点看起来不是那么明显,但对于python来说很适合。
另一方面,我们使用的pop方法返回的是最小值而不是最大值(我们称之为最小堆)

更常见的是最大堆,因为它极其适合就地排序。

这两点让它可能去把我们的堆视为一个正常的列表在python中,不用惊讶,heap[0]是最小的,然后使用heap.sort()去维持我们的堆的无关性。

为了创建一个堆,我们通过[]初始化一个列表,或者你能够把一个现存的列表,转化成一个堆通过heapify()。

下面是它提供的函数:
heapq.heappush(heap, item)
将value项推入堆,保持堆不变。

heapq.heappop(heap)
弹出并从堆中返回最小的项,保持堆不变。如果堆是空的,则引发IndexError。要访问最小的项而不弹出它,请使用堆[0]。

heapq.heappushpop(heap, item)
推动堆上的项,然后弹出并从堆中返回最小的项。组合操作运行起来比heappush()更有效,heappush()后面是对heappop()的单独调用。

heapq.heapify(x)
将列表x在线性时间内就地转换为堆。

heapq.heapreplace(heap, item)
弹出并从堆中返回最小的项,并推送新项。堆大小不变。如果堆是空的,则引发IndexError。

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

返回的值可能大于添加的项。如果不希望这样,可以考虑使用heappushpop()。它的push/pop组合返回两个值中较小的一个,将较大的值留在堆上。

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

*heapq.merge(iterables)
将多个排序的输入合并到一个排序的输出中(例如,合并多个日志文件中的时间戳项)。返回已排序值的迭代器。

类似于已排序的(itertools.chain(*iterables)),但返回一个iterable,不立即将数据拉入内存,并假设每个输入流都已排序(从最小到最大)。

heapq.nlargest(n, iterable[, key])
从iterable定义的数据集中返回一个包含n个最大元素的列表。key(如果提供)指定一个参数的函数,该参数用于从iterable中的每个元素中提取一个比较键:key=str。下等价于:已排序(iterable, key=key, reverse=True)[:n]

heapq.nsmallest(n, iterable[, key])
从iterable定义的数据集中返回包含n个最小元素的列表。key(如果提供)指定一个参数的函数,该参数用于从iterable中的每个元素中提取一个比较键:key=str。下等价于:已排序(iterable, key=key)[:n]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用内置的队列模块queue module)来实现队列。当使用Python的队列模块时,队列会占用一定的内存空间。 具体而言,Python队列模块中提供了多种队列实现,包括FIFO队列Queue)、LIFO队列(LifoQueue)和优先级队列(PriorityQueue)。这些队列实现都是基于内置的数据结构,如列表(list)或堆(heap)来存储元素。 在使用Python队列模块时,内存占用主要取决于以下几个因素: 1. 存储元素的数据结构:不同类型的队列使用不同的数据结构来存储元素。例如,FIFO队列使用列表来存储元素,而优先级队列使用堆来存储元素。这些数据结构本身会占用一定的内存空间。 2. 元素的大小和数量:队列中的元素大小和数量对内存占用有直接影响。如果元素较大或者队列中有大量的元素,那么队列所占用的内存空间也会相应增加。 3. 其他辅助变量:Python队列模块可能会使用一些辅助变量来记录队列的状态,例如头部和尾部位置、长度等。这些变量也会占用一定的内存空间。 需要注意的是,Python的队列模块是线程安全的,因此在多线程环境下使用时,可能会占用更多的内存空间。 总之,Python的队列模块在使用时会占用一定的内存空间,具体的占用情况取决于队列的实现和使用方式。在实际应用中,可以根据具体需求进行内存管理和优化,例如限制队列的大小或使用适当的数据结构来减少内存占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值