天天看點

尋找最大的K個數,Top K問題的堆實作

尋找最大的K個數,Top K問題的堆實作
尋找最大的K個數,Top K問題的堆實作
尋找最大的K個數,Top K問題的堆實作

1000萬個資料太大,打開檔案很慢,可能會看不到,可以測試1萬個資料中找最大的10個。

搜尋引擎熱門查詢統計

題目描述:

搜尋引擎會通過日志檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。

假設目前有一千萬個記錄,這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。

解決方法:hash表+堆,去重複後不超過300萬個,總大小不超過300萬*255b=765mb,記憶體使用不超過1g。

第一步:先對這批海量資料預處理,在o(n)的時間内用hash表完成去重複操作。

第二步:借助堆這個資料結構,找出top k,時間複雜度為nlogk。即借助堆結構,可以在log量級的時間内查找和調整/移動。是以,維護一個k(該題目中是10)大小的小根堆(kmin設為堆頂元素),然後周遊300萬的query,分别和kmin進行對比比較(若x>kmin,則更新并調整堆,否則,不更新),最終的時間複雜度是:o(n)+ n'*o(logk),(n為1000萬,n’為300萬)。

為了降低實作上的難度,假設這些記錄全部是一些英文單詞,即使用者在搜尋框裡敲入一個英文單詞,然後查詢搜尋結果,最後,要你統計輸入單詞中頻率最大的前k個單詞。複雜問題簡單化了之後,編寫代碼實作也相對輕松多了,如下:

尋找最大的K個數,Top K問題的堆實作
尋找最大的K個數,Top K問題的堆實作
尋找最大的K個數,Top K問題的堆實作

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀