題目:給你乙個長度為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
MySQL趣味題 Hankson的趣味題
思路 由於x是b1的約數,所以x的質因子一定也是b1的質因子,我們可以對b1的每個質因子p,分別計算a0,a1,b0,b1分別 包含多少個p.然後討論x可能含有幾個p即可 include include include include include include using namespace ...
python趣味題 python 趣味百題3
等差素數數列 類似7 37 67 97 107 137 167 197這樣由素數組成的數列。素數數列具有項數的限制,一般指素數數列的項數有多少個連續項,最多可以存在多少個連續項 程式設計找出100以內的等差素數數列 思路 1.篩法找出100以內所有素數 2.對於素數list內兩兩組合,構造等差數列a...
趣味題系列(2) 警察抓逃犯問題
題目 a國由1000000個島組成,島與島之間只能用船作為交通工具,有些島之間有船來往,從任意乙個島都可以去到另外任乙個島,當然其中可能要換船。現在有乙個警 察要追捕乙個逃犯,開始時他們在不同的島上,警察和逃犯都是每天最多乘一次船,但這個逃犯還有點迷信,每個月的13日不乘船,警察則不迷信。警察每天乘...