題目:如何從無窮盡流中等概率的抽樣出乙個單詞?
或許我們換一種說法會更加容易理解.等概率的抽取出乙個單詞,也即隨機的抽取乙個單詞。本體的難點在於沒有給定單詞數,而是乙個無盡的流。
這個問題可以用蓄水池抽樣的方法來思考。先簡單的介紹一下蓄水池抽樣(reservoid sample)演算法,我們可以結合演算法理解其原理。
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
該演算法設定蓄水池的大小為k,也就是等概率的取出k個單詞。
即先把前k個數放入蓄水池,對第k+1,我們以k/(k+1)概率決定是否要把它換入蓄水池,換入時隨機的選取乙個作為替換項,這樣一直做下去,對於任意的樣本空間n,對每個數的選取概率都為k/n。也就是說對每個數選取概率相等。
證明如下:
蓄水池問題是一類問題,可以解決無窮盡流進行等概率抽取的問題。在工作中會有比較重要的應用。
蓄水池問題
蓄水池問題描述 假設有n個數,從中隨機抽取k個數字,如果保證抽取的過程是等概率的?其中n是不固定的 類似問題 1.從100個數字抽取20個,如果向100個數字中再增加20個呢?2.給你乙個長度為n的鍊錶,n很大,但你不知道n有多大,你的任務是從這n個元素中取出k個元素,你只能遍歷一次這個鍊錶,演算法...
蓄水池 抽樣
蓄水池抽樣問題描述的是,在乙個無窮盡的樣本中,要求隨即抽取一些樣本,這些樣本被抽取到的概率必須保持一致。乙個蓄水池就可以理解為無窮大的樣本空間。解決方案就是蓄水庫抽樣 reservoid sampling 主要思想就是保持乙個集合,作為蓄水池,依次遍歷所有資料的時候以一定概率替換這個蓄水池中的數字。...
蓄水池演算法
參考文章 問題定義 給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 求解蓄水池抽樣演算法 該演算法是針對從乙個序列中隨機抽取不重複的k個數,保證每個數被抽取...