条件期望求解快速排序算法复杂度

1 条件期望

定义1(条件期望):给定随机变量 X X X Y Y Y,则有如下条件期望 E [ X ] = E [ E [ X ∣ Y ] ] \mathrm{E}[X]=\mathrm{E}\left[\mathrm{E}[X|Y]\right] E[X]=E[E[XY]]如果 Y Y Y是离散随机变量,则有 E [ X ] = ∑ y E [ X ∣ Y = y ] P { Y = y } \mathrm{E}[X]=\sum\limits_{y}\mathrm{E}[X|Y=y]\mathrm{P}\{Y=y\} E[X]=yE[XY=y]P{Y=y}如果 Y Y Y是密度为 f Y ( y ) f_Y(y) fY(y)的连续随机变量,则有 E [ X ] = ∫ − ∞ ∞ E [ X ∣ Y = y ] f Y ( y ) d y \mathrm{E}[X]=\int_{-\infty}^{\infty}\mathrm{E}[X|Y=y]f_Y(y)dy E[X]=E[XY=y]fY(y)dy

证明: 离散随机变量的证明方式与连续随机变量证明方式一致,具体的证明过程如下所示 ∑ y E [ X ∣ Y = y ] P ( Y = y ) = ∑ y ∑ x x P { X = x ∣ Y = y } P { Y = y } = ∑ y ∑ x x P { X = x , Y = y } P { Y = y } P ( Y = y ) = ∑ y ∑ x x P { X = x , Y = y } = ∑ x x ∑ y P { X = x , Y = y } = ∑ x x P { X = x } = E [ X ] \begin{aligned}\sum\limits_y \mathrm{E}[X|Y=y]\mathrm{P}(Y=y)&=\sum\limits_y\sum\limits_{x}x \mathrm{P}\{X=x|Y=y\}\mathrm{P}\{Y=y\}\\&=\sum\limits_y \sum\limits_{x}x\frac{\mathrm{P}\{X=x,Y=y\}}{\mathrm{P}\{Y=y\}}\mathrm{P}(Y=y)\\&=\sum\limits_{y}\sum\limits_xx\mathrm{P}\{X=x,Y=y\}\\&=\sum\limits_{x}x\sum\limits_{y}\mathrm{P}\{X=x,Y=y\}\\&=\sum\limits_{x}x\mathrm{P}\{X=x\}=\mathrm{E}[X]\end{aligned} yE[XY=y]P(Y=y)=yxxP{X=xY=y}P{Y=y}=yxxP{Y=y}P{X=x,Y=y}P(Y=y)=yxxP{X=x,Y=y}=xxyP{X=x,Y=y}=xxP{X=x}=E[X]证毕。

2 快速排序算法分析

假设有 n n n个不同的值 x 1 , ⋯   , x n x_1,\cdots,x_n x1,,xn的一个集合,将它们按照递增次序排序,完成它的一个有效的算法是快速排序算法。当 n = 2 n=2 n=2时,该算法比较此二值,将它们置于合适的次序。当 n > 2 n>2 n>2时,它开始在 n n n值中随机地选取一个,譬如 x i x_i xi,然后将其它的 n − 1 n-1 n1个值与 x i x_i xi比较,以 S i S_i Si记小于 x i x_i xi的元素的集合, S i ˉ \bar{S_i} Siˉ记大于 x i x_i xi的元素即集合,然后分别对集合 S i S_i Si S i ˉ \bar{S_i} Siˉ分别排序,所以,最后的次序由集合 S i S_i Si元素的次序、 x i x_i xi、集合 S i ˉ \bar{S_i} Siˉ元素的次序排列组成。
假定元素集合是 10 10 10 5 5 5 8 8 8 2 2 2 1 1 1 4 4 4 7 7 7,随机选取一个(即这 7 7 7个值中的每一个选取的概率都是 1 7 \frac{1}7{} 71)。假如值 4 4 4被选取,然后将其它 6 6 6个值得每一个与 4 4 4做比较得到 { 2 , 1 } , 4 , { 10 , 5 , 8 , 7 } \{2,1\},4,\{10,5,8,7\} {2,1},4,{10,5,8,7}将集合 { 2 , 1 } \{2,1\} {2,1}排序得到 1 , 2 , 4 , { 10 , 5 , 8 , 7 } 1,2,4,\{10,5,8,7\} 1,2,4,{10,5,8,7}其次,在 { 10 , 5 , 8 , 7 } \{10,5,8,7\} {10,5,8,7}中随机选取一个,譬如取到的是 7 7 7,而且将其它三个值与 7 7 7作比较得到 1 , 2 , 4 , 5 , 7 , { 10 , 8 } 1,2,4,5,7,\{10,8\} 1,2,4,5,7,{10,8}最后将 { 10 , 8 } \{10,8\} {10,8}得到 1 , 2 , 4 , 5 , 7 , 8 , 10 1,2,4,5,7,8,10 1,2,4,5,7,8,10该算法有效性的一个度量是做次数的期望。假定以 M n M_n Mn n n n个不同值的一个集合的快速排序算法的比较次数的期望。令比较次数的随机变量为 X X X,取到的第 j j j小的值的随机变量为 Y Y Y,则此时可以得到 M n M_n Mn的一个递推式 M n = E [ X ] = E [ E [ X ∣ Y ] ] = ∑ j = 1 n 1 n E [ X ∣ Y ] M_n=\mathrm{E}[X]=\mathrm{E}[\mathrm{E}[X|Y]]=\sum\limits_{j=1}^n \frac{1}{n}\mathrm{E}[X|Y] Mn=E[X]=E[E[XY]]=j=1nn1E[XY]若初始的取值是第 j j j小的值,则较小的集合的容量是 j − 1 j-1 j1,较大的集合的容量是 n − j n-j nj。因此,由于对于选定的初始的取值需要作 n − 1 n-1 n1次比较,可以得到 M n = ∑ j = 1 n 1 n ( n − 1 + M j − 1 + M n − j ) = n − 1 + 2 n ∑ k = 1 n − 1 M k M_n=\sum\limits_{j=1}^n\frac{1}{n}(n-1+M_{j-1}+M_{n-j})=n-1+\frac{2}{n}\sum\limits^{n-1}_{k=1}M_k Mn=j=1nn1(n1+Mj1+Mnj)=n1+n2k=1n1Mk其中 M 0 = 0 M_0=0 M0=0,等价于 n M n = n ( n − 1 ) + 2 ∑ k = 1 n − 1 M k nM_n = n(n-1)+2\sum\limits_{k=1}^{n-1}M_k nMn=n(n1)+2k=1n1Mk为了求解上式,用 n + 1 n+1 n+1代替 n n n得到 ( n + 1 ) M n + 1 = ( n + 1 ) n + 2 ∑ k = 1 n M k (n+1)M_{n+1}=(n+1)n+2\sum\limits_{k=1}^nM_k (n+1)Mn+1=(n+1)n+2k=1nMk因此,经过相减得到 ( n + 1 ) M n + 1 − n M n = 2 n + 2 M n (n+1)M_{n+1}-nM_n=2n+2M_n (n+1)Mn+1nMn=2n+2Mn进一步则有 ( n + 1 ) M n + 1 = ( n + 2 ) M n + 2 n (n+1)M_{n+1}=(n+2)M_n+2n (n+1)Mn+1=(n+2)Mn+2n所以 M n + 1 n + 2 = 2 n ( n + 1 ) ( n + 2 ) + M n n + 1 \frac{M_{n+1}}{n+2}=\frac{2n}{(n+1)(n+2)}+\frac{M_n}{n+1} n+2Mn+1=(n+1)(n+2)2n+n+1Mn将此式迭代给出 M n + 1 n + 2 = 2 n ( n + 1 ) ( n + 2 ) + 2 ( n − 1 ) n ( n + 1 ) + M n − 1 n = ⋯ = 2 ∑ k = 0 n − 1 n − k ( n + 1 − k ) ( n + 2 − k ) \begin{aligned}\frac{M_{n+1}}{n+2}&=\frac{2n}{(n+1)(n+2)}+\frac{2(n-1)}{n(n+1)}+\frac{M_{n-1}}{n}\\&=\cdots\\&=2\sum\limits_{k=0}^{n-1}\frac{n-k}{(n+1-k)(n+2-k)}\end{aligned} n+2Mn+1=(n+1)(n+2)2n+n(n+1)2(n1)+nMn1==2k=0n1(n+1k)(n+2k)nk从而 M n + 1 = 2 ( n + 2 ) ∑ k = 0 n − 1 n − k ( n + 1 − k ) ( n + 2 − k ) = 2 ( n + 2 ) ∑ i = 1 n i ( i + 1 ) ( i + 2 ) , n ≥ 1 M_{n+1}=2(n+2)\sum\limits_{k=0}^{n-1}\frac{n-k}{(n+1-k)(n+2-k)}=2(n+2)\sum\limits_{i=1}^n\frac{i}{(i+1)(i+2)},\quad n\ge 1 Mn+1=2(n+2)k=0n1(n+1k)(n+2k)nk=2(n+2)i=1n(i+1)(i+2)i,n1利用恒等式 i [ ( i + 1 ) ( i + 2 ) ] = 2 ( i + 2 ) − 1 ( i + 1 ) \frac{i}{[(i+1)(i+2)]}=\frac{2}{(i+2)}-\frac{1}{(i+1)} [(i+1)(i+2)]i=(i+2)2(i+1)1,则可以得到如下近似 M n + 1 = 2 ( n + 2 ) [ ∑ i = 1 n 2 i + 2 − ∑ i = 1 n 1 i + 1 ] ∼ 2 ( n + 2 ) [ ∫ 3 n + 2 2 x d x − ∫ 2 n + 1 1 x d x ] = 2 ( n + 2 ) [ 2 ln ⁡ ( n + 2 ) − ln ⁡ ( n + 1 ) + ln ⁡ 2 − 2 ln ⁡ 3 ] = 2 ( n + 2 ) [ ln ⁡ ( n + 2 ) + ln ⁡ n + 2 n + 1 + ln ⁡ 2 − 2 ln ⁡ 3 ] ∼ 2 ( n + 2 ) ln ⁡ ( n + 2 ) \begin{aligned}M_{n+1}&=2(n+2)\left[\sum\limits_{i=1}^n\frac{2}{i+2}-\sum\limits_{i=1}^n\frac{1}{i+1}\right]\\&\sim2(n+2)\left[\int_3^{n+2}\frac{2}{x}dx-\int_2^{n+1}\frac{1}{x}dx\right]\\&=2(n+2)[2\ln(n+2)-\ln(n+1)+\ln 2 - 2\ln 3]\\&=2(n+2)\left[\ln(n+2)+\ln\frac{n+2}{n+1}+\ln2 - 2\ln 3\right]\\&\sim 2(n+2)\ln(n+2)\end{aligned} Mn+1=2(n+2)[i=1ni+22i=1ni+11]2(n+2)[3n+2x2dx2n+1x1dx]=2(n+2)[2ln(n+2)ln(n+1)+ln22ln3]=2(n+2)[ln(n+2)+lnn+1n+2+ln22ln3]2(n+2)ln(n+2)进而可以知道快速排序算法的复杂度的期望是 O ( n log ⁡ n ) O(n\log n) O(nlogn)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道2024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值