对两个数组作交集

数组A算法

数组B数组

方法1:对A中的数组进行排序,采起一样的排序方法对B中的数组进行排序大数据

     1)从A,B中各自取出a,b进行比较url

     2)若是a>b,那么从B中取出下一个数据b进行比较spa

   3)若是a<b,那么从A中取出下一个数据a进行比较日志

     4)若是a=b,那么找到一个,继续排序

 

方法2:hash内存

  1)对A中的m个数据装入到hash表字符串

      2)对B中的n个数据一次去hash表中查询,若是找到那么就是相同元素hash

 

方法3: 思路是先把两个数组去重,合并,再排序一下,重复的元素天然就出来了。

 

升级:若是数据特别大,内存没法装下。  两个大文件,查找相同字符串

  hash,分治法:

     1)采用hash算法对A文件进行hash成a个小文件

     2)采起一样的hash算法对B文件进行hash成b个小文件

     3)比较小文件对<a1,b1>.........由于hash的问题,因此相同的字符串确定在同个文件对里面。

     4)统计小文件对,能够继续采用hash,对a1的每一字符串创建hash表,遍历b1的字符串看是否在以前构建的hash表里面(和上面同样)

   

   通常来讲,若是内存能够存放,能够构造hash表,进行查找。若是内存没法加载,那么能够经过hash把大文件分红多个小文件,从而进行比较。

 

   hash算法在海量数据中的运用:

        单机处理大数据的问题也和mapreduce同样,分而治之,把海量数据切分红若干个小份进行处理。

    1)分而治之

         采用hash进行取模进行等价映射,将巨大的文件进行等价分割(符合必定规律的数据会被划分到同一个文件),划分红若干个小文件再进行处理。

    2)利用hashmap进行内存统计

    利用hashMap对小文件里面的数据进行统计

    3)排序

 

例如:给定a、b两个文件,各存放50亿个url,每一个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?

能够估计每一个文件的大小为5G*64=300G,远大于4G。因此不可能将其彻底加载到内存中处理。考虑采起分而治之的方法。 
遍历文件a,对每一个url求取hash(url)%1000,而后根据所得值将url分别存储到1000个小文件(设为a0,a1,...a999)当中。这样每一个小文件的大小约为300M。遍历文件b,采起和a相同的方法将url分别存储到1000个小文件(b0,b1....b999)中。这样处理后,全部可能相同的url都在对应的小文件(a0 vs b0, a1 vs b1....a999 vs b999)当中,不对应的小文件(好比a0 vs b99)不可能有相同的url。而后咱们只要求出1000对小文件中相同的url便可。 
好比对于a0 vs b0,咱们能够遍历a0,将其中的url存储到hash_map当中。而后遍历b0,若是url在hash_map中,则说明此url在a和b中同时存在,保存到文件中便可。 
若是分红的小文件不均匀,致使有些小文件太大(好比大于2G),能够考虑将这些太大的小文件再按相似的方法分红小小文件便可。

 

海量日志数据,提取出某日访问百度次数最多的那个IP?

IP地址最多有2^32=4G种取值可能,因此不能彻底加载到内存中。  能够考虑分而治之的策略,按照IP地址的hash(IP)%1024值,将海量日志存储到1024个小文件中。每一个小文件最多包含4M个IP地址。  对于每一个小文件,能够构建一个IP做为key,出现次数做为value的hash_map,并记录当前出现次数最多的1个IP地址。  有了1024个小文件中的出现次数最多的IP,咱们就能够轻松获得整体上出现次数最多的IP。 

相关文章
相关标签/搜索