大數據處理之Hash哈希表(一)

 現在的網絡公司對於數據的處理的非常看重的。比如拿百度來說,10大熱搜詞就是從海量的用戶搜索的數據中找到的,我們想的很簡單,只要把所有用戶搜索的數據按搜索次數 排列下來,隨便用個快排?歸併?取前10種出現頻次最高的不同的數據就好了,可是用戶搜索的數據實在是太多了。使用快排歸併那種內部排序是需要我們使用電腦內存的,現在電腦一般都是4-8G的內存。這可能連數據百分之1都存放不下。數據都不齊全,何談排序之說?
  因此就哈希表這種數據結構。
  先從淺來講。
   如果給我們一串數據,每個數據的範圍是0-9。那如何求出現頻次最高的數據呢?
  我們是不是可以定義一個長度爲10的數組當作計數器。而數組下標的範圍是不是恰好是0-9?那麼我們是不是可以遍歷這串數據,每次循環出現的數據就把當作計數器的下標,讓該下標對應計數器數組元素+1就好了,比如給我一串數據就是 0  1   2   1  
第一次是0  讓 計數器[0]加個1
第二次是1  讓  計數器[1]加個1
第三次是2  讓  計數器[2]加個1  
最後一個數據是1  再讓計數器[1]加個1
此時計數器的 0 1 2 號下標對應的值分別爲 1 2 1,是不是就是我們需要的每個數據對應的出現頻次。最後我們只要比較出現頻次的高低就可以了。





結果




但是,但是來了,以上的情況非常的巧,數據的大小剛好是0-9十種數,而且計數器也允許我們定義爲10個長度
,可是如果我只讓你的計數器長度爲5呢(或者更少),你會說何必這麼摳呢?
 其實已經夠大方了。你想想,一般的整形數字的範圍是多少,是不是2^32個,不算負數的也2^31個了,假如給你一串數據,範圍就是正整形,你要定義的計數器長度難道要2^31個?一個佔4個字節,到2^30個的時候已經消耗了4G的內存了,然而還有一半還沒有定義,況且能給你使用的內存也遠遠不到4G。如果數據範圍是long long 呢double呢,你計數器涉及到數據的還不到冰山一角。這還只是數字,字符串的組合就更多了。。。顯然按照以往的思想是行不通的。
扯得遠了,就拿10種數據 和 長度爲5的計數器  來說。
有什麼辦法可以塞得下2倍於自己的東西呢? 
是不是可以分開塞啊?搬家一趟搬不完的東西是不是可以多搬幾次?難道非要一次搬完?
關鍵是分開搬? 
10種數據,每次只能搬5種,是不是劃分成2次,很容易聯想到奇數偶數的劃分。
10種數據,給你的計數器長度是2呢。是不是每次只能搬2種,要搬5次,是不是能聯想到對5取餘的5種情況呢?
2^31=3萬多種數據,給你的計數器長度是10000,是不是每次只能搬1萬種,起碼要搬4次。按每個數對4取餘情況分成4次處理就好了。
代碼如下





結果



然而上面的代碼還是有點low,能不能改的稍微通用點,不用我們每次修改內容,只要給數據範圍,和計數器大小,代碼就能自動劃分一下呢? 還有在被調用函數裏打印等很多問題都太freestyle了 
 因此有了下面的改進





這將把10萬個隨機生成的數據中最頻數據打印出來。
結果




然而我們知道一般的數據又都是存放在文件中,一般不可能處理程序中生成的無意義的隨機數。因此結合文件操作纔是我們進一步需要掌握的。


由於沒有數據文件,就創建了一個haha.txt ,裏面存放10萬個隨機數。

結果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章