堆是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。在佇列中,排程程式反覆提取佇列中第乙個作業並執行,因為實際情況中某些時間較短的任務將等待很長時間才能結束,或者某些不短小,但具有重要性的作業,同樣應當具有優先權。堆即為解決此類問題設計的一種資料結構。
堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。
二叉堆是乙個有堆排列的二叉樹。 ro
ot=a
[0] roo
t=a[
0]
childre
n(a[
i])=
(a[2
i+1]
,a[2
i+2]
) chi
ldre
n(a[
i])=
(a[2
i+1]
,a[2
i+2]
)par
ent(
a[i]
)=a[
⌊(i−
12)⌋
] par
ent(
a[i]
)=a[
⌊(i−
12)⌋
]sift up & sift down
def
siftdown
(i): // also known as bubbledown
while a[i] has worse priority than one or both children:
swap a[i], best child
defsiftup
(i): // also known as bubbleup
while i > 0
and a[i] has better priority than its parent:
swap a[i], parent
i = index of parent
刪除最小值操作,取出後進行sift up和sift down即可,順序無關。
make a heap
def
makeheap
():for i = n-1,n-2,...,2,1,0:
siftdown(i)
使用sift down更快,因為可以保證接近根節點的元素不動,減少了操作。
總時間複雜度為o(n)
k = m/n時效率最高
STL容器 優先佇列priority queue
priority queue顧名思義,是乙個具有權值概念的queue,它和queue一樣允許加入新元素 移除舊元素等功能。由於這是乙個queue,所以只允許在底部加入元素,從頂部取出元素。但優先佇列帶有權值概念,其內的元素自動按照元素的權值排序。權值最高者排在最前面。stl的priority que...
STL初步 優先佇列Priority queue
這個優先到底是如何優先?和普通佇列區別在哪?priority queue type,container,functional priority queue,less q priority queue,less a q priority queue,less b 優先佇列中沒有迭代器 也沒有clear...
優先順序佇列用法詳解(priority queue)
由於優先順序佇列的內部資料結構為堆,所以這裡先介紹堆的一些操作。堆的一些函式操作在algorithm標頭檔案中 在 first,last 範圍內 構造最大堆,first,last 可以是vector指標也可以是陣列指標 make heap first last make heap first las...