【堆】【优先队列】python实现

堆,是对于每一个父节点上的值都小于或等于子节点的值的二叉树。此外,一个堆必须是一个完整的二叉树,除了最底层,其他每一级必须是被完整填充的。因此,堆的最重要的一个特点就是:首项 heap[0] 总是最小的一项。

heapq模块

heapq 是一个二叉堆的实现,其内部使用内置的 list 对象,对于列表中的每一个元素,其满足 a[k] <= a[2k+1] and a[k] <= a[2k+2] ,因此,该方法默认的是一个最小堆,a[0] 为队列中的最小元素。

heapq.heapify(arr)
heapq.heappush(arr, 2)
item = heapq.heappop(arr)
item = heapq.heapreplace(arr, -2)
heapq._heapify_max(arr)
heapq._heappop_max(arr)
heapq._heappop_replace(arr,1)

heapq.heappush(q, (2, 'test2'))
heapq.heappush(q, (4, 'test3'))
# 元组,列表,字典进行排序时,按照各容器的元素顺序进行排序

PriorityQueue 模块

该模块定义的优先级队列,其内部使用了 heapq 模块,所以它的时间复杂度和heapq是相同的。
当一个对象的所有元素都是可比较的时,默认情况下是根据队列中的对象的第一个元素进行排序,越小的优先级越高,排在越前面。当第一个元素相同时,依次比较后续的元素的大小来进行排序。
由于 PriorityQueue 是继承自 Queue 类,所以很多函数的用法可以直接参照于 Queue 类中的函数。

from queue import PriorityQueue
pq = PriorityQueue()
pq.put((1, 'a'))
pq.put((2, 'b'))
pq.put((2, 'c'))
print(pq.queue)
item0 = pq.get()
print(item0)
print(pq.qsize())
posted @ 2022-03-29 15:12  four_z  阅读(12)  评论(0)    收藏  举报