关闭

大数据和空间限制问题专题(二)

标签: 大数据面试算法海量数据
131人阅读 评论(0) 收藏 举报
分类:

大数据和空间限制问题专题(二)

(一).认识布隆过滤器

【题目】100亿个不安全的网页黑名单,每个网页的URL最多占用64字节,现在想要实现一种网页过滤系统,可以根据网页的URL判断该网页是否在黑名单上,要求该系统允许有万分之一以下的判断失误率,并且使用的额外空间不要超过30G。

(1).如果遇到网页黑名单系统,垃圾邮件过滤系统,爬虫的网址判断重复系统,又看到系统容忍一定的失误率,但是对空间有严格要求,
很可能是需要使用布隆过滤器的知识求解。

(2)布隆过滤器可以精确的代表一个集合,可以精确判断某一元素是否在此集合中,精确程度由用户的具体设计决定,做到100%的精确即正确是不可能的。

详细的解析在我的这篇博客给出:布隆过滤器


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

【题目】有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数。

【分析】很明显第一反应是通过哈希表对20亿个整数进行词频统计。哈希表的key是32位的整数,value最坏打算是20亿个,需要4B存储。32位整数用4B内存存储,2^32 约等于42亿,所以20亿可以用4B内存存储。所以一共需要的内存远超于2GB!一条记录需要8B存储,当哈希表的记录数为2亿个时,至少需要1.6GB的内存!
这里写图片描述

【解决方法】把包含20亿个整数的大文件通过哈希函数分流为16小文件,根据哈希函数的基本性质,相同的整数必将被分配到同一小文件中,并且只要哈希函数足够优秀,得到哈希值均匀,那么所有小文件最坏打算也不超过2亿个整数,这时候在符合内存要求的情况下通过哈希表进行词频统计,最终将每个小文件出现最多的词频进行比较,最终得出总的结论。
这里写图片描述

(三).40亿个非负数整数中找到没出现的数

【题目】32位无符号整数范围0~4294967295,现在有一个正好包含40亿个整数的文件,所以整个范围中必然有没有出现的数。可以使用最多1GB的内存,怎么找到所有没出想过的数。

【分析】如果用哈希表存储,40亿条记录,40亿*4B 约等于16GB!所以考虑用bitmap模型!2^32位 =512MB,符合内存要求!当出现7000时,在arr[7000]处赋值为1,以此类推,将40亿个整数遍历处理! 当处理完成之后,在遍历一次,arr[i]==0的下标即为没有出现过数的值!
这里写图片描述

【题目】内存限制为10MB,但是只用找到一个没有出现过的数即可。

【分析】考虑512/64 =8MB,8MB符合内存要求。所以将2^32个分为64个区间。由题目可知必然有区间计数不足2^32/64。

如何找出计数不足的区间呢? 通过取模方法,遍历40亿个整数,将整数落在某个区间上对计数变量加一,最终遍历完后随意取出一个区间进行关注。

再遍历40亿个数,对这40亿个数只关注落在取出区间的整数。并且用bitmap统计出区间内的数出现的情况。


(四).找到100亿个URL中重复的URL

【题目】有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出其中所有重复的URL。

【分析】bitmap使用于给定范围,这样可以固定bit类型数组的大小!此题URL不能固定范围,所以使用哈希函数的分流功能。哈希函数有一个重要性质:同一个输入值将产生同一个哈希值,最终在哈希表中的分布地址也必然相同,利用该性质,我们常常在处理大数据问题时由于空间不够,把大文件通过哈希函数分配到机器,或者通过哈希函数把大文件划分成小文件,一直划分,直到划分的结果满足资源限制的要求。

【补充题目】某搜索公司一天的搜索词汇是海量的(百亿级数据量),请设计出一种每天最热top100词汇的可行方法

【分析】这个又是词汇重复问题!先用哈希函数把百亿数据分流到不同服务器中,如果分流到的数据过大,继续把大文件通过哈希函数分流为子文件。在子文件中用哈希表统计每种词及其词频。遍历哈希表时使用大小为100的大顶堆来选出每个小文件的Top100(整体未排序),再将每个小文件词频的大顶堆排序,得到排序后的Top100。再用每个小文件的Top100进行外排序,最终求得整个百亿数据量的top100。
这里写图片描述

【注意】对于Top100来说,除了哈希函数和哈希表做词频统计外,还常用堆结构和外排序的手段进行处理。


(五).40亿个非负整数中找到出现俩次的数

【分析】bitmap模型变形,申请一个2^32 *2长度的bit数组进行操作。

【补充题目】可以使用最多10MB的内存,怎么找到这40亿个整数的中位数!

【分析】用分区间的方式进行处理,长度为2MB的无符号整数数组占用内存空间为8MB。所以将区间数量定义为2^32/2M ,向上取整为2148个区间。
遍历40亿个整数,对每个整数进行遍历,得到每个区间的整数个数(不需要进行词频统计)!假设0~k-1的区间为19.998亿,加上k区间的话肯定就超过20亿,所以中位数在k区间上!

申请2MB长度的数组(占用内存为8MB),遍历40亿整数对K区间的数进行词频统计,最后在区间k上找到第0.002亿个数即可。


(六).一致性哈希算法基本原理

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:25134次
    • 积分:753
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:3篇
    • 译文:0篇
    • 评论:33条
    最新评论