眾所周知,猴子排序打破了排序演算法$o(n\log)$的桎梏(霧),具體的話,顯然最好情況一次成功就是$o(n)$,最壞情況那就$o(+\infty)$了。期望是多少呢?讓我來推導一番(逃)。
首先,設序列長度為$n$,每次打亂序列和檢測是否有序為$o(n)$,每次成功的概率為$\frac$(全排列共$n!$種),失敗的概率為$1-\frac$。我們令$x$為排序成功所需的打亂次數,則$p(x=k)=p_^×p_^$(乘法原理)。那麼猴子排序的期望複雜度就是$o(e(x)*n)$
x分布列如下表所示——
$x$$1$
$2$$3$
$\cdots$
$k$$\cdots$
$+\infty$
$p(x=k)$
$\frac$
$\left(1-\frac\right)^×\frac$
$\left(1-\frac\right)^×\frac$
$\cdots$
$\left(1-\frac\right)^×\frac$
$\cdots$
$+\infty$
有了分布列就來求x的期望吧——
$$e(x)=1×\frac+2×\left(1-\frac\right)^×\frac+3×\left(1-\frac\right)^×\frac+\cdots+k×\left(1-\frac\right)^×\frac+\cdots$$
$$=\frac×\left[1×\left(1-\frac\right)^+2×\left(1-\frac\right)^+3×\left(1-\frac\right)^+\cdots+k×\left(1-\frac\right)^+\cdots\right]$$
$$=\frac×\sum_^\left[\right)^}\right]$$
嗯……這個級數怎麼求和啊?
寫個程式跑一下吧,求和求到二百萬應該夠了,再往上long double的精度也不資磁了……
#include#include執行結果——intmain()
e/=fac;
printf(
"e(x)=%lf (n=%d)\n
",e,n);
}return0;
}
n大於8以後,long double都爆了……忽略它們!(觀眾:你……)
於是我們猜想——$e(x)=n!$。
上網一查,猴子排序複雜度果然是$o(n×n!)$,於是,猜想成立,推導完畢……(博主已***)
留坑,等我會求那坨級數求和再來填坑吧(逃)大家別學我
排序的複雜度
1.基本概念 1.1 穩定排序 stable sort 和非穩定排序 穩定排序是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,反之,就是非穩定的排序。比如 一組數排序前是a1,a2,a3,a4,a5,其中a2 a4,經過某種排序後為a1,a2,a4,a3,a5,則我們說這種排序是...
快速排序的時間複雜度與期望比較次數
眾所周知,快速排序的時間複雜度為 o n textn 雖然對此很容易直觀理解,但由於演算法的隨機特性,這一時間複雜度的嚴格證明並非顯然的。我將在這裡說明如何計算快速排序執行過程中的比較次數的期望,以此得到對時間複雜度的較為嚴謹的證明。定義 e n 為對長度為 n 的陣列進行排序所需要的期望比較次數。...
演算法時間複雜度的簡單推導
for i 1 i n 1 1 n from 1 to n 1,共n個數字1是下界,n是上界。n雖不進入迴圈體,但是在這裡卻需要計算。從下界到上界共計算了n 1 1次 n 1 1 1 n 1 from 1 to n 1,共n 1個數字迴圈從1到n 1,計算了n 1 1 1 n 1次。n 1 2n 1...