关于hash表的一个问题,是一个老的面试题。

ccc43542876 2011-10-18 04:14:10
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?

方案1:可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,...,a999)中。这样每个小文件的大约为300M。

遍历文件b,采取和a相同的方式将url分别存储到1000小文件(记为b0,b1,...,b999)。这样处理后,所有可能相同的url都在对应的小文件(a0vsb0,a1vsb1,...,a999vsb999)中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。

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

请问:加红的那段话,为什么会这样?一定是只是相同的只在对应的小文件中么?
...全文
432 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
icekingson 2011-10-27
  • 打赏
  • 举报
回复
可以利用ASCII码算出一个值,然后在HASH[Quote=引用 6 楼 ccc43542876 的回复:]

有点理解了,就好比hash(x)%5,这个hash 4和9 2个数的hash值应该是一样的是吧~这样的话~就应该放入同一个文件中~是这样理解么?关键是url是一串字符,它怎么去摸1000.是怎么得到那个值的呢?引用 5 楼 icekingson 的回复:
如果URL相同的话,hash(url)%1000得到的值肯定是相同的。
[/Quote]
ccc43542876 2011-10-19
  • 打赏
  • 举报
回复
嗯嗯~介个我已经理解了。但问题又出现了。URL怎么算出值么?hash(url)%1000,怎么样能运算出value?毕竟url是一串字符串呀。还是有别的方法?求高手解答[Quote=引用 7 楼 lanneret1234 的回复:]
URL相同的话,hash(url)%1000得到的值肯定是相同的
比如第一个url: hash(url)的值是1 那么他就放在第一个文件内
第二个url: hash(url)的值是111 那么他就放在第111个文件内
第三个url: hash(url)的值是1001 1001%1000 == 1那么他就放在第1个文件内
以此类推
期待高手!!
[/Quote]
blueardor 2011-10-19
  • 打赏
  • 举报
回复
正解,[Quote=引用 2 楼 lanneret1234 的回复:]
hash(url)%1000 是一个0—1000之间的值, 相同的url 执行hash(url)产生的值是相同的,所以可能相同的url都在对应的小文件(a0vsb0,a1vsb1,...,a999vsb999)中,个人理解是这样!期待高手!!
[/Quote]
lanneret1234 2011-10-19
  • 打赏
  • 举报
回复
URL相同的话,hash(url)%1000得到的值肯定是相同的
比如第一个url: hash(url)的值是1 那么他就放在第一个文件内
第二个url: hash(url)的值是111 那么他就放在第111个文件内
第三个url: hash(url)的值是1001 1001%1000 == 1那么他就放在第1个文件内
以此类推
期待高手!!
ccc43542876 2011-10-19
  • 打赏
  • 举报
回复
有点理解了,就好比hash(x)%5,这个hash 4和9 2个数的hash值应该是一样的是吧~这样的话~就应该放入同一个文件中~是这样理解么?关键是url是一串字符,它怎么去摸1000.是怎么得到那个值的呢?[Quote=引用 5 楼 icekingson 的回复:]
如果URL相同的话,hash(url)%1000得到的值肯定是相同的。
[/Quote]
icekingson 2011-10-19
  • 打赏
  • 举报
回复
如果URL相同的话,hash(url)%1000得到的值肯定是相同的。
ccc43542876 2011-10-19
  • 打赏
  • 举报
回复
hash(url)%1000对于这个我开始理解为,a文件里面url是按摸1000去放入不同的文件。比如第一个url放入第一个,第二个URL放入第二个文件,直到1000个URL时候,1000个小文件里面都有了一个URL。1001个URL的时候又放入第一个小文件。是这个意思么?[Quote=引用 2 楼 lanneret1234 的回复:]
hash(url)%1000 是一个0—1000之间的值, 相同的url 执行hash(url)产生的值是相同的,所以可能相同的url都在对应的小文件(a0vsb0,a1vsb1,...,a999vsb999)中,个人理解是这样!期待高手!!
[/Quote]
lanneret1234 2011-10-18
  • 打赏
  • 举报
回复
hash(url)%1000 是一个0—1000之间的值, 相同的url 执行hash(url)产生的值是相同的,所以可能相同的url都在对应的小文件(a0vsb0,a1vsb1,...,a999vsb999)中,个人理解是这样!期待高手!!
ccc43542876 2011-10-18
  • 打赏
  • 举报
回复
自己先顶一下~希望高手多多指教。。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧