标签:
堆建好之后,我们只需要返回数组的第一个元素,即能取到最小值
def peek(self): return self._elems[0]
之后就需要做插入元素和删除元素的操作了。
删除元素和建堆过程有点类似,先从堆顶弹出要删除的元素,然后将最后一个元素拿出来,重新进行建堆,就可以得到一个新的最小堆了:
def dequeue(self): elems = self._elems e0 = elems[0] e = elems.pop() if len(elems) > 0: self.siftdown(e, 0 , len(elems)) return e0
插入元素就稍微有些不同,插入元素是从最后一个位置插入元素然后依次向上扫描,若小于兄弟节点或父节点则交换位置,否则就找到位置,这是一个与向下扫描相反的过程:
def siftup(self, e, last): elems , i , j = self._elems, last, (last-1)//2 while i > 0 and e < elems[j]: elems[i] = elems[j] i, j = j ,(j-1)//2 elems[i] = e
插入一个新的元素由于元素总数增加,所以先用一个None来给新增加的元素占个位置,最后得到的方法为:
def enqueue(self, e): self._elems.append(None) self.siftup(e, len(self._elems)-1) return self._elems
这样,就实现了一个优先队列
标签:
原文地址:http://www.cnblogs.com/goddessofpom/p/5597769.html