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