6.5-1
将15与最后一个元素交换,并把堆的大小减1,类似于弹出操作,剩下的元素维持最大堆的性质,过程如下:
1,13,9,5,12,8,7,4,0,6,2
13,1,9,5,12,8,7,4,0,6,2
13,12,9,5,1,8,7,4,0,6,2
13,12,9,5,6,8,7,4,0,1,2
6.5-2
先在堆的末尾插入一个值为负无穷的节点,再调用heap-increase-key函数把该节点的值提高为要插入的值key。
过程如下:
15,13,9,5,12,8,7,4,0,6,2,1,-inf
15,13,9,5,12,8,7,4,0,6,2,1,10
15,13,9,5,12,10,7,4,0,6,2,1,8
15,13,10,5,12,9,7,4,0,6,2,1,8
6.5-3
类似于最大堆的代码,其实有了最大堆后,实现最小堆只需要把要实现的所有元素取反,比如5改为-5,然后插入到最大堆中即可,每次取出时记得再取反一次即可。
当然也可以按照书中的方式写出代码如下(用的python):
def heap_minimum(A):
return A[1]
def heap_extract_min(A):
if A.heap_size<1:
print("错误")
min=A[1]
A[1]=A[A.heap_size]
A.heap_size=A.heap_size-1
min_heapify(A,1)
return min
def heap_decrease_key(A,i,key):
if key>A[i]:
print("错误,新的值须比原先的值小")
A[i]=key;
while i>1 and A[parent(i)]>A[i]:
exchange A[i] with A[parent(i)]
i=parent(i)
def min_heap_insert(A,key):
A.heap_size+=1
A[A.heap_size]=float('inf')
heap_decrease_key(A,A.heap_size,key)
6.5-4
用已有的代码简化操作,否则的话我们需要反复的比较元素来找到要插入数据的位置。
6.5-6
def heap_increase_key(A,i,key):
if key<A[i]:
print('erro')
while i>1 and A[parent(i)]<key:
A[i]=A[parent(i)]
i=parent(i)
A[i]=key
6.5-7
对于栈来说,实现方式是每次插入元素时令插入元素的优先级最大,这样每次新的元素都会在根节点处,弹出时优先弹出,实现后进先出的结构。
对于队列,每次插入元素的优先级要比上一个元素的优先级要小,这样弹出的时候会弹出第一次插入的元素,实现先进先出的结构。
6.5-8
def heap_delete(A,i):
if A[i]>A[A.heap_size]:
A[i]=A[A.heap_size]
max_heapify(A,i)
else:
heap_incerase_key(A,i,A[A.heap_size])
A.heap_size-=1