激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python數據結構與算法之完全樹與最小堆實例

Python數據結構與算法之完全樹與最小堆實例

2020-12-24 00:50hanahimi Python

這篇文章主要介紹了Python數據結構與算法之完全樹與最小堆,結合實例形式分析了Python完全樹定義及堆排序功能實現相關操作技巧,需要的朋友可以參考下

本文實例講述了Python數據結構算法之完全樹與最小堆。分享給大家供大家參考,具體如下:

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

希望本文所述對大家Python程序設計有所幫助。

原文鏈接:http://www.cnblogs.com/hanahimi/p/4692668.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产乱淫a∨片免费观看 | 久久九九热re6这里有精品 | 久久污 | 最近免费观看高清韩国日本大全 | 日韩毛片在线看 | av播播 | 日本高清无遮挡 | 黄色片快播| 国产99久久久国产精品下药 | 久久久久久久久久久久久久国产 | 免费一级欧美在线观看视频 | 毛片免费在线播放 | 精品一区二区三区网站 | 国产网站黄 | 成人毛片视频免费看 | 一区二区三区小视频 | 国产一区二区视频观看 | 九九热这里只有精品8 | 欧美中文在线 | 9999免费视频 | 久久国产精品一区 | 成人黄视频在线观看 | 91社区在线观看 | 日韩在线激情 | 牛牛a级毛片在线播放 | av之家在线观看 | 黄色一级片在线观看 | 草草久| 亚洲情av | 久久精品国产一区二区电影 | 久久精品一区二区三区国产主播 | 天天艹综合 | 中国的免费的视频 | 久久免费精品视频 | 性猛aa久久久 | 国产亚洲精品久久久久5区 综合激情网 | 亚洲一级电影在线观看 | 日韩一级免费毛片 | 奇米888一区二区三区 | 久久久www成人免费精品 | 日韩视频高清 |