要使用 heapq,您必须知道 python 实现了最小堆。这意味着索引 0 处的元素始终是最小的。
这是您希望使用 heapq 实现的内容:
import heapq
from typing import Tuple
class MyObject:
def __init__(self, a: int, b: Tuple(int, int)):
self.a = a
self.b = b
def __lt__(self, other):
return self.a < other.a
l = [MyObject(..,..), MyObject(..,..),..,MyObject(..,..)] # your list
heapq.heapify(l) # convert l to a heap
heapq.heappop(l) # retrieves and removes the smallest element (which lies at index 0)
# After popping the smallest element, the heap internally rearranges the elements to get the new smallest value to index 0. I.e. it maintaines the "heap variant" automatically and you don't need to explicitly sort!
注意:
- 我不需要排序。堆本质上是一个半排序的结构
- 我需要为我的对象创建一个专用类。这比使用元组的元组更干净,并且还允许我覆盖小于lt以便堆知道如何在内部创建树
这是为狂热的读者提供的更详细信息:D
当您使用堆时,您不需要显式排序。堆本质上是一种半排序拓扑,它(在 python heapq 的情况下)将最小元素保持在索引 0 处。但是,您不会看到下面的树结构(请记住,堆是其中每个父节点的树比它所有的孩子和后代都小)。
此外,您不需要逐个附加元素。而是使用 heapq.heapify()。这也将确保没有多余的 heapify-up/heapify-down 操作。否则,如果您的列表很大,您将遇到严重的运行时问题:)