[code]
題目:給你乙個長度為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
[/code]
判斷單向鍊錶是否有環,環起點,環長,鍊錶長
一 判斷單向鍊錶是否有環 方法1 設定乙個hashset,順序讀取鍊錶中的節點,判斷hashset中是否有該節點的唯一標識 id 如果在hashset中,說明有環 如果不在hashset中,將節點的id存入hashset。這種方法時間複雜度已經最優,但是因為額外申請了hashset,所以空間複雜度不...
有鍊錶實現長整數的加法
課程題目 設計乙個程式實現兩個任意長的整數求和運算。要求 利用雙向迴圈鍊錶實現長整數的儲存,每個節點含有乙個整型變數。輸入形式按照中國對於長整數的表示習慣,沒四位一組,組間用逗號隔開。思路 為了達到上面的要求,我使用鍊錶將長整數按照四位一組進行輸入 每組用乙個int表示就可以了 然後對鍊錶中的數字進...
鍊錶的操作增加 插入 刪除 查詢 計算表長
emmmmmmmmmmmmmmmmmm,鍊錶操作好煩呀,說白了,其實是指標煩。其實我還是未能很理解,指標誰指誰,只能多擼幾次 來增加理解。include include typedef int elementtype typedef struct node node 其實還是未能很好理解再建立乙個l...