程序员面试金典: 9.10 扩展性与存储限制 10.6给定100亿个网址,如何检测出重复的文件?

#include <iostream>
#include <stdio.h>

using namespace std;

/*
问题:给定100亿个网址,如何检测出重复的文件?这里所谓的“重复”是指两个URL完全相同
分析:大数据立即想到:1)分组,2)位图,3)批处理
      可以根据给定的URL按照哈希算法(比如两次哈希)计算出URL的哈希值H,
	  分组+位图的方式只能用于每个元素只出现一次。
	  100亿 = 100 * 10^(8) = 10^(10),可以分成arraySize=10^5组,即10万个数组,每个数组存放rangeSize=10万个数据
	  计算每个URL所在组号g= H / rangeSize,计算每个URL在组号中的下标index = H % rangeSize,
	  统计每个URL所在组的次数C,对每个组的次数C,如果有C < rangeSize,
	  读取这100亿个网址。
	  想不到。
书上解法:100亿网址,平均每个网址100字符,平均每个字符4字节,
      1T = 10^3 G = 10^6 M = 10^9 K = 10^12 B
      共需要:100亿*100*4B 约 10^12*4B = 4TB = 4000 GB
	  假设一台机器一次最多存放1GB,采用二次扫描法:第一次分组,采用上述分组方式,分成4000组,每组1GB,
	  存入x.txt中,其中组号x = hash(u) % 4000
	  所有散列值相同的网址在同一组
	  第二次扫描是前面问题简化版本,将每个文件载入内存,创建网址散列表,找出重复的,没明白?
	  难道直接用散列hashArr[hash(u)]++;然后统计hashArr[hash(u)]中>1的就是
	  第二种解法:分发到多台机器,并行执行。

关键:先根据url分组,hash(u) % 4000;存储散列值相同的网址,然后第二次扫描读取每个分组文件,
     直接用散列hashArr[hash(u)]++;然后统计hashArr[hash(u)]中>1的就是

*/

int main(int argc, char* argv[])
{
	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值