海量数据处理与哈希切分

目录

题目一

题目二

题目三

题目四

题目五

题目六


题目一

给定100亿个整数,设计算法找到只出现一次的整数?

        这个题,可以使用位图的变形,每个数字的状态用两个位来表示(00表示不存在,01表示出现一次,10或者11表示出现两次及以上)。那么需要多少内存呢?

        一共是有2^32个整数,一个整数占2个位,需要2^33个位,也就是2^33/8=2^30字节,1G=2^30字节,所以占用1G的内存。

题目二

给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

        方案一:将其中一个文件中的数据用位图表示,然后用另一个文件中的数据进行哈希映射与位图进行比较,位置上为1则是交集,为0则不是交集。

        方案二:将两个文件分别放到两个位图中,将两个位图按位与,都是 1,与的结果为1,否则为0,1则为交集。

题目三

位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

        这个题目与题目一相似,也是使用两个位,00表示不存在,01不是出现过一次,10表示出现过两次,11表示出现三次及以上的。正好消耗1G的内存。最后统计状态为00,01和10的就可以了。

上面三个题为位图的题目

题目四

给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和 近似算法

        query:相当于一个查询语句或网络请求的url等,一般是一个字符串

        一个query大约30~60字节(byte)

近似算法:一个文件大约有3000~6000亿字节的数据。10亿字节≈1G。那么大概有300~600G。我们将第一个文件中的映射到一个布隆过滤器中,读取文件二中的查询,判断在不在bloomfilter中,在就是交集,不在就不是交集。

这种算法的缺陷:由于使用bloomfilter,会导致有些不是交集的数据混入交际中。后面我们会提出解决该问题的方案。

题目五

如何扩展BloomFilter使得它支持删除元素的操作

        将布隆过滤器设置为技术器的形式,为每个位置多分配几个位来表示状态,当有数据映射到某个位置时,将该位置进行+1操作就好了。分配位也是一个问题,给的位多了,耗费的空间会变大,给的位少了,在进行+1操作时,可能会出现溢出的情况。

在上面题目四中,我们遇到了使用bloomfilter解决问题是的问题,那么如何解决呢?在这里提出了一个概念——切分

平均切分:可以把文件平均切分为大小相同的小份文件(可以放入内存中的),然后将小文件放入到set中,用读取文件二与set进行比较。得到精确的交集。但是这种方法比较的次数会偏多,因此又提出了一种叫做哈希切分的方法。

哈希切分:本题划分为1000个文件,i=hashstr(query)/1000,i为多少,query就进入到Ai/Bi小文件中,所有的A/B都如此处理。将Ai中的数据进入内存放入set中存储,读取对应的Bi小文件进行比较,只需要比较Ai和对应的Bi就行,不需要全比较,因为相同的字符传映射到的哈希地址必然是相同的。这样效率就大大提高了。

题目六

给一个超过100G大小的logfile(日志文件), log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同, 如何找到top K的IP?

        与上面相似,将文件切分为1000个小文件A0,A1……A999,i = hashstr(ip),将每个ip否根据哈希函数映射到对应的小文件Ai中,文件Ai放入到内存中的map<string,int> CountMap中,K为ip,V为出现次数,再使用一个map<string,int> max记录出现次数最多的ip地址最后输出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值