輸入:一組資料,大小未知輸出:這組資料的k個均勻抽取
要求:僅掃瞄一次
總體要求:從n個元素中隨機的抽取k個元素,其中n無法確定,保證每個元素抽到的概率相同
一些符號:k為要抽樣的個數,n為總體個數字置,n為當前遍歷的元素的位置。pool為k大小的陣列,用來儲存抽到的樣本n<=k,把當前值放入pool中,構成初步樣本
n>k,生成乙個隨機數p,如果p
<
k/n,那麼把pool中的任意乙個數替換為第n個數。如果p>=k/n,繼續保留前面的數。直到資料流結束,返回此k個數。但是為了保證計算機計算分數額準確性,一般是生成乙個0到n的隨機數,跟k相比,道理是一樣的。特殊情況:當k=1時,從n(n>=2)開始以1/n的概率決定是否保留替換原來pool中元素
假設:當第n個元素以k/n,前n-1個元素也被選中的概率也為k/n1)當n<=k時,出現在pool中的每個元素概率都是相同的,都為1證明:
2)當n=k+1時,計算前k個元素在pool的概率
==a==.前k個元素在pool中的元素概率都為1
==b==.由假設得,第k+1個元素被選中的概率為:k/(k+1),pool任意元素被替換的概率為(k/(k+1))*(1/k)=1/(k+1),沒被替換(即選中)的概率為1-1/(k+1)=k/(k+1).
由a*b=1*k/(k+1)=k/(k+1),前k個元素和k+1元素被選中的概率都為k/k+1。
3)當n>k+1時,計算前n-1個元素在pool的概率
==a==.前n-1個元素在pool中被選擇的的概率為k/(n-1)
==b==.由假設得,第n個元素被選中的概率為:k/n,pool任意元素被替換的概率為(k/n)*(1/k)=1/n,沒被替換(即選中)的概率為1-1/n=(n-1/)n。
由a*b=(k/(n-1))*((n-1)/n)=k/n,前k個元素和k+1元素被選中的概率都為k/n。
因為假設成立,所以到資料結束時,所有元素的抽到的概率都為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 ...
精簡 排序演算法總結
遍歷陣列記錄最小值下標,與第一項依次交換。for int i 1 i swap num count num i 將大氣泡換到後面 for int i n i 1 i 將第j個和前乙個比較 for int i 2 i n i 選擇最後乙個數字 1.0 荷蘭國旗問題思想,分兩塊 一次處理乙個數m 2.0...