#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;
}
程序员面试金典: 9.10 扩展性与存储限制 10.6给定100亿个网址,如何检测出重复的文件?
最新推荐文章于 2020-06-27 11:53:13 发布