用二叉堆實現優先佇列 Priority Queue

2021-10-05 15:42:09 字數 2323 閱讀 3660

優先佇列出隊跟佇列一樣,從隊首出隊;但隊內的次序由優先順序決定,即優先順序高的資料項可以插隊,排到前面。

二叉堆能夠將優先佇列的入隊和出隊複雜度都保持在o(logn)

完全二叉樹,如果用順序表來表示的話,設根節點下標為1,若某節點下標為p,則其左子節點下標為2p,右子節點下標為2p+1,父節點下標為p//2.

最小二叉堆**:

class

binaryheap

:def

__init__

(self)

: self.heaplist=[0

]#用0佔位,使得下標從1開始

self.currentsize=

0def

percup

(self,i)

:#上浮,跟父節點比大小

while i//

2>0:

if self.heaplist[i]

< self.heaplist[i//2]

: self.heaplist[i]

,self.heaplist[i//2]

=self.heaplist[i//2]

,self.heaplist[i]

else

:break

#如果沒有父節點大,則無需繼續上浮比較

i//=

2def

insert

(self,item)

: self.currentsize+=

1 self.percup(self.currentsize)

defpercdown

(self,i)

:#下沉,若大於子節點,則每次跟子節點中最小的進行交換

while

2*i<=self.currentsize:

#若還有子節點if2

*i+1

<=self.currentsize:

#如果右節點還存在

minindex=

2*i if self.heaplist[

2*i]

2*i+1]

else

2*i+

1else

:#右節點不存在

minindex=2*i

if self.heaplist[i]

>self.heaplist[minindex]

: self.heaplist[i]

,self.heaplist[minindex]

=self.heaplist[minindex]

,self.heaplist[i]

i=minindex

else

:break

defdelmin

(self)

:#移走根節點,之後為了保持完全二叉樹的結構,需要把最後乙個資料項補到根節點,之後再進行下沉操作

minval=self.heaplist[1]

self.heaplist[1]

=self.heaplist[self.currentsize]

self.heaplist.pop(

) self.currentsize-=

1 self.percdown(1)

return minval

defbuildheap

(self,alist)

: self.heaplist=[0

]+alist

self.currentsize=

len(alist)

i=self.currentsize//

2#從最後乙個節點的父節點開始下沉

while i>0:

self.percdown(i)

i-=1return self.heaplist

r=binaryheap(

)alist=[1

,6,4

,5,3

,8,9

,0]print

(r.buildheap(alist)

)r.delmin(

)print

(r.heaplist)

r.insert(2)

print

(r.heaplist)

輸出

[0, 0, 1, 4, 5, 3, 8, 9, 6]

[0, 1, 3, 4, 5, 6, 8, 9]

[0, 1, 2, 4, 3, 6, 8, 9, 5]

二叉堆實現優先佇列

最大堆 每個節點都大於等於它的兩個子節點 堆的操作 優先佇列 框架public class maxpq comparable 返回當前佇列中最大元素 public key max 插入元素 e public void insert key e 刪除並返回當前佇列中最大元素 public key de...

優先佇列 二叉堆

優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...

二叉堆 優先佇列

堆 堆常見的二叉堆,這種資料結構有大根堆和小根堆。對於大根堆來說,每個父節點是大於他的兩個孩子節點的。也就是最大值在根節點。小根堆與之相反。如果堆用陣列實現的話,如果從1開始計數 因為0的位置可以在上慮或者下慮的時候做個暫存的位置 那麼乙個孩子的父節點是i 2 如果知道了父節點,而左孩子的節點位置為...