輸入:一組資料,大小未知
輸出:這組資料的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的確切值.我怎樣能寫乙個盡可能高...