基於概率的算法分析摘要

基於概率的算法分析摘要

有如下的算法:
HireAssitant()
{
Best=0;
For 1 to n
{
    Interview candidate I;
    If( candidate I is better than best)
    {
        Best = I;
        Hire I;
}
}
}
上述算法中,有兩個地方會花費時間,一個是interview,一個是hire。不過我們可以忽略interview,因爲它的代價較小,而且總需要執行n次。但Hire的代價較大,而且執行次數依賴於輸入數據的順序。

怎麼計算這個算法的複雜度呢?
顯然這和輸入有關係,最壞情況下,如果輸入是一個順序排列的數組,那麼每個都interview一次並hire一次。那麼複雜度是O(nc).其中c是一個常數。

但是大多數情況下,並不會發生這樣的事情。實際的輸入是近乎隨機的,一會兒來了個好的,一會兒來了個差的。假如你是人力資源的總監的話,你就需要估算一下在這種隨機的情況下,時間花費是多少?
爲了方便研究隨機算法的複雜度,我們引入一個變量,I(A),它表明一個隨機事件是否真的發生了。如果這個事件發生的概率是P,那麼I的期望就是P。因此這個變量有助於在期望和概率之間進行轉換。
當我們需要計算1000個樣本事件中,期望發生多少次時,用I這個變量通常比較簡單。比如每個產品是次品的概率是P,那麼N個產品中次品的期望是多少?
一種算法是:Sum(k*包含K個次品的概率)其中K從1到n。經過複雜的計算可以得到期望是n*p。
如果通過I的話,I(x)表示第x個產品爲次品。那麼Sum(I(x))其中x從1到n就是要求的答案。由於I的期望就是x是次品的概率,所以n個p相加,自然就是np了。

如果我們用I來分析Hire算法的話,也是相當的簡單的。
我們能設I(k)表示第k個候選的是被Hire的,那麼就意味着k是前k個人中最好的一位。由於候選人員是隨機分佈的,前k個人中的最好的一個可以出現在k個位置中的任何一個,即是1/k。那麼關於Hire次數的期望就是所有I(k)期望的總和。即是:
1+1/2+1/3+…1/n
我們知道1/x的積分是ln(x),所以上述和近似於ln(n)。

在上面的證明中,我們假設用戶輸入是隨機的,但實際情況裏,這可能不是事實。一個好的算法應該能保證在任何輸入下都能在控制中運行。假設你宣傳你的算法在10秒內完成,結果用戶一個輸入用了20秒,這時候你纔想起最壞情況,恐怕已經晚了。

爲了必然這種情況,有必要在算法中加入隨機這一步,在算法的開始就將輸入打亂成一個隨機的序列。這樣可以減少最壞情況的發生。

通常有兩種方法來達到這一點,第一種是把n個輸入與n個不同的隨機數關聯起來,對輸入以相關聯的隨機數排序,這樣輸出的n個數具有更大的隨機性。第二種是對n個輸入中的每個數,依次與它後面的隨機選的一個數進行交換。這樣出來的結果是輸入中的每個數以同等概率出現在輸出中的每個位置。

最後一個概率的小題目。
在一個有n個人的房間裏,出現兩個人生日相同的概率是多少?
首先兩個人生日相同的概率是1/365,忽略閏年。
N個人選兩個的組合數是N*(N-1)/2。
所以概率是N*(N-1)/730.
這是一個有趣的結論,因爲只要人數達到23,就會有超過50%的概率出現相同生日的人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章