算法导论 第六章优先队列总结

HEAP-EXTRACT-MAX(A)
1 if heap-size[A] < 1
2   then error "heap underflow"
3 max  A[1]
4 A[1]  A[heap-size[A]]
5 heap-size[A]  heap-size[A] - 1
6 MAX-HEAPIFY(A, 1)
7 return max
这个算法就是把堆顶元素返回,再返回之前将其另存,再将其复制为数组中最后的一个元素,再重新建立最大堆。
 
HEAP-INCREASE-KEY(A, i, key)
1 if key < A[i]
2   then error "new key is smaller than current key"
3 A[i]  key
4 while i > 1 and A[PARENT(i)] < A[i]
5     do exchange A[i]  A[PARENT(i)]
6         i  PARENT(i)
 
首先检查,因为是增加,所以要检查是否给出的key大于原有的key。先使堆大小+1,再将新的节点放在堆的左后一个位置上,并进行 与父节点的比较 ,直到堆顶为止。
 
MAX-HEAP-INSERT(A, key)
1 heap-size[A]  heap-size[A] + 1
2 A[heap-size[A]]  -
3 HEAP-INCREASE-KEY(A, heap-size[A], key)
 
仍然是先把堆大小+1,在把堆中最后一个元素赋值为负无穷,通过HEAP-INCREASE-KEY函数实现重建堆。
 
6.5-7提到了HEAP-DELETE算法,算法思想是:
将要删除节点元素数值赋值为堆中最后一个元素数值,再重建堆。这里要注意的是,重建堆时不见要像HEAP-INCREASE-KEY算法一样与父节点比较,还可能与子节点比较。如果比父节点大,则与父节点交换数值,并继续向上比较;如果比父节点小,则要与其子节点比较。若是小于,则与之小环数值,若不小于,则当前堆已经是最大堆或最小堆,这时算法即可结束。
 

Heap-Delete(A; i)

1 if i > heap-size[A]

2 then error “heap underflow”

3 A[i] Ã A[heap-size[A]]

4 heap-size à heap-size-1

5 if A[i] > A[Parent(i)]

6 then Heap-Increase-Key(A; i;A[i])

7 else Max-Heapify(A; i)

 

posted @ 2011-02-15 16:20  SunnyDay2015  阅读(370)  评论(0编辑  收藏  举报