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

2021-08-20 03:53:30 字數 1527 閱讀 9091

/*

1,hash雜湊

2,找到每個塊出現次數最多的(預設出現均勻)—–>可以用字典樹

3,在每個塊出現最多的資料中挑選出最大的為結果

*/問題一:

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

演算法思想:

方案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。

同樣的問題:

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

補充問題:

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

類似問題:

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

第一步、順序讀檔案中,對於每個詞x,取,然後按照該值存到5000個小檔案(記為)中。這樣每個檔案大概是200k左右。如果其中的有的檔案超過了1m大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1m。

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

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

類似問題:

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

順序讀取10個檔案,按照hash(query)%10的結果將query寫入到另外10個檔案(記為)中。這樣新生成的檔案每個的大小大約也1g(假設hash函式是隨機的)。

找一台內存在2g左右的機器,依次對用hash_map(query, query_count)來統計每個query出現的次數。利用快速/堆/歸併排序按照出現次數進行排序。將排序好的query和對應的query_cout輸出到檔案中。這樣得到了10個排好序的檔案(b0,b1,b2,…,b9)。

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

找出出現次數最多的字母

找出出現次數最多的字母 description 找出出現次數最多的字母input現在給你一行密文,全部由小寫字母組成 不超過100個 你要找出出現次數最多的那個字母 output 每組輸出1行,輸出出現次數最多的那個字母 sample input aaaaaaabbc nnnnnnnasnnnnas...

找出出現次數最多的幾個數值

這道題目所說的出現最多的幾個數值,其實是帶有附加條件的 這幾個數值中出現次數最少的那個數,要比除這幾個值外的其他數的總個數要多。說的自己都有點暈 這樣才能在最後結果中,呈現這幾個數。所以必須按照資料來源中的統計量分析出求前幾位的數值。其 如下 include include using namesp...

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

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