(三数取中划分)一种改进RANDOMIZED-QUICKSORT的方法是在划分时,要从子数组中更细致地选择作为主元的元素(而不是简单地随机选择)。常用的做法是三数取中法:从子数组中随机选出三个元素,取其中位数作为主元(见练习7.4-6)。对于这个问题的分析,我们不妨假设数组A[1..n]A[1..n]A[1..n]的元素是互异的且有n≥3n ≥ 3n≥3。我们用A’[1..n]A’[1..n]A’[1..n]来表示已排好序的数组。用三数取中法选择主元xxx,并定义pi=Pr{x=A’[i]}p_i = Pr\{x = A’[i]\}pi=Pr{x=A’[i]}。
a. 对于i=2,3,…,n−1i = 2, 3, …, n-1i=2,3,…,n−1,请给出以nnn和iii表示的pip_ipi的准确表达式(注意p1=pn=0p_1 = p_n = 0p1=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≤2n/3n/3 ≤ i ≤ 2n/3n/3≤i≤2n/3。与平凡实现相比,这种实现中得到一个好划分的概率增加了多少?(提示:用积分来近似累加和。)
d. 证明:对快速排序而言,三数取中法只影响其时间复杂度Ω(nlgn)Ω(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]分为333部分: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个元素一共有Cn3=n(n−1)(n−2)6C_n^3=\frac {n(n-1)(n-2)}{6}Cn3=6n(n−1)(n−2)种选法。因此,选中A’[i]A’[i]A’[i]作为主元的概率为
b.
在PARTITION的平凡实现中,任意一个元素都等可能地被选为主元,因此选择中位数作为主元的概率为qM=1/nq_M=1/nqM=1/n。
采用三数取中法,分两种情况讨论:
(1) nnn为偶数
(2) nnn为奇数
从以上分析可以看出,当nnn趋近于∞∞∞时,pM/qMp_M/q_MpM/qM趋近于1.51.51.5。因此,在nnn足够大时,三数取中法选取中位数作为主元的概率大约是平凡实现的1.51.51.5倍。
c.
在PARTITION的平凡实现中,产生一个好的划分的概率为
而在三数取中法中,产生一个好的划分的概率为
假如nnn足够大,三数取中法产生好的划分的概率近似等于limn→∞P=1327lim_{n→∞}P=\frac {13}{27}limn→∞P=2713。
因此,三数取中法得到一个好的划分的概率大约是平凡实现的1327/13=139\frac {13}{27}/\frac {1}{3}=\frac {13}{9}2713/31=913倍。
算法导论 — 思考题7-5 三数取中划分
最新推荐文章于 2023-11-18 17:02:15 发布