位图&布隆过滤器&哈希表的应用——海量数据处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tian_Luo_Girl/article/details/82225767
1. 给定一个大小超过 100G 的文件, 其中存着 IP 地址, 找到其中出现次数最多的 IP 地址

100G远远大于内存的大小,因此不能一次全部读入到内存中进行统计。

进行哈希切分,一般的内存是4G,但肯定不能一下子把4G填满,内存还要放其他的东西,因此可以选择切成1000份小文件,每份大小100G/1000=100M(这个值只是估算一下,实际上每份的大小是和具体的数据有关系)

将ip地址映射到相应文件中 index = hash_func(ip)
相同的ip地址一定得到的是相同的索引值,进入了同一个小文件
在每个小文件中分别找出出现次数最多的ip地址
将所有小文件中的结果汇总,找出所有文件中出现次数最多的Ip地址

2. 给定100亿个整数, 找到其中只出现一次的整数

方法一:
使用位图
2^32字节=4G
2^32 ≈ 42亿9千万
100亿个int –> 所占大小100亿*4字节 = 400亿字节 ≈ 40G
所以常规操作是不可行了,像这样找“只出现一次”的问题,可以考虑用位图
普通的位图用1位表示一个数存在或不存在,统计次数的话用两位的位图
整数约有 42亿9千万(即2^32=4G)个,(42亿9千万 * 2 )/ 8 = 1G
00:没出现过
01:出现过一次
02:出现过多次

将100亿个整数存入位图中,遍历位图,找出状态为01的数

方法二:
哈希切分
将100亿个整数切分为400份,每份400M,分别找到每个小文件中只出现一次的整数,再合并,筛选出合并后只出现一次的整数

3. 有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集

近似算法:
查找字符串是否存在使用布隆过滤器
1.定义一个1G的位图,能存放大约10亿*8=80亿个位
2.字符串通过哈希函数得到整数,将位图中整数对应的位置1
3.再让另一个文件的query使用相同的哈希函数得到的位来这个位图中找

精确算法:
哈希切分,切1000份,每份约400M
将两个文件的query分别进行哈希切分,使用相同的哈希函数将query转换为一个整数,再用整数模上1000得到一个下标值,将query存入对应下标的小文件中

相同的query一定进入了相同下标的小文件
对比两份下标相同的小文件,找出其交集,将1000份小文件的交集汇总起来即两份文件的交集

4. 给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中

倒排索引
遍历所有文件,将出现的单词进行哈希计算,建立哈希桶
单词出现在哪个文件中,就把该文件存入单词对应的哈希桶中

查找时,只需将要找的单词用同样的哈希函数进行映射,找到对应的桶,就能找到它在哪些文件中出现过

猜你喜欢

转载自blog.csdn.net/Tian_Luo_Girl/article/details/82225767