优先队列
优先队列可以用链表、二叉查找树、二叉堆等实现。
下面我们用二叉堆实现优先队列,二叉堆的具体定义参考堆排序那篇博客:
python代码
class MinHeap(object): def __init__(self): self.heap = [] def __len__(self): return len(self.heap) def push(self, key): self.heap.append(key) self._up(len(self.heap) - 1) def pop(self): res = self.heap[0] x = self.heap.pop() if len(self.heap): self.heap[0] = x self._down(0) return res def _up(self, i): if i > 0: parent = (i-1)//2 if self.heap[i] < self.heap[parent]: self.heap[i], self.heap[parent] = self.heap[parent], self.heap[i] self._up(parent) def _down(self, i): left = 2 * i + 1 right = 2 * i + 2 small = i if left < len(self.heap) and self.heap[left] < self.heap[small]: small = left if right < len(self.heap) and self.heap[right] < self.heap[small]: small = right if small != i: self.heap[i], self.heap[small] = self.heap[small], self.heap[i] self._down(small)