給定乙個相當多的資料,但是記憶體數量有限,每次只能讀取m
mm個資料,現在想在總樣本空間中隨機抽取m
mm個資料,保證每個資料抽取到的概率相同。
我們依次遍歷樣本空間中的資料,每次只讀取乙個資料,並設定乙個槽,儲存乙個資料。假設當前讀到了第i
ii個資料,製造概率1
i\frac
i1的概率,用這個當前讀取的資料取替換槽中的資料。
最後,當我們遍歷完樣本空間之後,這個槽中的資料就是我們想要的隨機抽取的資料。
第i
ii個資料被抽中的概率為,用第i
ii個資料替換槽中資料的概率加上第i+1
i+1i+
1到nn
n資料沒有被替換的概率。
p (i
)=1i
⋅(1−
1i+1
)⋅(1
−1i+
2)…(
1−1n
)=1n
p(i) = \frac \cdot (1- \frac) \cdot (1- \frac) \ldots (1- \frac) = \frac
p(i)=i
1⋅(
1−i+
11)
⋅(1−
i+21
)…(
1−n1
)=n
1我們把槽的容量擴充至m
mm,每次讀取乙個資料,製造概率m
i\frac
im的概率,用這個當前讀取的資料取替換槽中的資料,製造概率1
m\frac
m1確保每個槽都有相同的概率被選到。
最後,當我們遍歷完樣本空間之後,這個槽中的資料就是我們想要的隨機抽取的資料。
第i
ii個資料被抽中的概率為,用第i
ii個資料替換槽中資料的概率加上第i+1
i+1i+
1到nn
n資料沒有被替換的概率。
p (i
)=mi
⋅(1−
mi+1
+mi+
1⋅m−
1m)…
(1−m
n+mn
⋅m−1
m)=m
np(i)= \frac \cdot (1- \frac + \frac \cdot \frac) \ldots (1- \frac + \frac \cdot \frac) = \frac
p(i)=i
m⋅(
1−i+
1m+
i+1m
⋅mm
−1)
…(1−
nm+
nm⋅
mm−1
)=n
m我們處理m≥i
m \ge i
m≥i的情況,即讀取的前m
mm個資料,依次放入槽中即可。
leetcode 382
class
solution
/** returns a random node's value. */
intgetrandom()
return val;}}
;
演算法 蓄水池抽樣
例題 有乙個機器按自然數序列的方式吐出球,1號球,2號球.現有乙個袋子,袋子裡最多只能裝下k個球,並且除袋子以外沒有更多的空間,球扔掉不能放回。設計一種選擇方式,使得當機器吐出第n號球時,袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個被選中進袋子的概率都是k n。具體例子 有乙個只能裝下...
蓄水池抽樣演算法
給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 蓄水池抽樣演算法 該演算法是針對從乙個序列中隨機抽取不重複的k個數,保證每個數被抽取到的概率為k n這個問題...
蓄水池抽樣演算法
題目 要求從n個元素中隨機的抽取k個元素,其中n無法確定 解法 首先選擇n中的前k個數加入 蓄水池 中,然後從第k 1個數開始,以k k i i 1,2,3.的概率選擇這個數,然後在蓄水池中隨機選擇乙個數,並將其替換,n個元素遍歷完畢後,蓄水池中的k個數就是隨機選擇的。證明 這裡即需要證明每個數出現...