蓄水池抽樣問題

2021-09-30 10:18:22 字數 1322 閱讀 1756

部分內容**

這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量n是無法在抽樣開始時確定的;但又要保持隨機性,於是有了這個問題。所以搜尋**有時候會問這樣的問題。

此型別的演算法題有:

谷歌面試題:給定乙個資料流,其中包含無窮盡的搜尋關鍵字(比如,人們在谷歌搜尋時不斷輸入的關鍵字) 。如何才能從這個無窮盡的流中隨機的選取 1000 個關鍵字?

這裡的核心問題就是「隨機」,怎麼才能是隨機的抽取元素呢?我們設想,買彩票的時候,由於所有彩票的中獎概率都是一樣的,所以我們才是「隨機的」買彩票。那麼要使抽取資料也隨機,必須使每乙個資料被抽樣出來的概率都一樣。

【解決】

解決方案就是蓄水庫抽樣(reservoid sampling)。主要思想就是保持乙個集合(這個集合中的每個數字出現),作為蓄水池,依次遍歷所有資料的時候以一定概率替換這個蓄水池中的數字。

其偽**如下:

init: a reservoir with the size: k

fori= k+1ton

m=random(1, i);

if( m < k)

swapthe mth valueandith value

end for

證明:每次選擇時,蓄水池出現每個數的概率為k/(已選過的數字數目)。用歸納法證明:

1.當 i <= k 時,第i個數出現在蓄水池中的概率為1.

2.假設當選到第i個數時,前i個數出現在蓄水池中的概率為k/i

3.當i+1個數時,第i+1個數出現在蓄水池中的概率為這個數被選中替換蓄水池中的數的概率,也就是k/i+1;

前i個數出現在蓄水池中的概率為,前i次替換**現在蓄水池中(事件a)且第i+1次沒有被替換的概率(事件b).p = p(a)*p(b);

p(a) = k/i,根據假設;p(b) = p(第i+1個數沒被選中)+p(第i+1個數被選中)*p(當前數字不是被替換的數字)= (1- k/(i+1)) + k/(i+1) * (k-1)/k = i/(i+1);

所以p = k/i * i/(i+1) = k/(i+1)

故證明成立 

同樣的道理可以應用到類似的題目中,例如:

谷歌面試題:給定乙個未知長度的整數流,如何隨機選取乙個數

方法:儲存乙個數作為蓄水池,對第i個數,用1/i的概率替換蓄水池中的那個數,最後得到隨機數。利用這種方法,我們只需儲存乙個隨機數,和迄今整數流的長度即可。所以可以處理任意長的整數流。

蓄水池抽樣問題

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

蓄水池抽樣問題

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

蓄水池抽樣問題

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