面试题六答案

       我认为实际上此题的考点应该就是hash的技术,网上对于此题的解答有两种方法。

       方案一:每个文件存放50亿个url,每个url的大小是64字节,那么每个文件的大小=5G*64=320G,远大于内存的4G,所以不能将文件全部一次性存入内存中,应该采取分治的方法:

                      1)遍历文件a,对其中的每个url求hash,hash(url)%1000,根据得到的值将50亿个url分到1000个小文件中(记为),这样每个小文件平均是300M

                      2)遍历文件b,与1)采用同样的方法通过hash将50亿个url存入1000个小文件中(记为

                      3)经过1)和2)的处理后,所有两个文件中可能相同的url分别存放在对应的小文件中(即),不对应的小文件不可能有相同的url,这样我们只用分别求出这1000对小文件中相同的url即可。

                      4)求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中,然后遍历另一个小文件中的每一个url,看其是否在刚构建的hash_set中,如果是, 那就是相同的url,否则就不是。


      方案二:如果允许有一定的错误率,那么我们可以使用Bloom filter

                      初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。

             为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为11ik)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。

             在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是11ik),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。

                      Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。

            关于Bloom Filter有一个博客讲的非常仔细,还有很多的扩展。

            http://blog.youkuaiyun.com/jiaomeng/article/category/275566

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值