关于海量数据的面试题

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个最常出现的词。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值