水庫抽樣演算法

2021-09-02 23:44:15 字數 593 閱讀 3901

輸入:一組資料,大小未知

輸出:這組資料的k個均勻抽取

要求:僅掃瞄一次

總體要求:從n個元素中隨機的抽取k個元素,其中n無法確定,保證每個元素抽到的概率相同

一些符號:k為要抽樣的個數,n為總體個數字置,n為當前遍歷的元素的位置。pool為k大小的陣列,用來儲存抽到的樣本

n<=k,把當前值放入pool中,構成初步樣本

n>k,生成乙個隨機數p,如果p=k/n,繼續保留前面的數。直到資料流結束,返回此k個數。但是為了保證計算機計算分數額準確性,一般是生成乙個0到n的隨機數,跟k相比,道理是一樣的。

特殊情況:當k=1時,從n(n>=2)開始以1/n的概率決定是否保留替換原來pool中元素

證明—歸納法

假設:當第n個元素以k/n,前n-1個元素也被選中的概率也為k/n

證明:

1)當n<=k時,出現在pool中的每個元素概率都是相同的,都為1 

2)當n=k+1時,計算前k個元素在pool的概率

3)當n>k+1時,計算前n-1個元素在pool的概率
因為假設成立,所以到資料結束時,所有元素的抽到的概率都為k/n

水庫抽樣演算法精簡總結

輸入 一組資料,大小未知 輸出 這組資料的k個均勻抽取 要求 僅掃瞄一次 總體要求 從n個元素中隨機的抽取k個元素,其中n無法確定,保證每個元素抽到的概率相同 一些符號 k為要抽樣的個數,n為總體個數字置,n為當前遍歷的元素的位置。pool為k大小的陣列,用來儲存抽到的樣本 n k,把當前值放入po...

水庫取樣演算法

水庫取樣 用較小的開銷來估計乙個較大的資料流 1 include2 include3 include4 intmain 524 while feof fp 2535 else 水庫被填充滿時 3643 index 44 4546 47 printf n n 48 printf 一共有 d個資料 n ...

水塘抽樣演算法

作用 水塘抽樣演算法是一種抽樣演算法,對於乙個很大的集合,抽取的樣本值能夠保證隨機.特點 其複雜度並不很高o n 並且能夠很大程度地節省記憶體.很多大公司的面試題都考察過這個演算法,以谷歌為例,有一道關於水塘抽樣的例題 我有乙個長度為n的鍊錶,n的值非常大,我不清楚n的確切值.我怎樣能寫乙個盡可能高...