標籤:style sift nbsp 父節點 last object enqueue while int
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 class PrioQueueError(ValueError): 5 pass 6 7 class PrioQueue(object): 8 def __init__(self, elist = []): 9 self._elems = list(elist)10 if elist:11 self.buildheap()12 13 def is_empty(self):14 return not self._elems15 16 def peek(self):17 if self.is_empty():18 raise PrioQueueError("in peek")19 return self._elems[0]20 21 def enqueue(self, e):22 self._elems.append(None)23 self.siftup(e, len(self._elems) - 1)24 25 def siftup(self, e, last):26 elems ,i, j = self._elems, last, (last-1)//2 #父節點27 while i > 0 and e < elems[j]:28 elems[i] = elems[j]29 i, j = j, (j-1)//230 elems[i] = e31 32 def dequeue(self):33 if self.is_empty():34 raise PrioQueueError("in dequeue")35 elems = self._elems36 e0 = elems[0]37 e = elems.pop()38 if len(elems) > 0:39 self.siftdown(e, 0, len(elems))40 return e041 42 def siftdown(self, e, begin, end):43 elems, i, j = self._elems, begin, begin*2+144 while j < end:45 if j+1 < end and elems[j+1] < elems[j]:46 j += 147 if e < elems[j]:48 break49 elems[i] = elems[j]50 i, j = j, 2*j + 151 elems[i] = e52 53 def buildheap(self):54 end = len(self._elems)55 for i in range(end//2, -1, -1):56 self.siftdown(self._elems[i], i, end)57 58 59 def buildheap(self):60 end = len(self._elems)61 for i in range(end//2, -1, -1):62 self.siftdown(self._elems[i], i, end)63 64 if __name__=="__main__":65 pq = PrioQueue([3,5,2,7,6,9,8,1,0])66 print(pq._elems)67 for i in range(9):68 print(pq.dequeue())
資料結構:優先隊列 基於堆實現(python版)