大量輸入流中,隨機求m個記錄

dongyu2013發表於2014-05-15

百度面試題:有一個很大很大的輸入流,大到沒有儲存器可以將其儲存下來,而且只輸入一次,如何從 這個輸入 流中隨機取得 m 個記錄。

在解決這個問題之前, 我們先看一下堆的定義(這裡指的是資料結構中的堆)


n個元素的序列{k1,k2,k3,k4,...kn}當且僅當滿足下關係時,稱之為堆

k(i)<=k(2i) 且 k(i)<=k(2i+1)   或者是 k(i)>=k(2i)且 k(i)>=k(2i+1)     (i=1,2,3,。。。,n/2).



好了言歸正傳,現在這裡是一個很大的流按常理來說裡面的記錄數量應該大於m個,但是在這裡為了考慮全面先假設 流裡面的記錄數小於m個,那麼只需要將流裡面的記錄全部獲取即可,當流裡面的記錄數量大於m個記錄的時候,我們這樣處理, 將每一個我們取出的記錄通過一個隨機演算法得到一個隨機數(當然隨機數的範圍大小的選取,與流中的記錄數有關,如果記錄很多的話那麼範圍就選大一點),首先用前m個記錄的隨機數建立一個大頂堆(小頂堆)也可以,然後依次讀取後面的每一個記錄然後計算得到隨機數,然後將這個隨機數加到堆裡面去然後調整堆的結構是它滿足堆的定義,這樣當流全部讀取完畢時,在記憶體中儲存的是一個大小為M的堆。堆裡面的記錄就是問題所求,(這個問題妙的一點就是,任何一個記錄的隨機數都有被加入大頂堆的機會,所以這m個記錄就是隨機的)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1161591/,如需轉載,請註明出處,否則將追究法律責任。

相關文章