【1】处理2.5亿的数据,怎么样找出不重复的数据
(使用2bitmap,00表示不存在,01表示唯一,10表示重复)
类似问题:已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
8位最多99 999 999,大概需要99 999 999个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)
【2】给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
方案1:一个文件的大小为5*64=320G(10亿字节是1G),远远超出内存大小4G,所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法
方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit(1g内存大约有10亿字节,40*8=320亿)。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。
【3】有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
方案1、先内排序,再外排序
注:这里要知道hashmap如何根据value来进行排序。可以这样:
方案2、虽然有很多的query,但是很多query是重复的,因此可能对于所有的非重复的query,一次性就可以加入到内存了。这样,我们就可以采用前缀树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。
【4】、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频率最高的100个词。
这里最后的归并其实就是和:前面的m个有序数组排序的思想类似,可以使用递归完成。
【5】、海量日志数据,提取出某日访问百度次数最多的那个IP。
【6】、海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10大。
像这种topk大或者topk小的题目,就是使用堆,topk大使用小跟堆,topk小使用大根堆。
【7】、怎么在海量数据中找出重复次数最多的一个?
方案1:先做hash,也就是hash(数据)%1000,将数据模映射到很多的小文件中,然后每个小文件使用hashmap或者前缀树统计每个数据出现的次数,然后得到出现次数最大的数据,存入即频率存入一个文件中,最后求出1000个文件中频率最大的数据即可。
【8】、1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?
使用前缀树
【9】一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一个。
【10】一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。
首先根据用hash并求模,将文件分解为多个小文件,对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理,找出最终的10个最常出现的词。