蓄水池問題

2021-06-20 11:57:30 字數 1185 閱讀 3328

蓄水池問題描述:

假設有n個數,從中隨機抽取k個數字,如果保證抽取的過程是等概率的?其中n是不固定的

類似問題:   

1.  從100個數字抽取20個,如果向100個數字中再增加20個呢?

2.  給你乙個長度為n的鍊錶,n很大,但你不知道n有多大,你的任務是從這n個元素中取出k個元素,你只能遍歷一次這個鍊錶,演算法保證取出的元素恰好有              

k個,且他們是完全隨機的.

3.  從乙個不知長度的檔案中隨機取出k行

4.  從實時搜尋的詞中隨機抽出k個詞

由於n是無法在抽取是確定的,但是又要保證是隨機的,所以此問題需要乙個特定的演算法,即是蓄水池演算法

演算法用**表示如下:

int n,k;

void slove(int n,int k)

}

假設k = 20000,當有20001個元素時,第20001個元素被抽中的概率是20000/20001,那麼前20000個元素被抽中的概率是多少呢?如果利用上面的蓄水池演算法也是20000/20001,那麼就符合我們的要求,下面用數學歸納法加以證明:

蓄水池中最多放入k個元素,設定當前元素為i,當i = k+1,k+2....,n時,

1. 當i = k+1是,第i個元素出現在蓄水池中的概率是k/k+1,前k個元素出現在蓄水池中的概率顯然也是k/k+1

2. 假設當j = i 時,而且第i個元素出現在蓄水池中的概率是k/i,那麼前i-1個元素出現在蓄水池中的概率也是k/i

3. 當j = i+1時,第i+1個元素出現在蓄水池中的概率明顯是k/(i+1),現在證明前i個元素出現在蓄水池中的概率也是k/(i+1)

前i個元素出現在蓄水池中說明 ① 在第i+1次選擇前,前i個元素已經在蓄水池中②在第i+1次選擇時,前i個元素沒有被替換掉

①由2知,前i個元素已經在蓄水池中的概率是是k/i

②先考慮被替換的因素,被替換說明:第一,第i+1個元素被抽中,概率是k/(i+1);第二,有乙個蓄水池元素被抽中,概率是1/k

那麼某個元素被替換的概率是k/(i+1) * 1/k = 1/(i+1),那麼前i個元素在池中且沒有替換掉的概率是1-1/(i+1) =  i/(i+1)

綜上所述,前i個元素出現在蓄水池中的概率是(k/i)*(i/(i+1))= k/(i+1).

參考文獻:

陳利人  待字閨中

蓄水池抽樣問題

題目 微軟電面問到的問題,前面提了一大堆背景,最後歸結為乙個問題,如何在連續的網路流量中,等概率隨機抽取1個資料報。分析 參加電面時,還沒看過蓄水池抽樣問題,後來回來一搜,這就是典型的蓄水池抽樣問題,不過當時自己也想到了一種解法,使用乙個變數儲存資料報,從1到i個資料報,每次遇到第i個資料報,以1 ...

蓄水池抽樣問題

為分析使用者行為,系統常需儲存使用者的一些query,但因query非常多,故系統不能全存,設系統每天只存m個query,現設計乙個演算法,對使用者請求的query進行隨機選擇m個,請給乙個方案,使得每個query被抽中的概率相等,並分析之,注意 不到最後一刻,並不知使用者的總請求量。蓄水池抽樣問題...

reservoid sample 蓄水池問題

題目 如何從無窮盡流中等概率的抽樣出乙個單詞?或許我們換一種說法會更加容易理解.等概率的抽取出乙個單詞,也即隨機的抽取乙個單詞。本體的難點在於沒有給定單詞數,而是乙個無盡的流。這個問題可以用蓄水池抽樣的方法來思考。先簡單的介紹一下蓄水池抽樣 reservoid sample 演算法,我們可以結合演算...