九章算法官网-原文网址
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个角度去解答,总不会错。对于这类问题,时间复杂度已经不是主要考点了。
时间: 2024-10-08 03:45:16