蓄水池演算法

2021-07-10 09:16:38 字數 721 閱讀 3813

參考文章:

問題定義

給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的(出現概率均等)。

求解蓄水池抽樣演算法:

該演算法是針對從乙個序列中隨機抽取不重複的k個數,保證每個數被抽取到的概率為k/n這個問題而構建的。做法是: -

首先構建乙個可放k個元素的蓄水池,將序列的前k個元素放入蓄水池中。

然後從第k+1個元素開始,以k/n的概率來決定該元素是否被替換到池子中。 當遍歷完所有元素之後,就可以得到隨機挑選出的k個元素。複雜度為o(n).

其偽**如下:

init : a reservoir with the size: k

for i= k+1 to n

m=random(1, i);

if( m < k)

swap the mth value and ith value

end for

證明每個數被取到的概率為k/n:

對於第i個數

1 * k/k+1 * k+1/k+2 …n-1/n = k/n

對於第j個數(j>=k)被選中的概率為: 在他出現時被選中的概率 * 在他出現以後不被換走的概率,即:

k/j * j /j+1 。。。n-1/n = k/n

綜上得證。

蓄水池演算法

適用情況 從n個數中等概率隨機取出k個數,n很大,k也很大 n不固定增量型 內容 當i屬於1 k i入池 當i k i以概率k i決定是否進入池,1 k概率剔除池中乙個數 證明 1 當i 當k個數時,i留下概率 1 當k 1個數時,i被淘汰的概率 1 k k k 1 1 k 1 i留下概率 1 1 ...

蓄水池演算法

在乙個未知的池子裡選1個數字,讓他們被選擇概率一致。假設n的時候,前n個數字被選擇的概率都是1n 當為n 1時候,當前n 1這個數,我們選擇的概率是1n 1,其餘數字的概率是nn 1,那麼一共有n個數字的概率是1n 所以 n 1n 1 n 1 1n 1 具體演算法 使用的方式是i random.ra...

蓄水池演算法

題目 有乙個機器按自然數序列的方式吐出球 1號球,2號球,3好球。你有乙個袋子,袋子最多只能裝下k個球,並且除袋子以外,你沒有更多的空間。設計一種選擇方式,使得當機器吐出第n號球的時候 n k 你袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個,被選進袋子的概率都是k n。舉乙個更具體的例...