一般有兩種問題,一種是從乙個未知的序列中隨機選擇乙個,因此其概率為1/m,m代表當前元素;
當從乙個未知的序列中挑選k個元素或者從乙個已知序列長度為n(n非常大)中挑選k個元素,使每個元素被挑選的概率均等,稱之為蓄水池取樣問題。具體思路是:首先挑選k個元素,放入蓄水池中;然後從第k+1個元素開始,使得其被挑選的概率為k/m(m代表當前元素的序號),這樣的話就可以保證每個樣本被挑選的概率為k/n了。具體實現如下:
int randint(int i, int k)
int res = i + rand() % (k + 1 - i);
return res;
}bool judge0(vector& v, int& res)
return res;
}//蓄水池取樣問題
//1、用於解決已知長度的輸入v
bool judge1(vector& v,vector& res, int n, int m)
for (int i = m; i < n; i++)
return true;
}//2、用於解決未知給定長度的輸入v
bool judge2(vector& v, vector& res, int m)
for (int i = m; iter != v.end(); i++,iter++)
return true;
}
參考: 蓄水池抽樣問題
題目 微軟電面問到的問題,前面提了一大堆背景,最後歸結為乙個問題,如何在連續的網路流量中,等概率隨機抽取1個資料報。分析 參加電面時,還沒看過蓄水池抽樣問題,後來回來一搜,這就是典型的蓄水池抽樣問題,不過當時自己也想到了一種解法,使用乙個變數儲存資料報,從1到i個資料報,每次遇到第i個資料報,以1 ...
蓄水池抽樣問題
為分析使用者行為,系統常需儲存使用者的一些query,但因query非常多,故系統不能全存,設系統每天只存m個query,現設計乙個演算法,對使用者請求的query進行隨機選擇m個,請給乙個方案,使得每個query被抽中的概率相等,並分析之,注意 不到最後一刻,並不知使用者的總請求量。蓄水池抽樣問題...
蓄水池抽樣問題
部分內容 這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量n是無法在抽樣開始時確定的 但又要保持隨機性,於是有了這個問題。所以搜尋 有時候會問這樣的問題。此型別的演算法題有 谷歌面試題 給定乙個資料流,其中包含無窮盡的搜尋關鍵字 比如,人們在谷歌...