衆所周知,猴子排序打破了排序算法$O(n\log{n})$的桎梏(霧),具體的話,顯然最好狀況一次成功就是$O(n)$,最壞狀況那就$O(+\infty)$了。指望是多少呢?讓我來推導一番(逃)。算法
首先,設序列長度爲$n$,每次打亂序列和檢測是否有序爲$O(n)$,每次成功的機率爲$\frac{1}{n!}$(全排列共$n!$種),失敗的機率爲$1-\frac{1}{n!}$。咱們令$X$爲排序成功所需的打亂次數,則$P(X=k)=P_{成功}^{1}×P_{失敗}^{k-1}$(乘法原理)。那麼猴子排序的指望複雜度就是$O(E(X)*n)$spa
X分佈列以下表所示——code
$X$ | $1$ | $2$ | $3$ | $\cdots$ | $k$ | $\cdots$ | $+\infty$ |
$P(X=k)$ | $\frac{1}{n!}$ | $\left(1-\frac{1}{n!}\right)^{2-1}×\frac{1}{n!}$ | $\left(1-\frac{1}{n!}\right)^{3-1}×\frac{1}{n!}$ | $\cdots$ | $\left(1-\frac{1}{n!}\right)^{k-1}×\frac{1}{n!}$ | $\cdots$ | $+\infty$ |
有了分佈列就來求X的指望吧——blog
$$E(X)=1×\frac{1}{n!}+2×\left(1-\frac{1}{n!}\right)^{2-1}×\frac{1}{n!}+3×\left(1-\frac{1}{n!}\right)^{3-1}×\frac{1}{n!}+\cdots+k×\left(1-\frac{1}{n!}\right)^{k-1}×\frac{1}{n!}+\cdots$$排序
$$=\frac{1}{n!}×\left[1×\left(1-\frac{1}{n!}\right)^{0}+2×\left(1-\frac{1}{n!}\right)^{1}+3×\left(1-\frac{1}{n!}\right)^{2}+\cdots+k×\left(1-\frac{1}{n!}\right)^{k-1}+\cdots\right]$$io
$$=\frac{1}{n!}×\sum_{i=1}^{\infty}\left[{i×\left(1-\frac{1}{n!}\right)^{i-1}}\right]$$table
嗯……這個級數怎麼求和啊?class
寫個程序跑一下吧,求和求到二百萬應該夠了,再往上long double的精度也不資磁了……變量
#include<stdio.h> #include<math.h> int main() { double fac=1;//n! for(int n=1;n<=10;n++) { long double E=0; fac*=n; for(int i=1;i<=2000000;i++) { E+=i*pow((fac-1.0)/fac,i-1); } E/=fac; printf("E(X)=%Lf (n=%d)\n",E,n); } return 0; }
運行結果——原理
n大於8之後,long double都爆了……忽略它們!(觀衆:你……)
因而咱們猜測——$E(X)=n!$。
上網一查,猴子排序複雜度果真是$O(n×n!)$,因而,猜測成立,推導完畢……(博主已被打死)
留坑,等我會求那坨級數求和再來填坑吧(逃)你們別學我
2019年1月21日13:45:56更新
填坑啦!填坑啦!(這學期高數應該不會掛了嘻嘻)
那個$E(X)=\frac{1}{n!}×\sum_{i=1}^{\infty}\left[{i×\left(1-\frac{1}{n!}\right)^{i-1}}\right]$是一個以$n$爲自變量的冪級數,對$E(X)$逐項積分可得$$\int {E(X)\,dn}=\frac{1}{n!}×\sum_{i=1}^{\infty}\left(1-\frac{1}{n!}\right)^i$$
又
$$\sum_{i=1}^{\infty}k^i=\frac{1}{1-k}-1 (-1<k<1)$$
令$k=1-\frac{1}{n!}$
則$$\int {E(X)\,dn}=\frac{1}{n!}×(n!-1)=1-\frac{1}{n!}$$
兩邊再求導可得……可得啥來着?稍等……再次留坑