大数据处理之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万个随机数。

结果


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