对 ∑ k = 1 n k ! k n − k n ! \sum_{k = 1}^{n}{\frac{k!k^{n-k}}{n!}} ∑k=1nn!k!kn−k 的渐进分析
已经有了很好的回答,在这里我只想谈谈
n + 1 − ∑ k = 1 n k ! k n − k n ! n+1-\sum_{k = 1}^{n}{\frac{k!k^{n-k}}{n!}} n+1−∑k=1nn!k!kn−k 是怎么来的
根据计算机程序设计艺术卷3:排序与查找(第二版) Donald E. Knuth著 贾洪峰译 人民邮电出版社 第84页的解说,我们实际上只需要理解为什么当 1 ≤ k ≤ n 1 \leq k \leq n 1≤k≤n 时所有分量均小于 k k k 的反序表数目是
k ! k n − k k!k^{n-k} k!kn−k 其实非常简单,由上面提到的著作第8页给出的不等式 0 ≤ b 1 ≤ n − 1 0 \leq b_{1} \leq n-1 0≤b1≤n−1
0 ≤ b 2 ≤ n − 2 − − − − − 0 ≤ b n − 1 ≤ 1 b n = 0 0 \leq b_{2} \leq n-2 ----- 0 \leq b_{n-1} \leq 1 b_{n} = 0 0≤b2≤n−2−−−−−0≤bn−1≤1bn=0
b 1 b_{1} b1 有 0 − − − k − 1 0---k-1 0−−−k−1 这 k k k 种选择, b 2 b_{2} b2 同样有 0 − − − k − 1 这 k 0---k-1 这 k 0−−−k−1这k 种选择,-------
b n − k b_{n-k} bn−k 同样有 0 − − − k − 1 0---k-1 0−−−k−1 这 k k k 种选择,
再往下 b n − k + 1 b_{n-k + 1} bn−k+1 有 0 − − − k − 1 0---k-1 0−−−k−1 这 k k k 种选择, b n − k + 2 b_{n-k+2} bn−k+2 有 0 − − − k − 2 0---k-2 0−−−k−2 这 k − 1 k-1 k−1 种选择
b n − k + 3 b_{n-k+3} bn−k+3 有 0 − − − k − 3 0---k-3 0−−−k−3 这 k − 2 k-2 k−2 种选择—以此类推 b n − 1 b_{n-1} bn−1 有2种选择, b n b_{n} bn 有1种选择,从而由乘法原理总共有 k ! k n − k k!k^{n-k} k!kn−k 种选择,故当 1 ≤ k ≤ n 1 \leq k \leq n 1≤k≤n 时所有分量均小于 k 的反序表数目是
k ! k n − k k!k^{n-k} k!kn−k有了这一结论其他也就不难理解了
另一种证明思路
设待排序序列为 A , A A , A A,A 的长度 n ≥ 2 n \geq2 n≥2 , A A A 中元素按从小到大的顺序排序为 S = [ S 1 , S 2 , − − − , S n ] S 1 < S 2 < − − − < S n S=[S1,S2,---,Sn] S1<S2<---<Sn S=[S1,S2,−−−,Sn]S1<S2<−−−<Sn
现考虑按从小到大的顺序排序元素的冒泡排序算法。我们用 1 , 2 , 3 , − − − , n 1,2,3,---,n 1,2,3,−−−,n 分别索引被排序元素所处的 n n n 个槽位,初始时, A A A 的 n n n 个元素分别位于槽位 1 , 2 , 3 , − − − , n 1,2,3,---,n 1,2,3,−−−,n 上,记 P k ( i , j ) P_{k}(i,j) Pk(i,j) 为第 k 轮冒泡排序后 S i S_{i} Si 位于槽位 j j j 上的概率
由于排序的初始序列 A A A 可以被认为是随机给定的,所以 S i 1 < = i < = n Si 1<=i<=n Si1<=i<=n 恰位于槽位 j ( 1 < = j < = n ) j ( 1<=j<=n ) j(1<=j<=n)上的概率 P 0 ( i , j ) P_{0}(i,j) P0(i,j) 为 1 n \frac{1}{n} n1 (1)
考虑冒泡排序第 k 轮排序前( 1 < = k < = n − 1 1<=k<=n-1 1<=k<=n−1 )的状态,此时槽位 n − k + 2 n-k+2 n−k+2 到 n n n 上的元素从小到大排序,恰为 A A A 的前 k − 1 k-1 k−1 大的数,而槽位 1 1 1 到 n − k + 1 n-k+1 n−k+1 上的元素则可能处于无序状态,由数学归纳法和(1),现在在 P k − 1 ( i , j ) ( 1 ≤ i ≤ n − k + 11 ≤ j ≤ n − k + 1 ) P_{k-1}(i,j)( 1\leq i \leq n-k+1 1\leq j \leq n-k+1 ) Pk−1(i,j)(1≤i≤n−k+11≤j≤n−k+1) 已经求出的情况下计算 P k ( i , j ) ( 1 ≤ i ≤ n − k 1 ≤ j ≤ n − k ) P_{k}(i,j) ( 1 \leq i \leq n-k 1 \leq j \leq n-k ) Pk(i,j)(1≤i≤n−k1≤j≤n−k)
事实上
P k ( i , j ) = ( 1 − ∑ s = j + 2 n − k + 1 P k − 1 ( i , s ) ) [ P k − 1 ( i , j ) ∗ ∏ m = 1 j − 1 ∑ q = 1 i − 1 P k − 1 ( q , m ) ∗ ∑ s = i + 1 n − k + 1 P k − 1 ( s , j + 1 ) + ( ∑ s = 1 j − 1 ( P k − 1 ( i , s ) ∗ ∏ m = 1 , m ≠ s j ∑ q = 1 i − 1 P k − 1 ( q , m ) ) ) ∗ ∑ s = i + 1 n − k + 1 P k − 1 ( s , j + 1 ) + P k − 1 ( i , j + 1 ) ( 1 − ∏ m = 1 j ∑ q = 1 i − 1 P k − 1 ( q , m ) ) ] P_{k}(i,j) = (1-\sum_{s = j + 2}^{n-k+1}{P_{k-1}(i,s)}) [P_{k-1}(i,j)*\prod_{m=1}^{j-1}\sum_{q = 1}^{i-1}{P_{k-1}(q,m)}*\sum_{s = i+1}^{n-k+1}{P_{k-1}(s,j+1)}+(\sum_{s = 1}^{j-1}({P_{k-1}(i,s)}*\prod_{m=1,m\ne s}^{j}\sum_{q=1}^{i-1}{P_{k-1}(q,m)}))*\sum_{s=i+1}^{n-k+1}{P_{k-1}(s,j+1)}+P_{k-1}(i, j+1)(1-\prod_{m=1}^{j}\sum_{q = 1}^{i-1}{P_{k-1}(q,m)})] Pk(i,j)=(1−∑s=j+2n−k+1Pk−1(i,s))[Pk−1(i,j)∗∏m=1j−1∑q=1i−1Pk−1(q,m)∗∑s=i+1n−k+1Pk−1(s,j+1)+(∑s=1j−1(Pk−1(i,s)∗∏m=1,m=sj∑q=1i−1Pk−1(q,m)))∗∑s=i+1n−k+1Pk−1(s,j+1)+Pk−1(i,j+1)(1−∏m=1j∑q=1i−1Pk−1(q,m))]
(2)
注意, j + 2 > n − k + 1 j+2 > n-k + 1 j+2>n−k+1 时 ∑ s = j + 2 n − k + 1 P k − 1 ( i , s ) = 0 \sum_{s = j + 2}^{n-k+1}{P_{k-1}(i,s)} = 0 ∑s=j+2n−k+1Pk−1(i,s)=0
j = 1 j=1 j=1 时 ∏ m = 1 j − 1 ∑ q = 1 i − 1 P k − 1 ( q , m ) = 1 \prod_{m=1}^{j-1}\sum_{q = 1}^{i-1}{P_{k-1}(q,m)} = 1 ∏m=1j−1∑q=1i−1Pk−1(q,m)=1
j = 1 j=1 j=1 时 ( ∑ s = 1 j − 1 ( P k − 1 ( i , s ) ∗ ∏ m = 1 , m ≠ s j ∑ q = 1 i − 1 P k − 1 ( q , m ) ) ) = 0 (\sum_{s = 1}^{j-1}({P_{k-1}(i,s)}*\prod_{m=1,m\ne s}^{j}\sum_{q=1}^{i-1}{P_{k-1}(q,m)})) = 0 (∑s=1j−1(Pk−1(i,s)∗∏m=1,m=sj∑q=1i−1Pk−1(q,m)))=0
i = 1 i = 1 i=1 时 ∑ q = 1 i − 1 P k − 1 ( q , m ) = 0 \sum_{q=1}^{i-1}{P_{k-1}(q,m)} = 0 ∑q=1i−1Pk−1(q,m)=0
于是第 k 轮排序后 S i Si Si 1 < = i < = n − k 1<=i<=n-k 1<=i<=n−k落到槽位 j ( 1 < = j < = n − k 1<=j<=n-k 1<=j<=n−k )上的概率为 P k ( i , j ) P_{k}(i,j) Pk(i,j)
现考虑第k轮排序,记事件 B i k B_{i}^{k} Bik 表示第k轮排序完成后 S i Si Si 恰位于槽位 i 上( 1 < = i < = n − k 1<=i<=n-k 1<=i<=n−k )
记事件 C k C^{k} Ck 表示第k轮排序完成后 1 , 2 , − − − , n − k 1,2,---,n-k 1,2,−−−,n−k 槽位上的元素完全有序(从小到大)
则 P ( C k ) = P ( B 1 k B 2 k − − − B n − k k ) P(C^{k}) = P(B_{1}^{k}B_{2}^{k}---B_{n-k}^{k}) P(Ck)=P(B1kB2k−−−Bn−kk)
= P ( B 1 k ) P ( B 2 k ∣ B 1 k ) − − − P ( B n − k k ∣ B 1 k − − − B n − k − 1 k ) =P(B_{1}^{k})P(B_{2}^{k}|B_{1}^{k})---P(B_{n-k}^{k}|B_{1}^{k}---B_{n-k-1}^{k}) =P(B1k)P(B2k∣B1k)−−−P(Bn−kk∣B1k−−−Bn−k−1k)
注意到 P ( B n − k k ∣ B 1 k − − − B n − k − 1 k ) = 1 P(B_{n-k}^{k}|B_{1}^{k}---B_{n-k-1}^{k}) =1 P(Bn−kk∣B1k−−−Bn−k−1k)=1 故 P ( C k ) = P ( B 1 k ) P ( B 2 k ∣ B 1 k ) − − − P ( B n − k − 1 k ∣ B 1 k − − − B n − k − 2 k ) P(C^{k}) = P(B_{1}^{k})P(B_{2}^{k}|B_{1}^{k})---P(B_{n-k-1}^{k}|B_{1}^{k}---B_{n-k-2}^{k}) P(Ck)=P(B1k)P(B2k∣B1k)−−−P(Bn−k−1k∣B1k−−−Bn−k−2k)
现在我们来计算 P ( B m k ∣ B 1 k − − − B m − 1 k ) 2 < = m < = n − k − 1 P(B_{m}^{k}|B_{1}^{k}---B_{m-1}^{k}) 2<=m<=n-k-1 P(Bmk∣B1k−−−Bm−1k)2<=m<=n−k−1
如果事件 B 1 k − − − B m − 1 k B_{1}^{k}---B_{m-1}^{k} B1k−−−Bm−1k 发生,即第 k 轮排序结束后 S 1 − − − S m − 1 S1---Sm-1 S1−−−Sm−1 分别位于槽位 1 , 2 , − − − , m − 1 1,2,---,m-1 1,2,−−−,m−1 上 对冒泡排序而言,在第 k 轮排序中,当槽位 m − 1 m-1 m−1 和 m m m 上的元素比较交换完成后,前 m − 1 m-1 m−1 个槽位上的元素就完全确定了,和第k轮排序完成后的结果一致,恰为前 m − 1 m-1 m−1 小的元素(由小到大排列),故此时要使 B m k B_{m}^{k} Bmk 发生,则 S m Sm Sm 必须位于槽位 m m m 或 m + 1 m+1 m+1 上
当 S m Sm Sm 位于槽位 m m m 上时, m + 1 m+1 m+1 上的元素 S m + 1 ′ S_{m+1}^{'} Sm+1′ 必须大于 S m Sm Sm (3)
当 S m Sm Sm 位于 m + 1 m+1 m+1 上时, m m m 上的元素 S m ′ S_{m}^{'} Sm′ 必须大于 S m Sm Sm (4)(以上论断的正确性请读者自己思考)
不难看出(3)自动成立,这是因为此时槽位 1 , − − − , m − 1 1,---,m-1 1,−−−,m−1 由前 m − 1 m-1 m−1 小的元素占据,从而槽位 m , m + 1 , − − − , n − k m,m+1,---,n-k m,m+1,−−−,n−k上排列着第 m , m + 1 , − − − , n − k m,m+1,---,n-k m,m+1,−−−,n−k 小的元素,故此时当 S m Sm Sm 位于槽位 m m m 上时,槽位 m + 1 m+1 m+1 上的元素 S m + 1 ′ S_{m+1}^{'} Sm+1′ 只能是第 m + 1 m+1 m+1 小或第 m + 2 m+2 m+2 小—或第 n − k n-k n−k 小元素,从而必有 S m + 1 ′ > S m S_{m+1}^{'}>Sm Sm+1′>Sm (5)
类似的不难看出(4)自动成立 (6)
另外此时由(2) S m Sm Sm 位于槽位 m + 1 m+1 m+1 位置的概率为 P k − 1 ( m , m + 1 ) P_{k-1}(m, m+1) Pk−1(m,m+1) , 而 S m Sm Sm 位于 m m m 位置的概率为 ∑ q = 1 m P k − 1 ( m , q ) \sum_{q = 1}^{m}{P_{k-1}(m,q)} ∑q=1mPk−1(m,q)
由(5)当 S m Sm Sm 位于槽位 m m m 上时, m + 1 m+1 m+1 上的元素 S m + 1 ′ S_{m+1}^{'} Sm+1′ 大于 S m Sm Sm
的概率为 1
而由(6)当 S m Sm Sm 位于 m + 1 m+1 m+1 上时,槽位 m m m 上的 S m ′ > S m S_{m}^{'} > Sm Sm′>Sm 的概率为 1
故 P ( B m k ∣ B 1 k − − − B m − 1 k ) = ∑ q = 1 m P k − 1 ( m , q ) ∗ 1 + P k − 1 ( m , m + 1 ) ∗ 1 P(B_{m}^{k}|B_{1}^{k}---B_{m-1}^{k}) = \sum_{q = 1}^{m}{P_{k-1}(m,q)}*1+P_{k-1}(m, m+1)*1 P(Bmk∣B1k−−−Bm−1k)=∑q=1mPk−1(m,q)∗1+Pk−1(m,m+1)∗1 (7)
注意当 m = 1 m=1 m=1 时(7)依然成立
这样我们有 P ( C k ) = ∏ m = 1 n − k − 1 ( ∑ q = 1 m P k − 1 ( m , q ) + P k − 1 ( m , m + 1 ) ) P(C^{k})=\prod_{m=1}^{n-k-1}(\sum_{q = 1}^{m}{P_{k-1}(m,q)}+P_{k-1}(m, m+1)) P(Ck)=∏m=1n−k−1(∑q=1mPk−1(m,q)+Pk−1(m,m+1)) (8)
P ( 排序轮数恰为 i 轮 ) = ∏ k = 1 i − 1 ( 1 − P ( C k ) ) P ( C i ) P(排序轮数恰为i轮)=\prod_{k=1}^{i-1}(1-P(C^{k}))P(C^{i}) P(排序轮数恰为i轮)=∏k=1i−1(1−P(Ck))P(Ci) (9)
冒泡排序排序轮数的期望次数 E = ∑ i = 1 n − 1 i P ( 排序轮数恰为 i 轮 ) E=\sum_{i=1}^{n-1}{iP(排序轮数恰为i轮)} E=∑i=1n−1iP(排序轮数恰为i轮) (10)
注意,(9)式中 i = 1 i=1 i=1 时 ∏ k = 1 i − 1 ( 1 − P ( C k ) ) = 1 \prod_{k=1}^{i-1}(1-P(C^{k})) =1 ∏k=1i−1(1−P(Ck))=1
(8)式中 k = n − 1 k=n-1 k=n−1 时(8)式即为 1
联立(8)(9)(10)式可得冒泡排序轮数期望值的展开式,但该展开式的渐进分析比较繁琐困难,也不是本文的重点,有兴趣的读者可以尝试以下分析该展开式的渐进表达式