python實現堆的建立和優先佇列

2021-08-16 20:10:55 字數 3030 閱讀 3930

關於二叉樹

二叉樹的特點:

二叉樹是一種儲存資料元素的匯集資料結構。

二叉樹最重要的性質就是樹的高度和樹中可以容納的最大結點個數之間的關係。樹的高度類似於表長,是從根結點到其他結點的最大距離。在長為n的表裡只能容納n個結點,而在高為h的二叉樹中則可以容納大約2^h個結點,這是表和樹的最大不同點。

一般的元素插入,如果是按線性順序排列的,那麼操作必然需要o(n)的時間(需要對n個資料進行移位處理),要突破這個限制,必須考慮其他資料結構的組織方式。二叉樹就是一種高效插入的儲存方式。

堆排序利用的是完全二叉樹。

python實現堆排序:

1.堆的建立:

class

heap

():#初始化生成乙個優先佇列堆

def__init__

(self, elist=):

self._elems = list(elist)

#初始化時,對資料進行排序

if elist:

self.buildheap()

defbuildheap

(self):

end = len(self._elems)

#所有非葉節點,從後向前進行篩選排序

for i in range(end//2, -1, -1):

self.siftdown(self._elems[i], i, end)

#向下篩選,使堆按順序排列

defsiftdown

(self,e,begin,end):

elems, i, j = self._elems, begin, begin*2+1

while jif j+1

< end and elems[j+1] < elems[j]:

j += 1

if e < elems[j]:

break

elems[i] = elems[j]

i, j = j, 2*j+1

elems[i] = e

#檢測收否為空

defis_empty

(self):

return

not self._elems

#返回頂峰值

defpeek

(self):

if self.is_empty():

raise permissionerror("in peek")

return self._elems[0]

2.python實現優先佇列:

為解決堆插入和刪除的關鍵操作,把篩選過程分位向上篩選和向下篩選。

class

prioqueue

():"""implementing priority queues using heaps

"""#初始化生成乙個優先佇列堆

def__init__

(self, elist=):

self._elems = list(elist)

#初始化時,對資料進行排序

if elist:

self.buildheap()

#生成堆的函式

defbuildheap

(self):

end = len(self._elems)

#所有非葉節點,從後向前進行篩選排序

for i in range(end//2, -1, -1):

self.siftdown(self._elems[i], i, end)

#向下篩選,使堆按順序排列

defsiftdown

(self,e,begin,end):

elems, i, j = self._elems, begin, begin*2+1

while jif j+1

< end and elems[j+1] < elems[j]:

j += 1

if e < elems[j]:

break

elems[i] = elems[j]

i, j = j, 2*j+1

elems[i] = e

#彈出元素,之後利用sifidown恢復順序

defdequeue

(self):

if self.is_empty():

raise prioqueueerror("in dequeue")

elems = self._elems

#取出第乙個即優先順序最高的元素

e0 = elems[0]

#彈出最後乙個元素再放向下篩選函式中進行篩選

e = elems.pop()

if len(elems) > 0:

#用e表示0位置的值,代替了本該是頭部位置的數,相當於把這個數給除去了

self.siftdown(e,0,len(elems))

return e0

#插入元素,使用向上篩選進行排序

defenqueue

(self,e):

self.siftup(e, len(self._elems)-1)

#向上篩選,恢復順序

defsiftup

(self, e, last):

elems, i, j = self._elems, last, (last-1)//2

while i > 0

and e < elems[j]:

elems[i] = elems[j]

i, j = j, (j-1)//2

elems[i] = e

#檢測收否為空

defis_empty

(self):

return

not self._elems

#返回頂峰值

defpeek

(self):

if self.is_empty():

raise permissionerror("in peek")

return self._elems[0]

堆python 建立堆 python

建立最大 小 堆 二叉堆本質上是一種完全二叉樹,儲存方式並不是鏈式儲存,而是順序儲存 堆操作 插入 葉子節點上調 刪除 堆頂元素下沉 堆建立 非葉子節點下沉 從最後乙個非葉子節點開始 最小堆 最小堆任何乙個父節點的值,都小於等於它左右孩子節點的值 建立過程 如果非葉子節點值大於其子節點,將其下沉 最...

資料結構 堆的建立和排序

1 隨機生成一棵完全二叉樹 2 調整結點56及其子樹 3 調整結點77及其子樹 4 調整結點45及其子樹 5 調整結點18及其子樹 6 調整結點29及其子樹 1 調整幾點29及其左 右兒子 2 調整結點29及其左 右兒子 1 取出當前最小元素3 1 掐尖 2 將結點65放到堆頂 3 交換結點65與結...

python字典的建立和輸出 字典的建立和使用

直接建立 d 輸出結果 dict函式 通過序列對建立字典 vaulues name daniel age 23 1 print dict values 通過關鍵字建立字典 print dict name daniel age 23,1 如果 dict 不傳入任何引數將會返回乙個空字典 print d...