一、問題由來
這個題目的由來是在《程式設計珠璣》裡遇到的,故記錄一下。
還可以這麼說,」如何從二進位制檔案中等概率取整數?」或者」在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行?」這個題目說的有點不清楚實際上是:乙個二進位制檔案中有好多好多整數,你要隨機取出乙個。
這個問題的難點就在於你開始不知道有多少的整數,也就是說這個(1/n)你不知道n是多少。
綜上,隨機抽樣問題表示如下:要求從n個元素中隨機的抽取k個元素,其中n無法確定。
這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量n是無法在抽樣開始時確定的;但又要保持隨機性,於是有了這個問題。所以搜尋**有時候會問這樣的問題。
這裡的核心問題就是「隨機」,怎麼才能是隨機的抽取元素呢?我們設想,買彩票的時候,由於所有彩票的中獎概率都是一樣的,所以我們才是「隨機的」買彩票。那麼要使抽取資料也隨機,必須使每乙個資料被抽樣出來的概率都一樣。
二、演算法實現
array r[k]; // resultinteger i, j;
for each i in 1 to k do
r[i] := s[i]
done;
for each i in k+1 to length(s) do
j := random(1, i); // important: inclusive range
if j <= k then
r[j] := s[i]
fi
done
海量資料處理之蓄水池抽樣演算法
一 問題由來 這個題目的由來是在 程式設計珠璣 裡遇到的,故記錄一下。還可以這麼說,如何從二進位制檔案中等概率取整數?或者 在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行?這個題目說的有點不清楚實際上是 乙個二進位制檔案中有好多好多整數,你要隨機取出乙個。這個問題的難點就在於你開始不知道有多...
演算法 蓄水池抽樣
例題 有乙個機器按自然數序列的方式吐出球,1號球,2號球.現有乙個袋子,袋子裡最多只能裝下k個球,並且除袋子以外沒有更多的空間,球扔掉不能放回。設計一種選擇方式,使得當機器吐出第n號球時,袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個被選中進袋子的概率都是k n。具體例子 有乙個只能裝下...
蓄水池抽樣演算法
給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 蓄水池抽樣演算法 該演算法是針對從乙個序列中隨機抽取不重複的k個數,保證每個數被抽取到的概率為k n這個問題...