大根堆的建立(python)

来源:互联网 发布:猪八戒淘宝刷销量 编辑:程序博客网 时间:2024/04/28 01:35

二叉堆是一个近似的完全二叉树。

最大堆的性质是对每个节点来说,节点的值大于等于孩子节点的值。

用数组来保存堆这一数据结构,因为堆接近于完全二叉树,所以用数组实现堆结构,不会浪费很大的内存空间。下标为i的节点,左孩子的下标为2*i,右孩子的下标为2*i+1。

维护堆的性质,对节点i来说,键值为key(i),key(i)要大于等于key(i*2),key(i*2+1),下标i*2是节点i的左孩子节点下标,i*2+1是节点的右孩子节点下标。最大堆的每个子树都要是最大堆。所以要维护每个节点,对节点i来说,如果小于左孩子节点或者小于右孩子节点,需要与其进行交换。策略是:选择左孩子节点和右孩子节点的较大值与i进行交换。然后递归的处理孩子节点。

建堆:用数组a[]存储堆,数组下标就是节点的编号。由完全二叉树的性质可知,数组的后半部分就是叶子节点,所以我们只要维护数组的前半部分最大堆的性质。

下面是python实现的维护堆和建立最大堆的代码,建立最大堆的时间复杂度为O(n)。

python 的函数,对于列表和字典来说是传址,对于整型,字符串等是参数传值。

最大堆可以进行堆排序,时间复杂度为O(nlog)。最小堆用于实现优先队列。

最小堆的性质与最大堆的性质相反,实现也相似。


def make_heap(a,n,i):    l = 2*i    r = 2*i + 1    largest = i    if l <= n and a[l] > a[i]:        largest = l    else:        largest = i    if r <= n and a[r] > a[largest]:        largest = r    if largest != i:        tmp = a[i]        a[i] = a[largest]        a[largest] = tmp        make_heap(a,n,largest)def build_heap(a,n):    for i in range(n/2,0,-1):        make_heap(a,n,i)if __name__ == '__main__':    a = [0,1,2,3,4,5,6,7,8]    build_heap(a,8)    print a