從1億個ip中找出訪問次數最多的IP

2021-07-25 20:39:14 字數 1574 閱讀 1688

問題一:

怎麼在海量資料中找出重複次數最多的乙個

演算法思想:

方案1:先做hash,然後求模對映為小檔案,求出每個小檔案中重複次數最多的乙個,並記錄重複次數。

然後找出上一步求出的資料中重複次數最多的乙個就是所求(如下)。

問題二:

**日誌中記錄了使用者的ip,找出訪問次數最多的ip。

演算法思想:

ip位址最多有2^32=4g種取值可能,所以不能完全載入到記憶體中。 

可以考慮分而治之的策略;

map 

按照ip位址的hash(ip)%1024值,將海量日誌儲存到1024個小檔案中,每個小檔案最多包含4m個ip位址。 

reduce

對於每個小檔案,可以構建乙個ip作為key,出現次數作為value的hash_map,並記錄當前出現次數最多的1個ip位址。

有了1024個小檔案中的出現次數最多的ip,我們就可以輕鬆得到總體上出現次數最多的ip。

ip位址最多有2^32=4g種取值可能,所以不能完全載入到記憶體中。 

可以考慮分而治之的策略,按照ip位址的hash(ip)%1024值,將海量日誌儲存到1024個小檔案中。每個小檔案最多包含4m個ip位址。 

對於每個小檔案,可以構建乙個ip作為key,出現次數作為value的hash_map,並記錄當前出現次數最多的1個ip位址。 

有了1024個小檔案中的出現次數最多的ip,我們就可以輕鬆得到總體上出現次數最多的ip。

同樣的問題:

假設有1kw個身份證號,以及他們對應的資料。身份證號可能重複,要求找出出現次數最多的身份證號。

補充問題:

如果是要找出前k個最大的呢?

類似問題:

有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。

演算法思想:

第一步、順序讀檔案中,對於每個詞x,取

(第一步結束後,相同內容的詞在同乙個檔案中,且檔案比較小)

對每個小檔案,統計每個檔案中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100詞及相應的頻率存入檔案,這樣又得到了5000個檔案。下一步就是把這5000個檔案進行歸併(類似與歸併排序)的過程了。

類似問題:

有10個檔案,每個檔案1g,每個檔案的每一行存放的都是使用者的query,每個檔案的query都可能重複。要求你按照query的頻度排序。

演算法思想:

順序讀取10個檔案,按照hash(query)%10的結果將query寫入到另外10個檔案(記為

找一台內存在2g左右的機器,依次對

對(b0,b1,b2..,b9)這10個檔案進行歸併排序(內排序與外排序相結合)。

從apache日誌中找出訪問IP

apache日誌分析可以獲得很多有用的資訊,現在來試試最基本的,獲取最多訪問的前10個ip位址及訪問次數。cat access.log awk sort uniq c sort rn wc l 統計訪問ip的總數 cat access.log awk sort uniq c sort rn 統計訪問...

從一億個ip找出出現次數最多的IP 分治法

1,hash雜湊 2,找到每個塊出現次數最多的 預設出現均勻 可以用字典樹 3,在每個塊出現最多的資料中挑選出最大的為結果 問題一 怎麼在海量資料中找出重複次數最多的乙個 演算法思想 方案1 先做hash,然後求模對映為小檔案,求出每個小檔案中重複次數最多的乙個,並記錄重複次數。然後找出上一步求出的...

在1000個數中找出出現次數最多的數

package com.fonxian.findmax 問題 在乙個由自然數1 1000中某些數字所組成的陣列中,每個數字可能出現零次或者多次。設計乙個演算法,找出出現次數最多的數字。public class findmax 找到出現次數最多的數 for int t 0 t 1000 t retur...