海量数据问题

来源:互联网 发布:淘宝规则名词解释 编辑:程序博客网 时间:2024/06/01 18:37

问题:给一个超过100G的log file, log中存着IP地址, 设计算法找到出现次数最多的K个IP地址。
1、将100G的文件进行切分,分为100个小文件。利用字符串转整数的函数(如 BKDRHash)将IP地址转换为整数key,再利用index=key%100就可将相同IP分到同一个文件。
2、依次将这100个文件读入内存,统计ip的次数。降序排列,前K个即为该文件中出现次数最多的ip.
3、将第一个文件中出现次数的最多的前K个ip建小堆,然后读入第二个文件,将其出现次数最多的前K个ip的出现次数与堆中数据进行对比,如果有大于堆中的ip出现次数,则更新小堆,替换原堆中堆顶元素。再读入第三个文件,以此类推……
问题:给两个文件,分别有100亿个URL,我们只有1G内存,找到两个文件交集。分别给出精确算法和近似算法。
精确算法:哈希切分
1、将每个文件切分为1000份,利用字符串转整数的函数(BKDRHash)将query转换为整数key,再利用index=key%1000就可将相同query分到同一个文件。
2、依次将编号相同的两个小文件加载到内存中进行比较。比如对于A0 && B0,我们可以遍历A0 ,将其中的url存储到hash_map当中。然后遍历B0,如果url在hash_map中,则说明此url在A和B中同时存在,保存到文件中即可。
近似算法:布隆过滤器
1、利用不同的字符串转整数的函数将query转换为整数key,再利用位图映射多个位实现。在判断时,必须每个位都有效。但是每一位都重叠映射,可以准确判断不存在的情况,判断存在时有误判。

原创粉丝点击