大量輸入流中,隨機求m個記錄
百度面試題:有一個很大很大的輸入流,大到沒有儲存器可以將其儲存下來,而且只輸入一次,如何從 這個輸入 流中隨機取得 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從oracle表中隨機取記錄,產生隨機數和隨機字串Oracle隨機字串
- 使用jMeter構造大量併發的隨機HTTP請求JMeter隨機HTTP
- sql隨機抽取記錄SQL隨機
- 隨機取表記錄隨機
- 洗牌演算法擴充(從n個數中隨機m個數)演算法隨機
- mysql 隨機查詢記錄MySql隨機
- JavaIO流(一)-位元組輸入流與字元輸入流JavaAI字元
- outputStream(輸出流)轉inputstream(輸入流)以及輸入流如何複用
- Oracle隨機抽取記錄的方法Oracle隨機
- 隨機更新:補題記錄x隨機
- 隨機跳題記錄簿 - 1隨機
- 從標準輸入流中讀取資料
- php獲取輸入流PHP
- 開發:隨筆記錄之 生成6位隨機數筆記隨機
- 生成k個不同的隨機數,從m到n,並輸出最大值的程式程式碼隨機
- SQL Server中快速生成大量記錄的SQL指令碼SQLServer指令碼
- 360T7M的韌體刷機全程記錄
- 整理記錄一些好用的隨機圖API隨機API
- 使用Oracle分析函式隨機抽取N條記錄Oracle函式隨機
- 集合中隨機取出幾個資料隨機
- python如何隨機選擇幾個字串並輸出Python隨機字串
- PostgreSQL隨機記錄返回-300倍提速實踐(隨機陣列下標代替orderbyrandom())SQL隨機陣列random
- 如何使用狀態隨機數和 PKCE 保護 Cognito 登入流程隨機
- 記錄---實現一個支援@的輸入框
- [Q]隨機抽取前N條記錄的問題zt隨機
- 有感而發,隨筆記錄筆記
- 123 C++試寫一演算法,求隨機輸入的三個整數的最大值C++演算法隨機
- js生成m-n之間的隨機數JS隨機
- 20240505記錄《程式碼隨想錄》筆記筆記
- Angular 記錄 - Rxjs 完整處理一個 Http 請求AngularJSHTTP
- MySQL如何選擇隨機記錄?有好幾種方式呢!MySql隨機
- java SequenceInputStream類(序列輸入流)的用法示例Java
- 將輸入流InputStream轉換為String
- 分組求TOP N記錄
- 【面經】面試官:如何以最高的效率從MySQL中隨機查詢一條記錄?面試MySql隨機
- 從標準輸入流中讀取並執行shell指定函式函式
- Oracle中Hint隨記Oracle
- 記錄我開發工作中遇到HTTP跨域和OPTION請求的一個坑HTTP跨域