分析: “首先是這一天,并且是訪問百度的日志中的IP取出來,逐個寫入到一個大文件中。注意到IP是32位的,最多有個2^32個IP。同樣可以采用映射的方法,比如%1000,把整個大文件映射為1000個小文件,再找出每個小文中出現(xiàn)頻率最大的IP(可以采用hash_map對那1000個文件中的所有IP進(jìn)行頻率統(tǒng)計,然后依次找出各個文件中頻率最大的那個IP)及相應(yīng)的頻率。然后再在這1000個最大的IP中,找出那個頻率最大的IP,即為所求。”
關(guān)于本題,還有幾個問題,如下:
Hash取模是一種等價映射,不會存在同一個元素分散到不同小文件中的情況,即這里采用的是mod1000算法,那么相同的IP在hash取模后,只可能落在同一個文件中,不可能被分散的。因為如果兩個IP相等,那么經(jīng)過Hash(IP)之后的哈希值是相同的,將此哈希值取模(如模1000),必定仍然相等。
那到底什么是hash映射呢?
簡單來說,就是為了便于計算機(jī)在有限的內(nèi)存中處理big數(shù)據(jù),從而通過一種映射散列的方式讓數(shù)據(jù)均勻分布在對應(yīng)的內(nèi)存位置(如大數(shù)據(jù)通過取余的方式映射成小樹存放在內(nèi)存中,或大文件映射成多個小文件),而這個映射散列方式便是我們通常所說的hash函數(shù),設(shè)計的好的hash函數(shù)能讓數(shù)據(jù)均勻分布而減少沖突。
盡管數(shù)據(jù)映射到了另外一些不同的位置,但數(shù)據(jù)還是原來的數(shù)據(jù),只是代替和表示這些原始數(shù)據(jù)的形式發(fā)生了變化而已。