為分析使用者行為,系統常需儲存使用者的一些query,但因query非常多,故系統不能全存,設系統每天只存m個query,現設計乙個演算法,對使用者請求的query進行隨機選擇m個,請給乙個方案,使得每個query被抽中的概率相等,並分析之,注意:不到最後一刻,並不知使用者的總請求量。
做法:1、如果query總數小於等於m,直接存起來。
2、如果query數目開始大於m,例如為m+i個,那麼從m+1,……m+i,每個新來的query元素m+k(k=1……i),用m/(m+k)的概率去取,即可用m+k的隨機數來判別。
3、如果隨機數判定該query元素被取中,那麼對已存好的m個元素,每個元素均用1/m的概率去判定是否被m+k替換,例如原先m=5,,當前m+k為6,對1,2,3,4,5每個都有1/5的概率被替換成6即m+k。
4、如果m+k沒被選中,則考察m+k+1個元素,繼續判別m+k+1是否被取中,取中則執行3,否則繼續判別下乙個元素。直到m+1……m+k個元素全部被考察替換完畢。
關鍵點,每個query抽中概率相等,言下之意是指每次多來乙個query的時候,這個新來的query和已經有的query被抽取放入儲存區的概率都應該要相等。前m個,每個取的概率均為1,這相等。從m+1開始,取的概率為m/(m+1),那麼前面m個query被取放入儲存區的概率=1-被第m+1個query替換的概率=1-m/(m+1)*(1/m)(即m+1被取中且剛好用1/m的概率替換掉儲存區中的某元素)=m/(m+1)符合條件。
假設m+p成立,即m+p被取的概率為m/(m+p),則m+p+1的被取概率p1為m/(m+p+1),儲存區中的元素被取的概率p2=被取中且沒有被m+p+1替換=(首先在m+p的時候要被取)*((m+p+1)沒取中+(m+p+1)取中但是沒替換掉自己)=m/(m+p)((1-m/(m+p+1))+m/(m+p+1)(1-1/m))=m/(m+p+1)
p1==p2,所以每個query的抽取放入儲存區中的概率一樣。
參考了這篇博文的解釋。
主要是寫下了具體的操作思路,以作備忘,如有錯漏,請不吝指教
乙個百度的面試題目
題目 乙個陣列中有2個數只出現了一次,其他的數都出現了兩次,寫乙個演算法找出這兩個只出現一次的數 分析 該題目可以通過異或完成,先讓我舉乙個例子 4 0100 5 0101 1 0001 5 0101 4 0100 上面的例子說明4 5 5 4 同理4 5 4 5 int find first 1 ...
乙個百度的面試題目
題目 乙個陣列中有2個數只出現了一次,其他的數都出現了兩次,寫乙個演算法找出這兩個只出現一次的數 分析 該題目可以通過異或完成,先讓我舉乙個例子 4 0100 5 0101 1 0001 5 0101 4 0100 上面的例子說明4 5 5 4 同理4 5 4 5 int find first 1 ...
百度面試題
有一根27厘公尺的細木桿,在第3厘公尺 7厘公尺 11厘公尺 17厘公尺 23厘公尺這五個位置上各有乙隻螞蟻。木桿很細,不能同時通過乙隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距...