編程珠璣 抽樣問題(蓄水池抽樣)

前天晚上臥談時大家聊起來這個問題,討論無果後上網搜尋證明過程,發現並沒有什麼有理有據讓人信服的解釋。昨天經過思考後又經過討論,終於找到一個還算看的過去的證明。

問題

如何從0…n-1中隨機選擇m個整數,並且按照隨機順序輸出最後的結果?如果列表中允許出現重複的整數,如何才能生成一個有序列表?如果既允許重複又需要按照隨機順序輸出結果,那該怎樣?

書上的答案

我們總是選擇第一行,並使用二分之一的概率選擇第二行,使用三分之一的概率選擇第三行,以此類推。在該過程結束的時候,每一行具有相同的選中概率(1/n,其中n是文件中的總行數):

    i=0
    while more input lines
        with probability 1.0/++i
            choice = this input line
    print choice

證明

按照僞代碼,我們使用一個變量choice來存儲選中的內容。
在讀入第k行時,用這行的概率1k+1 來判斷這行是否被選中(因爲k從0開始計數)。如果選中的話則用此行內容來填充choice。
【1】當n=1時,選中1的概率爲1,此時choice中的內容爲第一行的內容。
【2】當n=2時,選中2的概率爲12 ,此時用2填充choice的概率即爲12 ,所以此時choice中的內容爲1的概率爲112 ,即此時choice中爲1和爲2的概率皆爲12
【3】當n=3時,選中3的概率爲13 ,此時用3填充choice的概率爲13 ,所以此時chioce中的內容爲3的概率爲13 ,不爲3的概率爲113 ,當不爲3的時候,此時情況退化爲n=2的情形,即從3前面的內容中任選一個。而前面的內容出現概率相等。因1和2的內容出現的概率皆爲12 ,故在此情況下1和2內容出現的概率爲12113 ,即13
……
【4】假設n=k時結論成立
【5】當n=k+1時,選中k的概率爲1k+1 ,此時用k填充choice的概率爲1k+1 ,所以此時chioce中的內容爲k+1的概率爲1k+1 ,不爲k的概率爲11k+1 ,當不爲k+1的時候,此時情況退化爲n=k的情形,即從k+1前面的內容中任選一個。而前面的內容出現概率相等。因前面的內容出現的概率皆爲1k ,故在此情況下前面內容出現的概率爲1k11k+1 ,即1k+1

在最後一步似乎還有部分不是很清楚的地方,歡迎指正

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