大数据之数据结构例析(二)

来源:互联网 发布:外国人对中国美女知乎 编辑:程序博客网 时间:2024/06/08 07:52

1.给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

精确的算法:对于这两个文件,分别进行切分;将文件一切分为100份(每个文件大概380多MB),用合适的散列函数将数据进行处理,让经过散列函数后结构相同的数进入同一个文件,并且对文件进行编号;文件二使用和文件一一样的散列函数并进行同样的操作;

(1)分别将文件一和文件二切分的编号相同的文件加载进入内存,对比两个文件,找出相同的数据;

(2)将每个组中找出的相同的数据进行合并,便可以找到这两个文件中的交集。


近似算法:由于布隆过滤器的的“存在是不确定的,不存在是确定”特性,所以可以近似判断数据是否存在;

 将一个文件映射到一个布隆过滤器中,用另一个文件去在第一个文件映射的布隆过滤器中去查找,将所有找到的数据整理,便是这两个文件的交集。


2.如何扩展BloomFilter使得它支持删除元素的操作?

  对于每一位加一个计数器,实现引用计数,便可以是的其支持删除元素的操作;

 每 Set一个元素,计数器加一;

当删除时:没删除一次,对计数器减一;

(1)当计数器减为0时,将这一位删除;

(2)当计数器不等于0时,不要动;


3.给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有100K内存.

思路:用一个文件info 准备用来保存n个词和包含其的文件信息。
1. 首先把n个词分成x份。对每一份用生成一个布隆过滤器(因为对n个词只生成一个布隆过滤器,内存可能不够用)。把生成的所有布隆过滤器存入外存的一个文件Filter中。

2.将内存分为两块缓冲区,一块用于每次读入一个布隆过滤器,一个用于读文件(读文件这个缓冲区使用相当于有界生产者消费者问题模型来实现同步),大文件可以分为更小的文件,但需要存储大文件的标示信息(如这个小文件是哪个大文件的)。
3.对读入的每一个单词用内存中的布隆过滤器来判断是否包含这个值,如果不包含,从Filter文件中读取下一个布隆过滤器到内存,直到包含或遍历完所有布隆过滤器。如果包含,更新info 文件。直到处理完所有数据。删除Filter文件。


4.一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词.

思路:根据这个词典可以建立一个字典树,然后在这个字典树中去找所对应的字符串,如果找到了,就记录这个单词;按深度优先遍历整个字典树,就可以找到所有的包含这个字符串的单词。



作者水平有限,如有错误请留言,谢谢浏览!


0 0
原创粉丝点击