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._elems 15 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)//2 30 elems[i] = e 31 32 def dequeue(self): 33 if self.is_empty(): 34 raise PrioQueueError("in dequeue") 35 elems = self._elems 36 e0 = elems[0] 37 e = elems.pop() 38 if len(elems) > 0: 39 self.siftdown(e, 0, len(elems)) 40 return e0 41 42 def siftdown(self, e, begin, end): 43 elems, i, j = self._elems, begin, begin*2+1 44 while j < end: 45 if j+1 < end and elems[j+1] < elems[j]: 46 j += 1 47 if e < elems[j]: 48 break 49 elems[i] = elems[j] 50 i, j = j, 2*j + 1 51 elems[i] = e 52 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())
时间: 2024-10-06 04:18:34