python資料結構與演算法——完全樹 與 最小/大堆

來源:互聯網
上載者:User

標籤:

 1 # 完全樹 最小堆 2 class CompleteTree(list): 3     def siftdown(self,i): 4         """ 對一顆完全樹進行向下調整,傳入需要向下調整的節點編號i 5         當刪除了最小的元素後,當新增加一個數被放置到堆頂時, 6         如果此時不符合最小堆的特性,則需要將這個數向下調整,直到找到合適的位置為止""" 7         n = len(self) 8         # 當 i 節點有兒子(至少是左兒子時),並且有需要調整時,迴圈執行 9         t = 010         while i*2+1<n:11             # step 1:從當前結點,其左兒子,其右兒子中找到最小的一個,將其編號傳給t12             if self[i] > self[i*2+1]: 13                 t = i*2+114             else: t = i15             16             # 如果有右兒子,則再對右兒子進行討論17             if i*2+2<n:18                 if self[t] > self[i*2+2]: t = i*2+219             20             # step 2:把最小的結點中的元素和結點i的元素交換21             if t != i:22                 self[t],self[i] = self[i],self[t]23                 i = t   # 更新i為剛才與它交換的兒子結點的編號,以便接下來繼續向下調整24             else:25                 break   # 說明當前父結點已經比兩個子結點要小,結束調整26         27     def siftup(self,i):28         """ 對一棵完全樹進行向上調整,傳入一個需要向上調整的結點編號i29             當要添加一個新元素後,對堆底(最後一個)元素進行調整 """30         if i==0: return31         n = len(self)32         if i < 0: i += n33         # 注意,由於堆的特性,不需要考慮左兒子結點的情況34         # 由於父結點絕對比子結點小所以只需要比較一次35         while i!=0:36             if self[i]<self[(i-1)/2]:37                 self[i],self[(i-1)/2] = self[(i-1)/2],self[i]38             else:39                 break40             i = (i-1)/2     # 更新i為其父結點編號,從而便於下一次繼續向上調整41     42     def shufflePile(self):43         """ 在目前狀態下,對樹調整使其成為一個堆 """44         # 從"堆底"往"堆頂"進行向下調整,使得最小的元素不斷上升45         # 這樣可以使得i結點以下的堆是局部最小堆46         for i in range((len(self)-2)/2,-1,-1):    # n/2,...,047             self.siftdown(i)48 49     def deleteMin(self):50         """ 刪除最小元素 """51         t = self[0]     # 用一個臨時變數記錄堆頂點的52         self[0] = self[-1]  # 將堆的最後一個點賦值到堆頂53         self.pop()      # 刪除最後一個元素54         self.siftdown(0)    # 向下調整55         return t56     57     58     def heapsort(self):59         """ 對堆中元素進行堆排序操作 """60         n = len(self)61         s = []62         while n>0:63             s.append(self.deleteMin())64             n -= 165         # 由於堆中的元素已全部彈出,將排序好的元素拼接到原來的堆中66         self.extend(s)  67         68 if __name__=="__main__":69 70     a = [99,5,36,7,22,17,92,12,2,19,25,28,1,46]71     ct = CompleteTree(a)72     print ct73 >>> [99, 5, 36, 7, 22, 17, 92, 12, 2, 19, 25, 28, 1, 46]74 75     ct.shufflePile()76     print ct77 >>> [1, 2, 17, 5, 19, 28, 46, 12, 7, 22, 25, 99, 36, 92]78 79     s = ct.heapsort()80     print ct81 >>> [1, 2, 5, 7, 12, 17, 19, 22, 25, 28, 36, 46, 92, 99]

 

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.