给定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个元素参与比较,败者数找出最大的数据输出。
延申:
诸如,统计最大出现频率的数据,topk问题,大数据排序等等都是类似于上面的几种思想实现的。很多问题都是这几种问题的一个变种,大致上都可以用上面的四种方式得到解决。