算法导论 — 思考题8-1 比较排序的概率下界

比较排序的概率下界)在这一问题中,我们将证明对于给定的 n n n个互异的输入元素,任何确定或随机的比较排序算法,其概率运行时间都有下界 Ω ( n l g n ) Ω(n{\rm lg}n) Ω(nlgn)。首先来分析一个确定的比较排序算法 A A A,其决策树为 T A TA TA。假设 A A A的输入的每一种排列情况都是等可能的。
  a. 假设 T A TA TA的每个叶结点都标有在给定的随机输入情况下到达该终点的概率。证明:恰有 n ! n! n!个叶结点标有 1 / n ! 1/n! 1/n!,其他叶结点标记为 0 0 0
  b. 定义 D ( T ) D(T) D(T)表示一棵决策树 T T T的外部路径长度,即 D ( T ) D(T) D(T) T T T的所有叶结点深度的和。假设 T T T为一棵有 k > 1 k > 1 k>1个叶结点的决策树, L T LT LT R T RT RT分别是 T T T的左子树和右子树。证明: D ( T ) = D ( L T ) + D ( R T ) + k D(T) = D(LT) + D(RT) + k D(T)=D(LT)+D(RT)+k
  c. 定义 d ( k ) d(k) d(k)为所有具有 k > 1 k > 1 k>1个叶结点的决策树 T T T的最小 D ( T ) D(T) D(T)值。证明: d ( k ) = min ⁡ 1 ≤ i ≤ k − 1 ⁡ { d ( i ) + d ( k − i ) + k } d(k)=\min\limits_{1≤i≤k-1}⁡\{d(i)+d(k-i)+k\} d(k)=1ik1min{d(i)+d(ki)+k}。(提示:考虑一棵能够取得该最小值的、有 k k k个叶结点的决策树 T T T。设 i 0 i_0 i0 L T LT LT中的叶结点数, k − i 0 k−i_0 ki0 R T RT RT中的叶结点数。)
  d. 证明: d d d对于给定的 k ( k > 1 ) k (k > 1) k(k>1) i ( 1 ≤ i ≤ k − 1 ) i (1 ≤ i ≤ k−1) i(1ik1),函数 i l g i + ( k − i ) l g ⁡ ( k − i ) i{\rm lg}i+(k-i){\rm lg}⁡(k-i) ilgi+(ki)lg(ki) i = k / 2 i = k/2 i=k/2处取得最小值,并有结论 d ( k ) = Ω ( k l g k ) d(k) = Ω(k{\rm lg}k) d(k)=Ω(klgk)
  e. 证明: D ( T A ) = Ω ( n ! l g ( n ! ) ) D(TA) = Ω(n!{\rm lg}(n!)) D(TA)=Ω(n!lg(n!)),并得出在平均情况下,排序 n n n个元素的时间代价为 Ω ( n l g n ) Ω(n{\rm lg}n) Ω(nlgn)这一结论。
  现在来考虑一个随机化的比较排序 B B B。通过引入两种结点,我们可以将决策树模型扩展来处理随机化的情况。这两种结点是:普通的比较结点和“随机化”结点。随机化结点刻画了算法 B B B中所做的形如 R A N D O M ( 1 , r ) {\rm RANDOM}(1, r) RANDOM(1,r)的随机选择情况。该类结点有 r r r个子结点,在算法执行过程中,每一个子结点等概率地被选择。
  f. 证明:对任何随机化比较排序算法 B B B,总存在一个确定的比较排序算法 A A A,其期望的比较次数不多于 B B B的比较次数。
  
  
  a.
  题干有假设比较排序算法 A A A的输入的每一种排列情况都是等可能的。输入有 n n n个互异元素,一共有 n ! n! n!种可能的排列,每种排列出现的概率都是 1 / n ! 1/n! 1/n!。如果对应到决策树上,则恰有 n ! n! n!个叶结点标有概率 1 / n ! 1/n! 1/n!,其他叶结点标记概率为 0 0 0。因为这 n ! n! n!个概率为 1 / n ! 1/n! 1/n!叶结点对应 n ! n! n!种可能的排列,而其他叶结点表示不可能出现的排列。
  
  b.
  假设左右子树 L T LT LT R T RT RT分别有 k 1 k_1 k1 k 2 k_2 k2个叶结点,显然有 k 1 + k 2 = k k_1 + k_2 = k k1+k2=k。假设左子树 L T LT LT的叶结点的在左子树 L T LT LT的深度分别为 l 1 , l 2 , … , l k 1 l_1, l_2, …, l_{k1} l1,l2,,lk1,假设右子树 R T RT RT的叶结点的在右子树 R T RT RT的深度分别为 r 1 , r 2 , … , r k 2 r_1, r_2, …, r_{k2} r1,r2,,rk2,于是有
     D ( L T ) = ∑ i = 1 k 1 l i D(LT)=\sum\limits_{i=1}^{k_1}l_i D(LT)=i=1k1li
     D ( R T ) = ∑ i = 1 k 2 r i D(RT)=\sum\limits_{i=1}^{k_2}r_i D(RT)=i=1k2ri
  我们要计算 D ( T ) D(T) D(T),就要考察所有叶结点在决策树 T T T上的深度。相比叶结点在各自子树 L T LT LT R T RT RT上的深度,叶结点在决策树 T T T上的深度增加了 1 1 1。即左子树 L T LT LT的叶结点在决策树 T T T上的深度为 l 1 + 1 , l 2 + 1 , … , l k 1 + 1 l_1+1, l_2+1, …, l_{k1}+1 l1+1,l2+1,,lk1+1,右子树RT的叶结点的在决策树 T T T的深度分别为 r 1 + 1 , r 2 + 1 , … , r k 2 + 1 r_1+1, r_2+1, …, r_{k2}+1 r1+1,r2+1,,rk2+1。于是有
     D ( T ) = ∑ i = 1 k 1 ( l i + 1 ) + ∑ i = 1 k 2 ( r i + 1 ) = ∑ i = 1 k 1 l i + ∑ i = 1 k 2 r i + ∑ i = 1 k 1 = D ( L T ) + D ( R T ) + k D(T)=\sum\limits_{i=1}^{k_1}(l_i+1) +\sum\limits_{i=1}^{k_2}(r_i+1) =\sum\limits_{i=1}^{k_1}l_i +\sum\limits_{i=1}^{k_2}r_i +\sum\limits_{i=1}^k1=D(LT)+D(RT)+k D(T)=i=1k1(li+1)+i=1k2(ri+1)=i=1k1li+i=1k2ri+i=1k1=D(LT)+D(RT)+k
  
  c.
  考虑一棵有 k > 1 k > 1 k>1个叶结点的决策树 T T T,它的左子树 L T LT LT i i i个叶结点,那么它的右子树 R T RT RT k − i k−i ki个叶结点。显然, i i i的取值范围为 1 ≤ i ≤ k − 1 1 ≤ i ≤ k−1 1ik1。对于一个确定的 i i i,左子树 L T LT LT的最小 D ( L T ) D(LT) D(LT)值为 d ( i ) d(i) d(i),右子树 R T RT RT的最小 D ( R T ) D(RT) D(RT)值为 d ( k − i ) d(k−i) d(ki)。借用问题b的结论,对于一个确定的 i i i,决策树 T T T的最小 D ( T ) D(T) D(T) d i ( k ) = d ( i ) + d ( k − i ) + k d_i(k) = d(i) + d(k−i) + k di(k)=d(i)+d(ki)+k。为了得到决策树 T T T的最小 D ( T ) D(T) D(T) d ( k ) d(k) d(k),可以遍历 i = 0 , 1 , … , k i = 0, 1, …, k i=0,1,,k,取最小的 d i ( k ) d_i(k) di(k),即
     d ( k ) = min ⁡ 1 ≤ i ≤ k − 1 ⁡ { d ( i ) + d ( k − i ) + k } d(k)=\min\limits_{1≤i≤k-1}⁡\{d(i)+d(k-i)+k\} d(k)=1ik1min{d(i)+d(ki)+k}
  
  d.
  令函数 f ( i ) = i l g i + ( k − i ) l g ⁡ ( k − i ) f(i)=i{\rm lg}i+(k-i){\rm lg}⁡(k-i) f(i)=ilgi+(ki)lg(ki),它的导数为
     f ′ ( i ) = l g i + i ∙ 1 i ∙ l n 2 − l g ⁡ ( k − i ) − ( k − i ) 1 ( k − i ) ∙ l n 2 = l g i − l g ⁡ ( k − i ) f'(i)={\rm lg}i+i∙\frac{1}{i∙ln2}-{\rm lg⁡}(k-i)-(k-i)\frac{1}{(k-i)∙ln2}={\rm lg}i-{\rm lg}⁡(k-i) f(i)=lgi+iiln21lg(ki)(ki)(ki)ln21=lgilg(ki)
  当 i = k / 2 i = k/2 i=k/2时, f ’ ( i ) = 0 f’(i) = 0 f(i)=0。当 i < k / 2 i < k/2 i<k/2时, f ’ ( i ) < 0 f’(i) < 0 f(i)<0;当 i > k / 2 i > k/2 i>k/2时, f ’ ( i ) > 0 f’(i) > 0 f(i)>0。所以函数 f ( i ) f(i) f(i) i = k / 2 i = k/2 i=k/2处取得最小值,最小值为 k l g k − k k{\rm lg}k-k klgkk
  接下来证明 d ( k ) = Ω ( k l g k ) d(k) = Ω(k{\rm lg}k) d(k)=Ω(klgk),我们采用代入法。 d ( k ) = Ω ( k l g k ) d(k) = Ω(k{\rm lg}k) d(k)=Ω(klgk)意味着存在一个正常数 c c c,使得当 k k k足够大时,有 d ( k ) ≥ c k l g k d(k) ≥ ck{\rm lg}k d(k)cklgk成立。
  先考察初始情况 k = 1 k = 1 k=1,此时决策树 T T T只有一个叶结点,当这个叶结点就是根结点时,决策树 T T T D ( T ) D(T) D(T)值最小。由于根结点的深度为 0 0 0,故此时 D ( T ) = 0 D(T) = 0 D(T)=0,即 d ( 1 ) = 0 d(1) = 0 d(1)=0。显然, c c c可以取任意正常数,都能使得 d ( 1 ) ≥ c ∙ 1 ∙ l g 1 = 0 d(1) ≥ c∙1∙{\rm lg}1 = 0 d(1)c1lg1=0成立。
  现在进入归纳过程。假设 d ( k ) ≥ c k l g k d(k) ≥ ck{\rm lg}k d(k)cklgk 1 , 2 , … , k − 1 1, 2, …, k−1 1,2,,k1都成立。根据问题c的结论,有
     d ( k ) = min ⁡ 1 ≤ i ≤ k − 1 { d ( i ) + d ( k − i ) + k } d(k)=\min\limits_{1≤i≤k-1}\{d(i)+d(k-i)+k\} d(k)=1ik1min{d(i)+d(ki)+k}
        ≥ min ⁡ 1 ≤ i ≤ k − 1 { c i l g i + c ( k − i ) l g ( k − i ) + k } ≥\min\limits_{1≤i≤k-1}\{ci{\rm lg}i+c(k-i){\rm lg}(k-i)+k\} 1ik1min{cilgi+c(ki)lg(ki)+k}
        = c ∙ min ⁡ 1 ≤ i ≤ k − 1 { i l g i + ( k − i ) l g ( k − i ) } + k =c∙\min\limits_{1≤i≤k-1}\{i{\rm lg}i+(k-i){\rm lg}(k-i)\}+k =c1ik1min{ilgi+(ki)lg(ki)}+k
  根据上文分析,当 i = k / 2 i = k/2 i=k/2时, i l g i + ( k − i ) l g ( k − i ) i{\rm lg}i+(k-i){\rm lg}(k-i) ilgi+(ki)lg(ki)取得最小值 k l g k − k k{\rm lg}k-k klgkk。于是上式可以继续变换为
     d ( k ) ≥ c ∙ min ⁡ 1 ≤ i ≤ k − 1 { i l g i + ( k − i ) l g ( k − i ) } + k = c ( k l g k − k ) + k = c k l g k + ( 1 − c ) k d(k)≥c∙\min\limits_{1≤i≤k-1}\{i{\rm lg}i+(k-i){\rm lg}(k-i)\}+k=c(k{\rm lg}k-k)+k=ck{\rm lg}k+(1-c)k d(k)c1ik1min{ilgi+(ki)lg(ki)}+k=c(klgkk)+k=cklgk+(1c)k
  根据上式,只要取 c ≤ 1 c ≤ 1 c1,就能使得 d ( k ) ≥ c k l g k d(k)≥ck{\rm lg}k d(k)cklgk成立。
  综上所述, d ( k ) = Ω ( k l g k ) d(k) = Ω(k{\rm lg}k) d(k)=Ω(klgk)成立。
  
  e.
  对于一个 n n n个元素的确定的比较排序算法 A A A,其决策树 T A TA TA的叶结点数目至少为 n ! n! n!,对应 n ! n! n!种可能的排列。那么决策树 T A TA TA D ( T A ) D(TA) D(TA)值的下限为 d ( n ! ) = Ω ( n ! l g ( n ! ) ) d(n!) = Ω(n!{\rm lg}(n!)) d(n!)=Ω(n!lg(n!))
  现在考察平均情况下排序 n n n个元素的时间代价,实际上要考察的是平均情况下单个叶结点的深度,即单个叶结点的深度的期望值 E [ D e p t h ( i ) ] E[Depth(i)] E[Depth(i)]。现在我们来计算所有叶结点的深度的期望和
     ∑ i = 1 n ! E [ D e p t h ( i ) ] = E [ ∑ i = 1 n ! D e p t h ( i ) ] = E [ D ( T A ) ] = Ω ( n ! l g ( n ! ) ) \sum\limits_{i=1}^{n!}E[Depth(i)] =E[\sum\limits_{i=1}^{n!}Depth(i) ]=E[D(T_A )]=Ω(n!{\rm lg}(n!)) i=1n!E[Depth(i)]=E[i=1n!Depth(i)]=E[D(TA)]=Ω(n!lg(n!))
  由于每个叶结点的概率值是一样的,所以每个叶结点的深度的期望值也是相等的。于是单个叶结点的深度的期望值 E [ D e p t h ( i ) ] = ( 1 / n ! ) ∙ Ω ( n ! l g ( n ! ) ) = Ω ( l g ( n ! ) ) = Ω ( n l g n ) E[Depth(i)]=(1/n!)∙Ω(n!{\rm lg}(n!))=Ω({\rm lg}(n!))=Ω(n{\rm lg}n) E[Depth(i)]=(1/n!)Ω(n!lg(n!))=Ω(lg(n!))=Ω(nlgn)。于是,平均情况下排序 n n n个元素的时间代价为 Ω ( n l g n ) Ω(n{\rm lg}n) Ω(nlgn)
  
  f.
  笔者还未能理解题目意思,以后再补上。

你可能感兴趣的:(算法导论)