(用插入的方法建堆)我们们可以通过反复调用MAX-HEAP-INSERT实现向一个堆中插入元素,考虑BUILD-MAX-HEAP的如下实现方式:
a. 当输入数据相同的时候,BUILD-MAX-HEAP和BUILD-MAX-HEAP’生成的堆是否总是一样?如果是,请证明;否则,请举出一个反例。
b. 证明:在最坏情况下,调用BUILD-MAX-HEAP’建立一个包含
n
n
n个元素的堆的时间复杂度是
Θ
(
n
l
g
n
)
Θ(n{\rm lg}n)
Θ(nlgn)。
解
a.
两种方法生成的堆有可能不一样。例如,取
A
A
A = {1, 2, 3, 4}。采用BUILD-MAX-HEAP生成的堆为
而采用BUILD-MAX-HEAP’(插入方法)生成的堆为
b.
最坏情况为
A
A
A中的元素按升序排列。此时,每插入一个元素
i
i
i,都要将该元素移动到根结点,移动的步数为当前元素在堆中的深度
d
i
d_i
di。建堆的总时间取决于插入每个元素所移动的步数之和,即堆中所有元素的深度之和。
简化分析,假设最终建立的堆为一棵满二叉树,它的高度为
h
=
⌊
l
g
n
⌋
h=⌊{\rm lg}n⌋
h=⌊lgn⌋,并且堆中的元素个数为
n
=
2
h
+
1
−
1
n=2^{h+1}-1
n=2h+1−1。我们对每一层进行分析,可以得到下表。
将每一层所有结点的深度和相加,即可得到整个堆中所有元素的深度之和
T
(
n
)
T(n)
T(n)。
因此,在最坏情况下,用插入方法建立一个包含
n
n
n个元素的堆的时间复杂度是
Θ
(
n
l
g
n
)
Θ(n{\rm lg}n)
Θ(nlgn)。
算法导论 — 思考题6-1 用插入的方法建堆
最新推荐文章于 2023-03-29 18:41:00 发布