蓄水池抽樣演算法

2021-10-25 17:09:59 字數 1616 閱讀 9190

給定乙個相當多的資料,但是記憶體數量有限,每次只能讀取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個數就是隨機選擇的。證明 這裡即需要證明每個數出現...