(对
叉堆的分析)
叉堆与二叉堆很类似,但(一个可能的例外是)其中的每个非叶结点有
个孩子,而不是仅仅
个。
a. 如何在一个数组中表示一个
叉堆?
b. 包含
个元素的
叉堆的高度是多少?请用
和
表示。
c. 请给出EXTRACT-MAX在
叉最大堆上的一个有效实现,并用
和
表示出它的时间复杂度。
d. 给出INSERT在
叉最大堆上的一个有效实现,并用
和
表示出它的时间复杂度。
e. 给出INCREASE-KEY(
)的一个有效实现。当
时,它会触发一个错误,否则执行
,并更新相应的
叉最大堆。请用
和
表示出它的时间复杂度。
解
a.
与二叉堆类似,
叉堆的元素也按照从上到下,从左到右的顺序在数组中排列。对于一个
叉堆,第
层有
个元素,第
层有
个元素,第
层有
个元素……。
下面推导数组中每个元素的父结点下标和子结点下标。对于
叉堆中第
层的第
个元素(
和
都从
开始),假设它在数组中的下标为
,有
元素
的父结点为第
层的第
个元素,该结点在数组中的下标为
元素
的子结点在第
层,并且第
个子结点是第
层的第
个元素。用
表示元素
的第
个子结点在数组中的下标,有
综上所述,假设
叉堆中一个元素的数组下标为
,将
替换上面的公式中的
,得到该元素的父结点下标和子结点下标分别为
我们可以将
代入上面的公式,得到二叉堆的元素
的父结点下标为
,左孩子结点下标为
,右孩子结点下标为
。这与6.1节给出的二叉堆公式完全一样,二叉堆只是
叉堆的一个特例。
如果数组下标从
开始,上面
个公式应当变为
b.
高度为
的
叉堆,最少元素个数和最多元素个数分别为
所以,高度为
的
叉堆的元素个数
满足以下不等式
将上面的不等式乘以
得到
上面的不等式表明
位于区间
内。在这个区间范围内,有
。所以,包含
个元素的
叉堆的高度为
。
我们也可以将
代入上面的高度公式,得到二叉堆的高度为
。这与练习6.1-2的结论完全一样。
c.
先给出
叉最大堆的D-MAX-HEAPIFY,与二叉最大堆是类似的。
每次递归调用D-MAX-HEAPIFY需要进行
次比较,而递归的次数最多等于堆的高度
。因此D-MAX-HEAPIFY的时间复杂度为
。
下面给出
叉最大堆的D-HEAP-EXTRACT-MAX。
D-HEAP-EXTRACT-MAX的运行时间取决于D-MAX-HEAPIFY,时间复杂度也为
。
d.
D-MAX-HEAP-INSERT的运行时间取决于D-HEAP-INCREASE-KEY,时间复杂度为
。
e.
D-HEAP-INCREASE-KEY中的while迭代次数最多等于堆的高度,因此它的时间复杂度为
。
以下是本题的代码链接。
https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Chapter06/Problem_6-2
算法导论 — 思考题6-2 对d叉堆的分析
猜你喜欢
转载自blog.csdn.net/yangtzhou/article/details/84889270
今日推荐
周排行