大数据问题集

1>海量日志数据,提取出某日访问百度次数最多的那个IP。

首先对于某日,提取出访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意IP是32位的,最多的IP个数2^32,相当于4G的大小(不可以一次放入到主内存当中)。同样可以采用映射的方法,比如模1000,将整个大文件映射成1000个小文件,再找出每个小文件中频率较大的几个IP(采用hash_map进行频率统计)然后再在这1000多个甚至更多的IP中找出最大的那个,即是题目所要求的那个IP。

2>搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串长度1-255字节。

假定目前有1千万条记录(虽然总数是1千万条,但是如果去掉重复就只有不超过3百万条),请统计出最热门的10个查询串。

先对这批海量数据预处理,在O(N)的时间内用Hash表完成统计。之后借助堆这个数据结构,找出TOPK,时间复杂度为n*logK。

3>有一个1G大小的一个文件,里面每行是一个词,词的大小不超过16字节,内存限制为1M,返回频率最高的100个词。

方案:顺序读取文件,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件当中。每个文件大概在200k左右。如果其中出现超过1M的文件则继续按照这个方法分割下去,直到每个文件都不超过1M为止。接下来对于每个文件统计其出现的词以及相应的频率(采用hash_map实现),并得出频率最高的100个词(采用最小堆实现),并写入文件,这样差不多就有5000个文件,接下来要做的工作就是对这5000个文件进行归并排序,并且返回前100个词。

4>有10个文件,每个文件1G,每个文件的每行存放的都是用户query,每个文件的query都可能重复,要求按照query的频度进行排序。

顺序读取10个文件,按照hash(query)%10的结果写入到另外10个文件中,这样新生成的每个文件大小约为1G。找一台内存2G的机器,依次用hash_map来统计每个query出现的频率query_count,然后根据频率使用快速排序排序,将结果输出到文件。

5>给定a,b两个文件,各存放50亿个url,每个url各占64字节,内存限制为4G,让你找出两个文件中共同的URL。

方案1:可以估计每个文件大小5G*64=320G,远远大于内存。所以不能将其完全加载到内存当中,可以考虑分治的方法。

遍历文件a,对于每个URL求取hash(URL)%1000,然后根据所取得的值将URL分别存储到1000个小文件当中,这样每个文件约为300M。遍历b文件采用与a文件相同的处理方法。这样可能相同的URL都在同一个小文件当中,不同的小文件不可能有相同的URL。然后我们就把问题简化成找出这1000个小文件中相同的URL即可。

对于求每个小文件中相同的URL,我们可以把其中的一个小文件url存储到hash_set中,然后遍历另个小文件的每一个URL,如果存在在hash_set中,就把它加入到结果文件。

方案2:如果不考虑100%的正确率。可以采用位运算的方法。4G内存大概可以表示340G个bit。将其中一个文件映射到这340G个位。然后读取另外一个文件,检查对应的bit是否已经存在,如果存在则加入到结果文件。

6>在2.5亿个整数中找出不重复的整数,注意,内存不足

方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现过一次,10表示出现过多次,11不表示任何意义)进行,共需要2^32*2bit=1GB的内存。然后扫描这2.5亿个数,查看Bitmap中相对应位。输出对应位为01的整数即可。

方案2:分治的思想,将大文件划分成小文件,然后在小文件中找出不重复的整数,并排序,合并,去重复。

7>给40亿个不重复的unsigned int的整数,没排序过,然后再给出一个数,如何快速的判断这个数是否在这40亿个数当中。

申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位,读入要查询的数值,看看它的bit位是否为1.

8>怎么在海量数据中找出重复次数最多的一个?

先做hash,然后求模映射成小文件,(相同的数据必定映射到相同的文件当中),然后hash_map找出频率最高的那个数。对于分成多少个小文件,就会有多少个频率较高的数,然后在这些数当中找出频率最高的那个。

————————————————
版权声明:本文为CSDN博主「CodeAsWind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CodeAsWind/article/details/38413925

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值