海量数据处理-数据结构

Bloom filter(布隆过滤器)

适用范围:存在性判断。

基本原理:一般的存在性判断我们会想到二分查找和哈希查找。但是当我们数据量急剧增加时,上述方法所需要的空间呈线性增长。Bloom filter,将一个关键字通过K个独立的hash函数映射到一个固定长度的bit数组的K个bit位上(初始化bit数组各个bit位为0)。当我们插入关键字时,只需要把其映射的K个bit位置1。当我们查找关键字时,只有当其映射的K个bit位都是1时关键字才可能存在,否则一定不存在。当删除一个关键字时,该关键字映射的位与其他关键字映射的位有重叠,因此不能随意删除。


优点:节省空间,插入/查找时间都是常数。

缺点:1、即使某关键字映射的K个bit位为1,该关键字也可能不存在于集合中,即存在一定的误差。2、不能支持关键字的删除。

改进:1、对于误差,我们可以通过添加额外黑名单或白名单的方式降低误差。2、对于关键字的删除,一个简单的改进就是Counting Bloom filter,用一个counter数组代替bit数组,就可以支持删除了。

应用实例:

1、给你A和B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是多个文件呢?

2、黑名单IP过滤。

Hash(哈希表)

适用范围:快速查找,删除,存在性判断。

应用实例:

1、海量日志数据,提取某日访问百度次数最多的那个IP。

IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。

bit-Map

适用范围:快速查找,删除,存在性判断。

基本原理:实质上是以下标索引为key的hash。

应用实例:

1、已知某个文件内包含一些电话号码,每个电话号码为8位数字,统计不同号码的个数。

适用范围:前K大或前K小。

应用实例:

1、100万个数中找最大的前100个数。

桶划分

适用范围:第K大,中位数。

基本原理:因为元素范围很大,不能直接利用哈希表,所以通过多次划分,逐步确定范围,直到在一个可以接受的范围内进行处理。

应用实例:

1、在5亿个int中找它们的中位数。

数据库索引(B树)

适用范围:大量数据的增删改查

外排序

适用范围:海量数据的排序,去重。

基本原理:归并

应用实例:

1、有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数最高的100个词。

trie树

适用范围:数据量大,重复多,但是数据种类小,可以放入内存。

基本原理:Trie树又称单词查找树,典型应用是用于统计,排序和保存大量字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是,利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

特点:根节点不包含字符,除根节点以外的每个节点都只包含一个字符;从根节点到某个节点所经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。

问题实例:

1).有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序。

海量数据处理-数据结构_第1张图片

mapreduce

适用范围:海量数据处理。

基本思想:分治。

你可能感兴趣的:(海量数据处理-数据结构)