(三数取中划分)一种改进RANDOMIZED-QUICKSORT的方法是在划分时,要从子数组中更细致地选择作为主元的元素(而不是简单地随机选择)。常用的做法是三数取中法:从子数组中随机选出三个元素,取其中位数作为主元(见练习7.4-6)。对于这个问题的分析,我们不妨假设数组
A
[
1..
n
]
A[1..n]
A[1..n]的元素是互异的且有
n
≥
3
n ≥ 3
n≥3。我们用
A
’
[
1..
n
]
A’[1..n]
A’[1..n]来表示已排好序的数组。用三数取中法选择主元
x
x
x,并定义
p
i
=
P
r
{
x
=
A
’
[
i
]
}
p_i = Pr\{x = A’[i]\}
pi=Pr{x=A’[i]}。
a. 对于
i
=
2
,
3
,
…
,
n
−
1
i = 2, 3, …, n-1
i=2,3,…,n−1,请给出以
n
n
n和
i
i
i表示的
p
i
p_i
pi的准确表达式(注意
p
1
=
p
n
=
0
p_1 = p_n = 0
p1=pn=0)。
b. 与平凡实现相比,在这种实现中,选择
x
=
A
′
[
⌊
(
n
+
1
)
/
2
⌋
]
x=A'[⌊(n+1)/2⌋]
x=A′[⌊(n+1)/2⌋](即
A
[
1..
n
]
A[1..n]
A[1..n]的中位数)的值作为主元的概率增加了多少?假设
n
→
∞
n→∞
n→∞,请给出这一概率的极限值。
c. 如果我们定义一个“好”划分意味着主元选择
x
=
A
’
[
i
]
x = A’[i]
x=A’[i],其中
n
/
3
≤
i
≤
2
n
/
3
n/3 ≤ i ≤ 2n/3
n/3≤i≤2n/3。与平凡实现相比,这种实现中得到一个好划分的概率增加了多少?(提示:用积分来近似累加和。)
d. 证明:对快速排序而言,三数取中法只影响其时间复杂度
Ω
(
n
l
g
n
)
Ω(n{\rm lg}n)
Ω(nlgn)的常数项因子。
解
a.
A
’
[
1..
n
]
A’[1 .. n]
A’[1..n]是一个已排好序的数组,选择其中一个元素
x
=
A
’
[
i
]
x = A’[i]
x=A’[i]作为主元。该元素将
A
’
[
1..
n
]
A’[1 .. n]
A’[1..n]分为
3
3
3部分:
A
’
[
1..
i
−
1
]
A’[1 .. i-1]
A’[1..i−1]、
A
’
[
i
+
1..
n
]
A’[i+1 .. n]
A’[i+1..n]以及
A
’
[
i
]
A’[i]
A’[i]本身。如果采用三数取中法,要选中
A
’
[
i
]
A’[i]
A’[i]作为主元,只有一种情况:在
A
’
[
1..
i
−
1
]
A’[1 .. i-1]
A’[1..i−1]中任意选取一个元素,在
A
’
[
i
+
1..
n
]
A’[i+1 .. n]
A’[i+1..n]中任意选取一个元素,再选取
A
’
[
i
]
A’[i]
A’[i]本身。这种情况一共有
(
i
−
1
)
(
n
−
i
)
(i-1)(n-i)
(i−1)(n−i)种选法。而从
A
’
[
1..
n
]
A’[1 .. n]
A’[1..n]中选取3个元素一共有
C
n
3
=
n
(
n
−
1
)
(
n
−
2
)
6
C_n^3=\frac {n(n-1)(n-2)}{6}
Cn3=6n(n−1)(n−2)种选法。因此,选中
A
’
[
i
]
A’[i]
A’[i]作为主元的概率为
b.
在PARTITION的平凡实现中,任意一个元素都等可能地被选为主元,因此选择中位数作为主元的概率为
q
M
=
1
/
n
q_M=1/n
qM=1/n。
采用三数取中法,分两种情况讨论:
(1)
n
n
n为偶数
(2)
n
n
n为奇数
从以上分析可以看出,当
n
n
n趋近于
∞
∞
∞时,
p
M
/
q
M
p_M/q_M
pM/qM趋近于
1.5
1.5
1.5。因此,在
n
n
n足够大时,三数取中法选取中位数作为主元的概率大约是平凡实现的
1.5
1.5
1.5倍。
c.
在PARTITION的平凡实现中,产生一个好的划分的概率为
而在三数取中法中,产生一个好的划分的概率为
假如
n
n
n足够大,三数取中法产生好的划分的概率近似等于
l
i
m
n
→
∞
P
=
13
27
lim_{n→∞}P=\frac {13}{27}
limn→∞P=2713。
因此,三数取中法得到一个好的划分的概率大约是平凡实现的
13
27
/
1
3
=
13
9
\frac {13}{27}/\frac {1}{3}=\frac {13}{9}
2713/31=913倍。