蓄水池抽樣問題

題目:

微軟電面問到的問題,前面提了一大堆背景,最後歸結爲一個問題,如何在連續的網絡流量中,等概率隨機抽取1個數據包。

分析:

參加電面時,還沒看過蓄水池抽樣問題,後來回來一搜,這就是典型的蓄水池抽樣問題,不過當時自己也想到了一種解法,使用一個變量保存數據包,從1到i個數據包,每次遇到第i個數據包,以1/i的概率選取這個數據包,並且替換原來的數據包,這樣到第n個數據包,我們能保證我們以1/n的概率選取這n個數據包中的1個。

證明:

加入第i個數據包到來,我們以1/i的概率選取這個數據包,顯然,它的概率是符合的,那麼第i-1個數據是不是也符合呢?我們假設第i-1次取數據包時,前面i-1個數據包以1/(i-1)的概率選取,那麼第i-1個數據包被保留下來的概率是1-p(第i個數據包保存)再乘上p(1到i-1次選擇被保存的概率),這裏p(1到i-1次選擇被保存的概率)就是假設的1/(i-1),那麼第i次取包,前i-1個數據包被保存的概率是:

(1 - 1/i) * 1/(i - 1) = 1/i,說明前i-1個數據包的選取概率也是1/i;

由此進行歸納,可以得到最終結果。

擴展:

考慮蓄水池中抽取k個元素。

方法還是一樣,假設前i次選擇時,前i個數據包被選到水庫的概率是k/i,那麼第i+1次選擇時,前面i個數據包保留在水庫中的概率是

k/i * (1 - k/(i + 1) * 1/k) = k/(i + 1)

所以第i+1次選擇,所有的數據包還是以k/(i + 1)的概率保存到水庫中,得證。

僞代碼如下:

Init : a reservoir with the size: k
        for    i= k+1 to N
            M=random(1, i);
            if( M < k)
                 SWAP the Mth value and ith value
       end for

總結:

蓄水池問題非常經典,而且非常實用,需要理解其中原理。

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