為分析使用者行為,系統常需儲存使用者的一些query,但因query非常多,故系統不能全存,設系統每天只存m個query,現設計乙個演算法,對使用者請求的query進行隨機選擇m個,請給乙個方案,使得每個query被抽中的概率相等,並分析之,注意:不到最後一刻,並不知使用者的總請求量。
蓄水池抽樣問題
隨機抽樣問題表示如下:
要求從n個元素中隨機的抽取k個元素,其中n無法確定。
這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量n是無法在抽樣開始時確定的;但又要保持隨機性,於是有了這個問題。所以搜尋**有時候會問這樣的問題。
【解決】
解決方案就是蓄水庫抽樣(reservoid sampling)。主要思想就是保持乙個集合(這個集合中的每個數字出現),作為蓄水池,依次遍歷所有資料的時候以一定概率替換這個蓄水池中的數字。
//偽碼
init: a reservoir with the size:k
for i= k+1 to n{
m = random(1, i);if (m解釋一下:程式的開始就是把前k個元素都放到水庫中,然後對之後的第i個元素,以k/i的概率替換掉這個水庫中的某乙個元素。
【證明】
(1)初始情況。出現在水庫中的k個元素的出現概率都是一致的,都是1。這個很顯然。
(2)第一步。第一步就是指,處理第k+1個元素的情況。分兩種情況:元素全部都沒有被替換;其中某個元素與第k+1個元素交換。
我們先看情況2:第k+1個元素被選中的概率是k/(k+1)(根據公式k/i),所以這個新元素在水庫中出現的概率就一定是k/(k+1)(不管它替換掉哪個元素,反正肯定它是以這個概率出現在水庫中)。下面來看水庫中剩餘的元素出現的概率,也就是1-p(這個元素被替換掉的概率)。水庫中任意乙個元素被替換掉的概率是:(k/k+1)*(1/k)=1/(k+1),意即首先要第k+1個元素被選中,然後自己在集合的k個元素中被選中。那它出現的概率就是1-1/(k+1)=k/(k+1)。可以看出來,舊元素和新元素出現的概率是相等的。
情況1:當元素全部都沒有替換掉的時候,每個元素的出現概率肯定是一樣的,這很顯然。但具體是多少呢?就是1-p(第k+1個元素被選中)=1-k/(k+1)=1/(k+1)。
(3)歸納法:重複上面的過程,只要證明第i步到第i+1步,所有元素出現的概率是相等的即可。
蓄水池抽樣問題
題目 微軟電面問到的問題,前面提了一大堆背景,最後歸結為乙個問題,如何在連續的網路流量中,等概率隨機抽取1個資料報。分析 參加電面時,還沒看過蓄水池抽樣問題,後來回來一搜,這就是典型的蓄水池抽樣問題,不過當時自己也想到了一種解法,使用乙個變數儲存資料報,從1到i個資料報,每次遇到第i個資料報,以1 ...
蓄水池抽樣問題
一般有兩種問題,一種是從乙個未知的序列中隨機選擇乙個,因此其概率為1 m,m代表當前元素 當從乙個未知的序列中挑選k個元素或者從乙個已知序列長度為n n非常大 中挑選k個元素,使每個元素被挑選的概率均等,稱之為蓄水池取樣問題。具體思路是 首先挑選k個元素,放入蓄水池中 然後從第k 1個元素開始,使得...
蓄水池抽樣問題
部分內容 這種應用的場景一般是資料流的情況下,由於資料只能被讀取一次,而且資料量很大,並不能全部儲存,因此資料量n是無法在抽樣開始時確定的 但又要保持隨機性,於是有了這個問題。所以搜尋 有時候會問這樣的問題。此型別的演算法題有 谷歌面試題 給定乙個資料流,其中包含無窮盡的搜尋關鍵字 比如,人們在谷歌...