实现优先级队列(小根堆)

头条算法一面,记录一下

实现优先级队列(小根堆)

 1 class prioQueue:
 2     def __init__(self, elist=[]):
 3         self._elems = list(elist)
 4         if elist:
 5             self.buildheap()
 6     def siftdown(self, e,begin, end):
 7         elems, i, j, = self._elems, begin , begin*2+1
 8         while j < end:
 9             if j+1<end and elems[j+1] < elems[j]:
10                 j = j + 1         
11             if e < elems[j]:
12                 break
13             elems[i] = elems[j]
14             i, j = j , 2*j+1
15         elems[i] = e
16     def buildheap(self):
17         end = len(self._elems)
18         for i in range(end//2,-1,-1):
19             self.siftdown(self._elems[i],i,end)
20         return self._elems
21     def peek(self):                       
22         return self._elems[0]
23     def dequeue(self):
24         elems = self._elems
25         e0 = elems[0]
26         e = elems.pop()
27         if len(elems) > 0:
28             self.siftdown(e, 0 , len(elems))
29         return e0
30     def siftup(self, e, last):
31         elems , i , j = self._elems, last, (last-1)//2
32         while i > 0 and e < elems[j]:
33             elems[i] = elems[j]
34             i, j = j ,(j-1)//2
35         elems[i] = e
36     def enqueue(self, e):
37         self._elems.append(None)
38         self.siftup(e, len(self._elems)-1)
39         return self._elems
posted @ 2020-01-02 20:01  Assange  阅读(342)  评论(0编辑  收藏  举报