思考题

6-1 用插入方法建堆

void Heap::Build_Max_Heap()
{
    heap_size = 1;
    //从堆中最后一个元素开始,依次调整每个结点,使符合堆的性质
    for(int i = 2; i <= length; i++)
        Max_Heap_Insert(A[i]);
}

答:

a)A = {1,2,3};

b)MAX-HEAP-INSERT的过程如下:

加入大小为-0x7FFFFFFF的新结点,O(1)

将该值调整为key,最坏情况下为O(lgn)

对每个结点都要执行一次插入操作,因此最坏时间为O(nlgn)

6-2 对d叉堆的分析

a)根结点是A[1],根结点的孩子是A[2],A[3],……,A[d+1]

PARENT(i) = (i - 2 ) / d + 1

CHILD(i, j ) = d * (i - 1) + j + 1

b)lgn/lgd

c)HEAP-EXTRACR-MAX(A)与二叉堆的实现相同,其调用的MAX-HEAPIFY(A, i)要做部分更改,时间复杂度是O(lgn/lgd * d)

MAX-HEAPIFY(A, i)
1    largest <- i
2    for j <- 1 to d
3        k <- CHILD(i, j)  
4        if k <= heap-size[A] and A[k] > A[largest]  
5            largest <- k
6    if largest != i  
7    then exchange A[i] <-> A[largest]  
8             MAX-HEAPIFY(A, largest)

d)和二叉堆的实现完全一样,时间复杂度是O(lgn/lgd)

e)和二叉堆的实现完全一样,时间复杂度是O(lgn/lgd)

Last updated