蓄水池抽樣問題

2021-06-09 04:22:14 字數 960 閱讀 8962

題目:

微軟電面問到的問題,前面提了一大堆背景,最後歸結為乙個問題,如何在連續的網路流量中,等概率隨機抽取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

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

蓄水池抽樣問題

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

蓄水池抽樣問題

一般有兩種問題,一種是從乙個未知的序列中隨機選擇乙個,因此其概率為1 m,m代表當前元素 當從乙個未知的序列中挑選k個元素或者從乙個已知序列長度為n n非常大 中挑選k個元素,使每個元素被挑選的概率均等,稱之為蓄水池取樣問題。具體思路是 首先挑選k個元素,放入蓄水池中 然後從第k 1個元素開始,使得...

蓄水池抽樣問題

部分內容 這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量n是無法在抽樣開始時確定的 但又要保持隨機性,於是有了這個問題。所以搜尋 有時候會問這樣的問題。此型別的演算法題有 谷歌面試題 給定乙個資料流,其中包含無窮盡的搜尋關鍵字 比如,人們在谷歌...