問題描述:
有乙個1gb大小的檔案,檔案裡面每一行是乙個詞,每個詞的大小不超過16b,記憶體大小限制為1mb,要求返回頻數最高的100個詞。
分析:
由於檔案大小為1gb,而記憶體的大小只有1mb,因此不能一次把所有的詞讀入到記憶體中去處理,可以採用分治的方法進行處理:把乙個檔案分解為多個小的子檔案,從而保證每個檔案的大小都小於1mb,進而可以直接被讀取到記憶體中處理。
解題思路:
1、遍歷檔案,對遍歷到的每乙個詞,執行hash操作:hash(x)%2000,將結果為i的詞存放到檔案ai中,通過這個分解步驟,可以是每個子檔案的大小約為400kb左右,如果這個操作後的檔案大小超過1mb,那麼可以使用同樣的方法把檔案繼續進行分解下去,直到檔案的大小小於1mb為止。
2、統計出每個檔案中出現頻率最高的100個詞。最簡單的就是使用字典來實現,具體方法為:遍歷檔案中的所有詞,對於遍歷到的詞,如果字典中不存在,則把這個詞存入到字典中(鍵為這個詞,值為1),如果這個詞已經在字典中,那麼把這個詞對應的值加一。遍歷後可以非常容易的找到出現頻率最高的100個詞。
3、上一步找出了每個檔案中出現頻率最高的100個詞,這步可以通過維護乙個小頂堆來找出所有詞中出現頻率最高的100個詞。遍歷第乙個檔案,把第乙個檔案中的出現頻率最高的100個詞構成乙個小頂堆。(如果第乙個檔案中詞的數目小於100,那麼可以繼續遍歷第二個檔案,直到構建好有100個節點的小頂堆為止)。繼續遍歷,如果遍歷到的詞的出現次數大於堆頂上詞的出現次數,那麼可以用新遍歷到的詞替換堆頂的詞,然後重新調整這個堆為小頂堆。當遍歷完所有的檔案後,這個小頂堆中的詞就是出現頻率最高的100個詞。當然這一步也可以採用類似歸併排序的方法把所有檔案中出現次數最高的100個詞進行排序,最終找出出現次數最高的100個詞。
引申:怎麼找出海量資料中出現次數最高的乙個
前面的演算法是求解top100,而這個只是求解top1,可以使用同樣的思路進行求解。唯一不同的是,在求解出每個檔案中出現次數最高的資料後,接下來從哥哥檔案值出現次數最高的資料找出出現次數最高的數,而不需要使用小頂堆,只需要使用乙個變數就行了。
大資料面試題 如何從大量資料中找出高頻詞
有乙個1gb大小的檔案,檔案裡面每一行是乙個詞,每個詞的大小不超過16b,記憶體大小限制為1mb,要求返回頻數最高的100個詞。由於檔案大小為1gb,而記憶體的大小只有1mb,因此不能一次把所有的詞讀入到記憶體中去處理,可以採用分治的方法進行處理 把乙個檔案分解為多個小的子檔案,從而保證每個檔案的大...
面試題之大量資料如何排序
例 現有一千萬手機號碼,說說你有什麼方法可以進行快速排序?對於這種題目,利用常規的排序方法 如插入排序,快速排序 自然是不能解決問題的!因此資料量太大。注意內部排序和外部排序的區別。排序演算法分為內部排序和外部排序 1 內部排序 指的是待排序記錄存放在計算機隨機儲存器 記憶體 中進行的排序過程 我們...
大資料面試題
海量資料面試題整理 1.給定a b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4g,讓你找出a b檔案共同的url?方案1 可以估計每個檔案安的大小為50g 64 320g,遠遠大於記憶體限制的4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。s 求每對小...