優先佇列出隊跟佇列一樣,從隊首出隊;但隊內的次序由優先順序決定,即優先順序高的資料項可以插隊,排到前面。
二叉堆能夠將優先佇列的入隊和出隊複雜度都保持在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 如果知道了父節點,而左孩子的節點位置為...