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

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值