基本思路
- 哈希分片。计算每个数据的哈希码,再进行求模运算,这样相同的数据将进入相同的分片。
- 字典树/哈希表。对每个分片,统计数据出现的次数。
- 堆。利用堆求topK问题。
- 归并。由于每个分片之间不存在重复数据,归并过程就很简单。
常见题目
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
分别对a、b两个文件进行哈希分片,方法是hash(s)%1000,这样将得到2000个文件,分别是a0,a1,...a999,b0,b1,...b999。分别对ai和bj进行处理,方法是将ai中的数据放入哈希表中,然后判断bj中的数据是否出现在该哈希表中,如果是,那么它就是公共数据。
在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。
利用2比特的BitMap。00表示不存在,01表示出现一次,11表示出现多次,依次将2.5亿个数放入BitMap中,需要的内存大约是2^32*2bit=1GB。
1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?
利用哈希分片,将1000万字符串分为100个小文件,然后对每个小文件去重,方法是利用字典树。最后将这100个结果合并起来。
一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。
首先进行哈希分片,将所有数据分为100个小文件,然后再利用字典树对每个小文件统计次数,再计算topK,可以使用最小堆,最后归并。
将多个集合合并成没有交集的集合:给定一个字符串的集合,格式如:(aaa,bbb,ccc),(ccc,dddd),(eee),(mmm)。要求将其中交集不为空的集合合并,要求合并完成的集合之间无交集,例如上例应输出(aaa,bbb,ccc,ddd),(eee),(mmm)。
利用并查集实现。