/*
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...