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