面試題[數學與概率]: 從數據流中隨機選取樣本

題目:輸入一段int型數據流,輸入未完成之前並不知道數據流的長度,要求在O(1)空間複雜度的前提下隨機選出一個元素,並保證每一個元素被選中的概率是一樣的。

我的解法如下:

假如輸入的數據流依次是10、20、30、40、……

收到10時:以概率1選擇10;
收到20時:以概率1/2選擇10,以概率1/2選擇20;
收到30時:以概率2/3選擇上一次選到的元素,以概率1/3選擇30;
收到40時:以概率3/4選擇上一次選到的元素,以概率1/4選擇40;
……
收到第N個數時:以概率(n-1)/n選擇上一次選到的元素,以概率1/n選擇當前元素。

進階題:那麼如何等概率選取k個數呢?

解法類似,先以概率1選取前k個數,然後:
對於第k+1個數,以k/(k+1)的概率選擇它,如果被選中,則隨機替換原來的k個數中的一個;
對於第k+2個數,以k/(k+2)的概率選擇它,如果被選中,則隨機替換原來的k個數中的一個;
……
對於第N個數,以k/N的概率選擇它,如果被選中,則隨機替換原來的k個數中的一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章