一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99在线观看视频免费 | 欧美精品国产一区二区 | 百合互慰吃奶互揉漫画 | 日日摸日日碰夜夜爽97纠 | 久久免费看少妇高潮A片特爽 | 草草草草视频 | 欧美理论片手机在线观看片免费 | 韩国情事伦理片观看地址 | 精品一区二区高清在线观看 | 俺去俺也在线www色官网 | 精品国产一二三区在线影院 | 亚洲国产精品第一区二区三区 | 国产综合成人久久大片91 | 亚洲黄色图 | 欧美xxoo黑人又粗暴 | 美女和男人免费网站视频 | 男公厕里同性做爰 | 国产精品久久久精品日日 | 日本高清中文字幕 | 麻豆视频免费在线播放 | 国产香蕉久久 | 天堂8在线天堂资源在线 | 亚洲AV国产福利精品在现观看 | caoporn草棚在线视频 | 亚州免费一级毛片 | 久久久久琪琪精品色 | 国产酒店自拍 | 视频在线观看大片 | 女教师被学生糟蹋三天 | 亚洲一区二区三区福利在线 | 色播影院性播影院私人影院 | 60岁妇女毛片免费观看 | 7777奇米影视 | 扒开腚眼子视频大全 | 天美麻豆 | 日韩欧美国产一区二区三区 | 久久电影院久久国产 | 99re7在线精品免费视频 | porno美国xxxx | 香蕉eeww99国产精品 | 果冻传媒ⅹxxxxxhd |