码迷,mamicode.com
首页 > 编程语言 > 详细

九章算法面试题20 寻找重复的URL

时间:2015-05-12 15:52:20      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:哈希   leetcode   lintcode   九章算法   面试题   

九章算法官网-原文网址

http://www.jiuzhang.com/problem/20/


题目

给定A、B两个大文件,各存放50亿个url,每个url各占256字节,内存限制是4G,让你找出同时在A和B中出现的url。


解答

方法1:使用BloomFilter(一种类似于hash表但比hash表占用空间更小的查重数据结构),通过K个不同的hash函数,将5G个URL映射到32G个bit位上,当且仅当K个hash函数得到的bit位上都是1时,代表该url重复出现。一般来讲K取8。该方法存在精度损失。时间复杂度O(n)。


方法2:用一个hash函数将A的5G个url分散到5*256/4=320个文件中(A0,A1..),相同文件的url的hash值%320相等。这样每个文件平均为4G大小。对B做同样处理(B0,B1…)。然后顺序处理Ai与Bi即可,此时只需要使用简单的hash表将url全部倒入内存。这种方法比方法1得到的答案更精确,但同时速度也更慢,因为方法1只有10G次读操作,方法2需要20G次读与10G次写(如果都不算答案输出的写操作的话)。



面试官角度

小内存中大文件处理的解答方法主要有如下几个角度:

1. 考虑精确结果和不精确结果采用不同的算法

2. 尽量减少文件写操作

3. 使用BloomFilter

4. 使用MapReduce

尝试这4个角度去解答,总不会错。对于这类问题,时间复杂度已经不是主要考点了。


九章算法面试题20 寻找重复的URL

标签:哈希   leetcode   lintcode   九章算法   面试题   

原文地址:http://blog.csdn.net/jiuzhang_ninechapter/article/details/45668735

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!