[结构] 二叉堆的几个操作

来源:互联网 发布:怀孕b超数据怎么看 编辑:程序博客网 时间:2024/06/05 09:25

二叉堆是一种数组对象,它可以被视为一颗完全二叉树。

MAX-HEAPIFY(A, i) 
要求:假设A[i]的两个子树满足堆性质,要求A[i]为根的树也满足堆性质。
方法:从A[i]开始,下降比较即可。T = O(Log N)。

BUILD-MAX-HEAP(A)
要求:把数组A构造成一个最大堆。
方法:自底向上,从有孩子的节点开始,依次对每个节点进行MAX-HEAPIFY操作。
时间:O(N)   时间复杂度的计算,需要求导,比较有趣。

堆排序
要求:利用最大堆进行排序。
方法:先把BUILD-MAX-HEAP(A),然后,交换A[N-1]与A[0],MAX-HEAPIFY(A, 0),下次交换A[N-2]与A[0],MAX-HEAPIFY(A, 0),依次类推。
时间:建堆是O(N),后面的操作是O(N*LogN),时间复杂度还可以。不过算导上说,不如快速排序。

优先级队列支持的几个方法

HEAP-MAXIMUM(A)
要求:直接返回A[0]

HEAP-EXTRACT-MAX(A)
要求:获取最大值后,删除最大值。
方法:与堆排序里的操作类似,A[0] = A[len-1];  len--;  MAX-HEAPIFY(A, 0)

HEAP-INCREASE-KEY(A, i, key)
要求:A[i] = key,A[i]变大了。对于最大堆来说,如果是变大了,那么就是向上走。 反之,向下走。

MAX-HEAP-INSERT(A, i, key)
要求:把key放到最后,然后执行一个HEAP-INCREASE-KEY(A, i, key),对于新加的元素,放在数组末端,然后向上走就可以了。


注意:堆排序一般是用最大堆,进行升序排序。djistra单源最短路径算法,使用最小堆构造的优先队列,使用松弛函数的时候,会把堆中的数值改小,那就是MIN-HEAP-DECREASE-KEY(A, i, key),向上走。

0 0
原创粉丝点击