📜  Python中的堆队列(Heap queue或heapq)

📅  最后修改于: 2020-04-15 09:46:28             🧑  作者: Mango

堆数据结构主要用于表示优先级队列。在Python中,可以使用“ heapq “模块。Python中此数据结构的属性是每次弹出最小堆元素(最小堆)。每当元素被推入或弹出时,堆结构都被维护。每次,heap [0]元素也会返回最小的元素。
堆上的操作:
1. heapify(iterable):此函数用于将可迭代对象转换为堆数据结构,即按堆顺序。
2. heappush(heap,ele):此函数用于参数中提到的元素插入堆中,从而堆结构被维持
3. heappop(heap):此函数用于 从堆中删除并返回最小的元,从而堆结构被维持

# Python代码演示heapify(),heappush()和heappop()的工作方式
# 导入“ heapq"以实现堆队列
import heapq
# 初始化 list
li = [5, 7, 9, 1, 3]
# 使用heapify将列表转换为堆
heapq.heapify(li)
# 打印创建的堆
print ("创建的堆是 : ",end="")
print (list(li))
# 使用heappush()将元素压入堆
# 压入4
heapq.heappush(li,4)
# 打印修改后的堆
print ("推送后的修改堆是 : ",end="")
print (list(li))
# 使用heappop()弹出最小的元素
print ("弹出的最小元素是 : ",end="")
print (heapq.heappop(li))

输出:

创建的堆是 : [1, 3, 9, 7, 5]
推送后的修改堆是 : [1, 3, 4, 7, 5, 9]
弹出的最小元素是 : 1

4. heappushpop(heap,ele):此函数在一个语句中结合了推和弹出操作的功能,从而提高了效率。此操作后,将保持堆顺序。
5. heapreplace(heap,ele):此函数还在一条语句中插入和弹出元素,但与上述函数不同。在这种情况下,首先弹出元素,然后推送元素,即,可以返回大于推送值的值。

# Python代码演示heappushpop()和heapreplce()的工作
# 导入“ heapq"以实现堆队列
import heapq
# 初始化list 1
li1 = [5, 7, 9, 4, 3]
# 初始化list 2
li2 = [5, 7, 9, 4, 3]
# 使用heapify()将列表转换为堆
heapq.heapify(li1)
heapq.heapify(li2)
# 使用heappushpop()同时推送和弹出元素
# 弹出2
print ("使用heappushpop()弹出的项目是 : ",end="")
print (heapq.heappushpop(li1, 2))
# 使用heapreplace()同时推送和弹出项目
# 弹出3
print ("使用heapreplace()弹出的项目是 : ",end="")
print (heapq.heapreplace(li2, 2))

输出:

使用heappushpop()弹出的项目是: 2
使用heapreplace()弹出的项目是 : 3

6. nlargest(k,iterable,key = fun):此函数用于从指定的iterable返回k个最大元素,并满足提及的键。
7. nsmallest(k,iterable,key = fun):此函数用于从指定的iterable返回k个最小元素,并满足提及的键。

# Python代码演示nlargest()和nsmallest()的工作
# 导入“ heapq"以实现堆队列
import heapq
# 初始化list
li1 = [6, 7, 9, 4, 3, 5, 8, 10, 1]
# 使用heapify()将列表转换为堆
heapq.heapify(li1)
# 使用nlargest打印3个最大数字,打印10、9和8
print("列表中3个最大的数字是: ",end="")
print(heapq.nlargest(3, li1))
# 使用nsmallest打印3个最小的数字
# 打印1、3和4
print("列表中3个最小的数字是 : ",end="")
print(heapq.nsmallest(3, li1))

输出:

列表中3个最大的数字是 : [10, 9, 8]
列表中3个最小的数字是 : [1, 3, 4]