数据结构-海量分析问题总结

题目一:

给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分)

首先,我们的思路就是利用哈希进行文件的切分,我们把100G大小的文件分为1000份,那么下来差不多每一个文件就是100M左右,然后再利用哈希函数除留余数的方法分配到对应的编号文件中,然后得出每个文件中出现次数最多的IP,然后堆排序取得这1000个ip中出现次数最多的。

题目二:

给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数).

由于是整数,所以我们采取的思路就是我们可以采用位图,100亿个整数,大致就是需要1.25G的内存进行存储。一个数字必须要2个位来进行表示状态,比如说,00表示不存在,01表示存在一次,10表示存在多次。这样就可以全部表示出每一个数存在的状态,这里我们就需要的内存是2.5G。

题目三:

有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集(hash文件切分 + 布隆过滤器).

这个我们有多种思路,我们采用哈希切分,100亿个整数我们来切分为1000个文件,这样就有2000个文件,然后我们进行哈希算法,A的100亿个数根据余数不同,对应存在A0文件-A999文件,这样就完成了A的哈希切分,然后我们对B进行哈希切分,同样的思想,分出1000个文件,根据余数的不同分配到B0-B999文件中,这样我们最后就进行简单的对应编号的文件之间的比对。这样就能找到两个文件的交集。

题目四:

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

第一步: 用一个文件准备用来保存n个词和包含其的文件信息。
第二步 : 首先把n个词分成x份。对每一份用生成一个布隆过滤器(因为对n个词只生成一个布隆过滤器,内存可能不够用)。把生成的所有布隆过滤器存入外存的一个文件Filter中。
第三步:将内存分为两块缓冲区,一块用于每次读入一个布隆过滤器,一个用于读文件(读文件这个缓冲区使用相当于有界生产者消费者问题模型来实现同步),大文件可以分为更小的文件,但需要存储大文件的标示信息(如这个小文件是哪个大文件的)。
第四步:对读入的每一个单词用内存中的布隆过滤器来判断是否包含这个值,如果不包含,从Filter文件中读取下一个布隆过滤器到内存,直到包含或遍历完所有布隆过滤器。如果包含,更新info 文件。直到处理完所有数据。删除Filter文件。

猜你喜欢

转载自blog.csdn.net/mxrrr_sunshine/article/details/80472789