給定乙個資料流,資料流長度n很大,且n直到處理完所有資料之前都不可知,請問如何在只遍歷一遍資料(o(n))的情況下,能夠隨機選取出m個不重複的資料。**
這個場景強調了3件事:
資料流長度n很大且不可知,所以不能一次性存入記憶體。
時間複雜度為o(n)。
隨機選取m個數,每個數被選中的概率為m/n。
蓄水池抽樣演算法框架
//n個樣本中抽出m個樣本,保證被抽到的概率一樣
//蓄水池
int reservoir = new int[m];
//初始化蓄水池
for (int i = 0; i < reservoir.length; i++)
for (int i = m; i < datastream.length; i++)
}
蓄水池 抽樣
蓄水池抽樣問題描述的是,在乙個無窮盡的樣本中,要求隨即抽取一些樣本,這些樣本被抽取到的概率必須保持一致。乙個蓄水池就可以理解為無窮大的樣本空間。解決方案就是蓄水庫抽樣 reservoid sampling 主要思想就是保持乙個集合,作為蓄水池,依次遍歷所有資料的時候以一定概率替換這個蓄水池中的數字。...
蓄水池抽樣
題目 要求從n個元素中隨機的抽取k個元素,其中n無法確定 解法 首先選擇n中的前k個數加入 蓄水池 中,然後從第k 1個數開始,以k k i i 1,2,3.的概率選擇這個數,然後在蓄水池中隨機選擇乙個數,並將其替換,n個元素遍歷完畢後,蓄水池中的k個數就是隨機選擇的。證明 這裡即需要證明每個數出現...
蓄水池抽樣
給定乙個長度很長的資料流,在處理完成之前不知道其具體長度,如何在遍歷一遍資料流的情況下,隨機地抽出m個不重複的資料。key words 長度很長,遍歷完之前不可知 o n 複雜度 等概率地抽出m個數,每個數被抽中的概率為m n。如果接收的資料量小於m,直接放入蓄水池reservoir如果接收的數量大...