给定a、b两个文件,每个文件中有海量的数据,内存不足,让你找出a、b文件共同数据?
思考:
(1) 布隆过滤器:
在输入数据时就将a文件的所有的数据的hashcode映射到一个集合(这里假设是一个数组arr[max]),此时b文件每次读取一条数据就计算出它的hashcode,加入此时为i,去数组中查找arr[i],如果arr[i]存在,则表示a文件中也有这个数据。
缺点:如果两个数据的hashcode相同,可能出现误判。
(2)字典树压缩:
a文件中的数据压缩到字典树中,读取b的时候一个一个去找,在压缩数据中找到了相同的数据就说明有
缺点:数据相似度较高,内存可以完成压缩,当数据相似度太低,字典树无法压缩,或者也所以后的数据量太大,计算机任然无法一次性读取到内存
(3) hash映射:
将a文件切分成很多个小文件,建设现在的数据是1到10亿之间的整数,我们把其中所有的数据模100,根据模出来的结果,将他们分到不同的小文件中,文件0放模为0的数据,文件1放模为1的数据……文件99放模为99的数据。然后读取文件b,每次读到的数据取模,去对应的文件里面对比。
(4)堆排序+败者树:
将所有的文件切分,开启多个线程进行处理,每个线程对应一个文件,将文件中的数据排序成为有序,(topk问题使用堆排序,堆排序在处理多个数据中找出前k个数据的速度快),然后使用败者树,每个文件中有k个元素参与比较,败者数找出最大的数据输出。
后续补充:
5.数据库索引
为了查询大量的数据,可能首先需要数据进行查询上得优化,如HBase就在较新得本中加入得布隆过滤器,当然此处主要介绍得是数据库得索引所发思想。
如下:是数据库得查询数据的过程,其间使用得B或者B+树来作为存放的数据结构。
6.mapreduce
maprecude其实和hash是一样的原理,他将数据的处理分为两个阶段,map和reduce,map多线程并行处理初始数据,reduce接受map得到的结果进行合并处理,代表的是hadoop。
如:100G的数据中的最大值,可以分给100个map,每个map占用一个1G服务器去读取,然后每个map都可以返回一个最大值,最后reduce就将这100个值取到,求出最大值即可。
7.bitmap
该算法也是用来查询数据的,如,有最大值为N的数据,则如果有100G个数据,需要知道a数据是否存在于这100G的数据中。我们只需要一个Nbit就可以存放。同样,使用bitmap还可以实现排序
例子:已知最大数据为8,我们需要知道a是否存在于这样的100G的数据中,我们遍历100G的数据,如果只遇到了2,3,4,5,7,那么最终结果如下:
第一个位置的0表示0不存在,
第二个位置的0表示1不存在,
第三个位置的1表示数据2存在,
第四个位置的1表示数据3存在,
由此,我们也可以对数据进行排序等操作。
延申:
诸如,统计最大出现频率的数据,topk问题,大数据排序等等都是类似于上面的几种思想实现的。很多问题都是这几种问题的一个变种,大致上都可以用上面的四种方式得到解决。