<算法导论>练习6.5

本文介绍了最大堆和最小堆的操作,包括元素的插入、删除和调整。6.5-1展示了最大堆的弹出操作;6.5-2描述了在最大堆中插入负无穷节点并调整的过程;6.5-3解释了如何利用最大堆实现最小堆;6.5-4提及简化插入操作的方法;6.5-6给出了堆中增加元素优先级的代码;6.5-7讨论了堆如何模拟栈和队列;6.5-8展示了删除堆中指定元素的代码。这些内容深入探讨了堆数据结构在实际问题中的应用。
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值