4.5.1 Python中的堆操作

在Python中对堆这种数据结构进行了模块化处理,开发者可以通过调用heapq模块来建立堆这种数据结构,同时heapq模块也提供了相应的方法来对堆进行操作。在heapq模块中包含如下成员。

· heapq.heappush(heap, item):把一个item项压入堆heap,同时维持堆的排序要求。

· heapq.heappop(heap):弹出并返回堆heap里值最小的项,调整堆排序。如果堆为空,抛出IndexError异常。

· heapq.heappushpop(heap, item):向堆heap里插入一个item项,并返回值最小的项。它组合了前面两个函数,这样更有效率。

· heapq.heapify(x):在线性时间内,将列表x放入堆中。

· heapq.heapreplace(heap, item):弹出值最小的项,并返回相应的值,最后把新项压入堆heap。如果堆为空,抛出IndexError异常。

· heapq.merge(*iterables):合并多个堆排序后的列表,返回一个迭代器来访问所有值。

· heapq.nlargest(n, iterable, key=None):从数据集iterable中获取n项的最大值,以列表方式返回。如果提供了参数key,则key是一个比较函数,用来比较元素之间的值。

· heapq.nsmallest(n, iterable, key=None):从数据集iterable中获取n项的最小值,以列表方式返回。如果提供了参数key,则key是一个比较函数,用来比较元素之间的值。相当于sorted(iterable, key=key)[:n]。

下面的实例文件dui1.py演示了使用上述函数实现堆队列的过程。

源码路径:daima\第4章\dui1.py

import heapq
h = []
#使用heappush()把一项压入堆heap,同时维持堆的排序要求。
heapq.heappush(h, 5)
heapq.heappush(h, 2)
heapq.heappush(h, 8)
heapq.heappush(h, 4)
print(heapq.heappop(h))
heapq.heappush(h, 5)
#使用heapq.heappop(heap)
heapq.heappush(h, 2)
heapq.heappush(h, 8)
heapq.heappush(h, 4)
print(heapq.heappop(h))
print(heapq.heappop(h))
#使用heapq.heappushpop(heap, item)
h = []
heapq.heappush(h, 5)
heapq.heappush(h, 2)
heapq.heappush(h, 8)
print(heapq.heappushpop(h, 4))
#使用heapq.heapify(x)
h = [9, 8, 7, 6, 2, 4, 5]
heapq.heapify(h)
print(h)
#使用heapq.heapreplace(heap, item)
heapq.heapify(h)
print(heapq.heapreplace(h, 1))
print(h)
#使用heapq.merge(*iterables)
heapq.heapify(h)
l = [19, 11, 3, 15, 16]
heapq.heapify(l)
for i in heapq.merge(h,l):
    print(i, end = ',')

执行后会输出:

2
2
4
2
[2, 6, 4, 9, 8, 7, 5]
2
[1, 6, 4, 9, 8, 7, 5]
1,3,6,4,9,8,7,5,11,19,15,16,