算法导论 — 思考题7-5 三数取中划分

本文探讨了快速排序算法中的一种改进方法——三数取中法。这种方法通过更精细的选择主元来提高划分的质量,进而提升排序效率。文章分析了选择不同位置元素作为主元的概率,并比较了使用三数取中法与原始方法在获得良好划分上的概率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三数取中划分)一种改进RANDOMIZED-QUICKSORT的方法是在划分时,要从子数组中更细致地选择作为主元的元素(而不是简单地随机选择)。常用的做法是三数取中法:从子数组中随机选出三个元素,取其中位数作为主元(见练习7.4-6)。对于这个问题的分析,我们不妨假设数组A[1..n]A[1..n]A[1..n]的元素是互异的且有n≥3n ≥ 3n3。我们用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,,n1,请给出以nnniii表示的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/3i2n/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..i1]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..i1]中任意选取一个元素,在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)(i1)(ni)种选法。而从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(n1)(n2)种选法。因此,选中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}limnP=2713
  因此,三数取中法得到一个好的划分的概率大约是平凡实现的1327/13=139\frac {13}{27}/\frac {1}{3}=\frac {13}{9}2713/31=913倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值