python创建堆的方法有哪些?
堆是一种特殊的二叉树,其中每个节点都比其子节点小(或大)的一种数据结构。Python标准库heapq提供了实现堆的可能。本文将介绍通过heapq以及第三方库heapq、queue和heapqdict创建堆的方法。
通过heapq创建堆
heapq是Python内置的实现堆的库。该库实现了堆排序算法,可以将列表转换为堆,并支持元素的插入和提取。下面是一个通过heapq创建堆的示例:
import heapq
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
heapq.heapify(heap)
print(heap)
# >>> [1, 1, 2, 6, 3, 4, 5, 3, 5, 9]
上述代码中,首先导入heapq模块,并初始化一个列表heap。然后,调用heapq.heapify()方法将列表转换为堆。最后,输出堆,结果为[1, 1, 2, 6, 3, 4, 5, 3, 5, 9]。
通过第三方库heapq创建堆
heapq模块提供了创建堆的方法,但它不能删除堆中的任意元素。第三方库heapq克服了这个限制,并支持删除操作。下面是一个通过heapq创建堆的示例:
from heapq import heappop, heappush
heap = []
heappush(heap, (1, 'one'))
heappush(heap, (2, 'two'))
heappush(heap, (3, 'three'))
heappush(heap, (4, 'four'))
heappush(heap, (5, 'five'))
print(heap)
# >>> [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five')]
print(heappop(heap))
# >>> (1, 'one')
上述代码中,首先从heapq导入heappop()和heappush()方法,并初始化一个空列表heap。然后,使用heappush()方法将元组(数字,元素)插入堆中。最后,使用heappop()方法提取最小元素(即最左侧元素),并输出堆。
通过第三方库queue创建堆
queue模块是Python内置的实现队列和堆的库。可以使用该模块创建一个支持元素插入和提取的堆。下面是一个通过queue创建堆的示例:
from queue import PriorityQueue
q = PriorityQueue()
q.put((1, 'one'))
q.put((2, 'two'))
q.put((3, 'three'))
q.put((4, 'four'))
q.put((5, 'five'))
while not q.empty():
print(q.get())
# >>> (1, 'one')
# >>> (2, 'two')
# >>> (3, 'three')
# >>> (4, 'four')
# >>> (5, 'five')
上述代码中,首先从queue导入PriorityQueue类。然后,初始化一个空队列q,并使用put()方法将元组(数字,元素)插入堆中。最后,使用get()方法从队列中提取元素。
通过第三方库heapqdict创建堆
heapqdict是一个支持插入、删除、提取最小元素和更新堆元素的Python字典库。下面是一个通过heapqdict创建堆的示例:
from heapq import heappop, heappush
from heapq_dict import heapqdict
heap = heapqdict()
heap['one'] = 1
heap['two'] = 2
heap['three'] = 3
heap['four'] = 4
heap['five'] = 5
print(heap)
# >>> {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5}
print(heap.popitem())
# >>> ('one', 1)
上述代码中,首先从heapq和heapqdict导入heappop()、heappush()和heapqdict类。然后,初始化一个heapqdict类的实例,并使用[]运算符向其添加元素。最后,使用popitem()方法提取最小元素,并输出堆。
结论
本文通过三个第三方库实现了创建堆的方法。其中heapq库可以创建简单的堆,但不支持删除操作;heapqdict支持插入、删除、提取最小元素和更新堆元素,但需要额外安装库。queue库可以创建支持插入和提取操作的队列和堆。