日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【大数据算法】蓄水池抽样算法

發布時間:2025/3/13 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【大数据算法】蓄水池抽样算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、題目來源:

? ??這個題目的由來是周圍有人討論到去面試(某8)的時候遇到了這個問題。另外正好HIT有個視頻也有這個內容,故記錄一下:

二、題目描述 ? ??該人面試的時候問的是:
  • 如何從二進制文件中等概率取整數?
  • ? ??這個題目說的有點不清楚實際上是:一個二進制文件中有好多好多整數,你要隨機取出一個。 三、題目分析 ? ??這個問題的難點就在于你開始不知道有多少的整數,也就是說這個(1/n)你不知道n是多少。? ?? ? ??這里我們要用到蓄水池抽樣算法,這個算法的思想很簡單,我們待會再看,先看上面的題目。 四、題目解法 ? ??1)解法如下: 首先我們取到第一個數(暫時取的最后要不要還不一定呢),然后對第二個數以1/2的概率來確定是否? ??? ??? ??? ??? ??用第二個數來替換他,然后對第二個數以1/3的概率來確定是否用第三個數來替換他。。。。一直這樣下去直到第n個數。 經過上面的這個過程我們發現每個數取到的概率都變成了(1/n)。證明如下:
    總結起來就是一句話每個數取到的概率等于取到該數且取不到該數后面所有數的概率 如:取到第10個數的概率等于取到第十個數且取不到第11到第n個數的概率 現在我們回到較復雜的情況,也就是如何在一個N個數(開始不知道N是幾)中隨機取M個數。其實思想是一樣的,就是先取出前M個,然后對后面的開始每個以(k/(i))的概率進行替換,這樣我們得到的就是所要的結果,證明如下:
    五、題目實現 OK!下面是python的代碼實現 ?
  • 1 import random 2 import copy 3 4 def reservoirSampling(seq, k): 5 localSeq = copy.deepcopy(seq) 6 N = len(localSeq) 7 for i in xrange(k, N): 8 M = int(random.uniform(0, i)) 9 if M < k : 10 temp = copy.deepcopy(localSeq[M]) 11 localSeq[M] = copy.deepcopy(localSeq[i]) 12 localSeq[i] = temp 13 return localSeq[0:k] 14 def main(): 15 a = [4,5,6,3,4,7,7,4,3,3,2,4,5,5,6,9,5,4,3,45,3,23,44,55,33,5,8] 16 k = 5 17 print reservoirSampling(a, k) 18 if __name__ == '__main__': 19 main()
  • 六、總結歸納 怎么說呢,實在是太佩服這個想法了,好好學習領悟吧。 來自為知筆記(Wiz)



    轉載于:https://www.cnblogs.com/MrLJC/p/4113276.html

    總結

    以上是生活随笔為你收集整理的【大数据算法】蓄水池抽样算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。