蓄水池演算法

2021-09-11 11:23:58 字數 920 閱讀 8819

【題目】有乙個機器按自然數序列的方式吐出球(1號球,2號球,3好球。。。),你有乙個袋子,袋子最多只能裝下k個球,並且除袋子以外,你沒有更多的空間。設計一種選擇方式,使得當機器吐出第n號球的時候(n>k),你袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個,被選進袋子的概率都是k/n。舉乙個更具體的例子,有乙個只能裝下10個球的袋子,當吐出100個球時,袋子裡有10個球,並且1100號中的每乙個球被選中的概率都是10/100。然後繼續吐球,當吐出1000個球時,袋子裡有10個球,並且11000號中的每乙個球被選中的概率都是10/1000.繼續吐球,當吐出i個球時,袋子裡有10個球,並且1~i號中的每乙個球被選中的概率都是10/i,即吐球的同時,已經吐出的球被選中的概率也動態的變化。

蓄水池演算法:

處理1~k號球時,直接放進袋子裡。

處理第i號球時(i>k),以k/i的概率決定是否將第i號球放進袋子。如果不決定將第i號球放進袋子,直接扔掉第i號球。如果決定將第i號球放進袋子,那麼就從袋子裡的k個球中隨機扔掉乙個,然後把第i號球放入袋子。

處理第i+1號球時重複步驟1或步驟2.

public

class

xushuichi

public

static

int[

]getknum

(int k,

int max)

int[

] res =

newint

[math.

min(max, k)];

for(

int i =

0; i != res.length; i++

)for

(int i = k +

1; i < max +

1; i++)}

return res;

}}

蓄水池演算法

參考文章 問題定義 給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 求解蓄水池抽樣演算法 該演算法是針對從乙個序列中隨機抽取不重複的k個數,保證每個數被抽取...

蓄水池演算法

適用情況 從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...