趣味題系列(5):

來源:互聯網
上載者:User

題目:給你一個長度為N的鏈表。N很大,但你不知道N有多大。你的任務是從這N個元素中隨機取出k個元素。你只能遍曆這個鏈表一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的(出現機率均等)。

 

解答:

題其實是編程珠璣習題12.10的推廣,原題既是k=1的情況,關鍵就是想到可以替換以前已經選擇的元素。
按照這個思路:
1. 對於前k個,全部選擇,即選擇集S裡為前k個元素
2. 第k+i(i>0)個時,令r1=rand(1,k+i),如果r1>k,則保持現有的選擇集合S不變
3. 如果r1<=k, 令r2=rand(1,k),並讓第k+i元素(即當前元素)替換集合S裡第r2個元素

歸納:
1. 如果N=k, 前k個全部選擇,被選擇機率p=1
2. 如果N=k+1, 第k+1個被選擇的機率為p=k/(k+1),前k個被選擇的機率為
p=1*(1/(k+1)+(k/(k+1))*((k-1)/k)) = k/(k+1)
3. 如果N=k+i,第k+i個被選擇的機率為p=k/(k+i)=k/N,前k+i-1(N-1)個被選擇的機率為
p=k/(k+i-1) * (i/(k+i) + (k/(k+i) * (k-1)/k) = k/(k+i-1) * (i/(k+i) +
(k-1)/(k+i)) =
k/(k+i-1) * (k+i-1)/(k+i) = k/(k+i) = k/N

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.