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

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

猜你喜欢

转载自blog.csdn.net/yangtzhou/article/details/88776542