在海量資料中統計出現次數最多的n個

2021-07-03 04:09:52 字數 890 閱讀 5629

在海量資料中統計出現次數最多的n個

分兩種情況,

1 如果資料能夠在記憶體中放下,比如如果海量資料是ip位址,最多有4g個ip位址,每個ip位址佔4個位元組 需要記憶體16g,如果內存在幾十g,則完全可以全部裝入記憶體,

直接讀取大檔案,然後建立乙個hash表,統計次數,最後再用堆統計最大的n個

2  如果不能在記憶體放下,比如海量資料是字串,不同的字串個數無限,記憶體中可能存不下,那麼需要先將海量資料進行分堆,按照hash值進行分堆,分成適宜在記憶體中操作的小檔案,比如記憶體1g,字串有20g,那麼就分成20個以上的小檔案

為什麼要用hash分堆,這樣是為了保證同乙個字串只會出現在同乙個檔案

為了更好的理解上述兩種演算法,可以舉個形象的例子

廣場上有很多人,現在讓你統計這些人的情況

1 統計哪個省份的人最多

可以依次問每個人是來自哪個省,記著每個省多少人了,然後再找最多的省份

2 統計哪天出生的人最多,此處的哪天,要包括具體年月日,即85年1月1號和86年1月1號是不同的日期

這種情況下,人腦要記錄下每天有多少人,就沒有辦法記住了,所以要重新想辦法

其實上面兩種情況可以分別模擬海量資料處理中,有充足記憶體和記憶體不夠兩種情況

當統計省份時,由於省份個數比較少,可以認為人腦可以記住

當統計日期時,不同日期太多,人腦一次處理不完,需要借助紙筆(外存)

那麼統計哪天出生的人最多時,我們用什麼辦法呢

可以先把人群分堆,比如50~60的在一起,60~70的在一起等等,這樣我們就把人群分成了大概10來份,如果還不夠,繼續分

2023年1月出生的  2月的。。。。等等 這樣我們就把人群分成了12*80份(假設人群最大歲數為80歲)

如果沒份人還是太多,繼續細分

最終目的就是把問題細分為人腦能記住的規模

海量資料處理 找出現次數最多的那些

回憶一下tx的二面,有一道題是這樣的 假設有1kw個身份證號,以及他們對應的資料。身份證號可能重複,要求找出出現次數最多的身份證號。乙個很顯然的做法是,hash之,o n 搞定。這前提是記憶體中可以存下。如果是中國的13億人口,記憶體中存不下呢?借用磁碟,多次掃瞄?磁碟io的速度慢得能讓你瘋掉。這時...

出現次數最多的整數

問題描述 編寫乙個程式,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數n也是由使用者輸入的,最多不會超過20。然後程式將對這個陣列進行統計,把出現次數最多的那個陣列元素值列印出來。如果有兩個元素值出現的次數相同,即並列第一,那麼只列印比較小的那個值。輸入格式 第一行是乙個整數n,n 2...

出現次數最多的整數

問題描述 編寫乙個程式,讀入一組整數,這組整數是按照從小到大的順序排列的,它們的個數n也是由使用者輸入的,最多不會超過20。然後程式將對這個陣列進行統計,把出現次數最多的那個陣列元素值列印出來。如果有兩個元素值出現的次數相同,即並列第一,那麼只列印比較小的那個值。輸入格式 第一行是乙個整數n,n 2...