資料結構:優先隊列 基於堆實現(python版)

來源:互聯網
上載者:User

標籤: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版)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.