堆的基本概念
堆是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
Binary Heap
二叉堆是一个有堆排列的二叉树。
Root=A[0]
R
o
o
t
=
A
[
0
]
Children(A[i])=(A[2i+1],A[2i+2])
C
h
i
l
d
r
e
n
(
A
[
i
]
)
=
(
A
[
2
i
+
1
]
,
A
[
2
i
+
2
]
)
Parent(A[i])=A[⌊(i−12)⌋]
P
a
r
e
n
t
(
A
[
i
]
)
=
A
[
⌊
(
i
−
1
2
)
⌋
]
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
i = index of child we swapped with A[i]
def siftUp(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-ary heap
k = m/n时效率最高