大数据和空间限制

以具体的题目为引入,分析具体的大数据在空间限制情景下的查找和排序

1.网页过滤系统:每个网页的URL最多占64B,包含一个包含100亿个黑名单网页,判断出现的网页是否在黑名单上

要求:

  1. 允许有万分之一以下的失误率
  2. 额外空间不要超过30G

解答:

  1. 首先想到的方法:将URL用哈希表保存下来,然后根据遍历哈希表进行查询,但是100亿*64B(10^{10}*64B*10^{-9}=640G),不满足要求2
  2. 由于系统容忍一定程度的失误率,但是对空间要求比较严格,可以使用布隆过滤器的知识解决。一个布隆过滤器精确地代表一个集合,并可以精确地判断一个元素是否在集合中。
  3. 下面认识一下什么是布隆过滤器。假设有一个长度为m的bit类型的数组,即数组中的每一个位置只占一个bit,每个bit只有0和1两种状态。再假设有k个哈希函数,这些函数的输出域S>=m,并且这些哈希函数都足够优秀,彼此之间也完全独立。那么对同一个输入对象,经过k个哈希函数算出来的结果也是独立的,可能相同,也可能不同,但彼此独立。对算出来的每一个结果都对m取余,然后再bit array把相应的位置设置为1
  4. 记bit array为bitMap。至此,一个输入对象对bitMap的影响过程就结束了,也就是把bitMap中的一些位置涂黑。接下来按照该方法处理所有的输入对象,每个对象都可能把bitMap中的一些白位置涂黑,也可能遇到已经涂黑的位置,遇到已经涂黑的位置让其位置继续为黑即可。处理完所有的对象后,可能bitMap中已经有相当多的位置被涂黑。至此,一个布隆过滤器生成完毕,这个布隆过滤器代表之前所有输入对象组成的集合。
  5. 检查阶段如何检查一个对象是否是之前的某一个输入对象呢?假设一个对象为a,把a通过k个哈希函数算出k个值然后把k个值取余(%m)就得到[0,m-1]范围上的k个值。接下来在bitMap上看这些位置是不是都为黑。如果有一个不为黑,说明a一定不再这个集合里。如果都为黑,说明a在这个集合里,但可能误判。布隆过滤器的误判原则为:宁可错杀三千,也不放过一个。
  6. 对于误报的样本,可以加入到白名单中。

2.只用2GB的内存在20亿个整数中找到出现次数最多的数

要求:内存限制为2G

解答:

  1. 使用哈希表<key,value>即可统计,当哈希表记录数为2亿时,至少需要1.6GB。但是,如果20亿个数中不同的数超过了2亿中,极端情况下20亿个数都不同,此时内存就不够用了。
  2. 解决办法是用哈希函数把包含20亿个数的大文件分成16个小文件,根据哈希函数的性质,同一个数不可能被哈希到不同的小文件上,同时每个小问件上不同的数一定不会大于2亿种。然后对每一个小文件用哈希表来统计其中每种数出现的次数,这样就得到了16个小文件上各自出现次数最多的数和次数统计,接下来只要选出这16个小文件各自的第一名中出现次数最多的数即可。

3.40亿个非负整数中找到没出现的数

要求:

  1. 使用最多1GB的内存,找到所有没出现过的数
  2. 内存限制为10MB,只需要找到一个没出现过的数即可

解答:

  1. 首先排除使用哈希表,因为达不到空间要求
  2. 使用bit map:申请一个长度为2^{32}-1的bit类型的数组bitArr,bitArr上每一个位置只可以表示0或1状态。1B=8bit,所以长度为2^{32}-1=4294967295的bit类型的数组占用500M
  3. 遍历40亿个无符号数,遇到一个数,就把bitArr相应位置的值设置为1
  4. 遍历完成后,再依次遍历bitArr,哪个位置上的值没有被设置为1,哪个数就不在40亿个数之中。

4.找到100亿个URL中重复的URL以及TopK的问题

解答:

  1. 利用哈希函数进行分流
  2. topk问题首先进行分流,处理每一个小文件的时候,用哈希表统计每种词及词频,哈希表建立完成后,再遍历哈希表,遍历哈希表的过程中使用大小为k的小根堆来选出每一个小文件的top K(整体未排序的top k),然后将小根堆的词按词频排序,就得到了每个小文件排序后的top k,然后将各个小文件排序后的top k进行外排序继续利用小根堆,就可以选出每台机器的top k,不同机器之间top k再进行外排序或者继续利用小根堆,最终求出整个百亿数据量中的top k。
  3. 小根堆求最大的过程:时间复杂度O(nlogK)(n:数据的长度)
    1. 根据数据前K个建立K个节点的小根堆。
    2. 在后面的N-K的数据的扫描中, 如果数据大于小根堆的根节点,则根节点的值覆为该数据,并调节节点至小根堆。 如果数据小于或等于小根堆的根节点,小根堆无变化。

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值