海量数据处理问题
2018-03-04 15:53
267 查看
1. 布隆过滤器(Bloom Filter)
Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它适用于判断元素是否存在集合当中,速率非常高。Bloom Filter有可能会出现错误判断,但不会漏掉判断。
Bloom Filter可以准确的判断出某个元素不在集合之中。但如果判断某个元素存在集合中,有一定的概率判断错误。因此,Bloom Filter不适合那些“零错误”的应用场合。
在能容忍低错误率的应用场合下,Bloom Filter比其他查找算法(如hash,折半查找)极大节省了空间。
1. 组成
布隆过滤器两大重要部分:位数组、多个不同的哈希函数。布隆过滤器主体是一个由n个bit组成的数组,开始时每个bit都是‘0’。
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,n}的范围中。
当我们往Bloom Filter中插入一个任意元素x时候,我们使用k个哈希函数得到k个哈希值,然后将数组中对应的比特位设置为1。即第i个哈希函数映射的位置hash(x)就会被置为1(1≤i≤k)。 注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,两个哈希函数选中了多个同一个位置(下标3、6处)
2. 应用
对y使用k个哈希函数得到k个哈希值判断是否所有hash(y)的位置都是1(1≤i≤k),即k个位置都被设置为1了,
如果所有位置都已置成了‘1’,y就可能集合中的元素;只有一个位置上是‘0’,那y一定不是集合中的元素。
注意1:布隆过滤器无法准确判断某个元素存在于集合中,因为一个不存在元素通过k个哈希函数映射出来的位置上的值可能都是‘1’。
注意2:布隆过滤器不能删除元素。删除一个元素就要把k个位置置为‘0’,这样就会影响其他元素。(可以改进)
3. 改进
前面我们提到布隆过滤器不能删除元4000
素这一缺点是可以改进的,解决方案是用多个bit来存储一个元素。这里为了计算方便,采用32bit来存储。全‘0’代表不存在,出现一个便加一,删除元素时把对应位置减一就可以了。
4. 例题
题目:给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出近似算法和精确算法 。近似算法:布隆过滤器
1. 把第一个文件中每个query通过字符串算法转换成整型。
2. 通过k个哈希函数把每个query映射到布隆过滤器中。
3. 把第二个文件中的query一个一个在布隆过滤器中查找,看是否存在。但前面提过布隆过滤器判断一个元素是否存在是不准确的,所以这只是一个近似算法。
精确算法:哈希切分
1. 把query利用字符串算法转换成整型。使用一个散列函数把文件进行切分,并对文件进行编号,相同的query肯定分到同一个文件中。
2. 在对第二个文件也采用同一个散列函数进行切分,并对文件进行编号。
3. 把编号相同的文件进行比较,选出相同的便是两个文件的交集。
2. 哈希切割法
题目:给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现?解题思路:
找到出现次数最多的IP地址:
1. 估算把这100G的文件切割成1000份,利用哈希字符串转换算法,把每个IP转换成整型,然后哈希映射,同样的IP肯定映射到同一个文件当中。
2. 每个文件中的数据都写入到哈希表中,统计出每个文件中出现次数最多的IP。
3. 对比每个文件中出现次数最多的IP,找出所有文件中出现次数最多的IP。
找到top K的IP:
1. 估算把这100G的文件切割成1000份,利用哈希字符串转换算法,把每个IP转换成整型,然后哈希映射,同样的IP肯定映射到同一个文件当中。
2. 选择任意一个文件中的K个IP,建立一个大小为K的小堆。
3. 从剩下的IP每次拿出一个和堆顶元素比较,选出其中的较大值替换堆顶元素,再进行向下调整。比较完所有的数据后,堆里面剩下的K个IP便是这个文件中出现次数最多的IP。
3. 位图
题目1:给定100亿个整数,设计算法找到只出现一次的整数解题思路:
1.已知无符号整数所能表示的最大数是4,294,967,295(42亿9496万7292 )即232232。所以这100亿个数中有大量重复数字。
2. 采用2-BitMap法(每个数分配2个bit位,00表示不存在,01表示出现一次,10表示多次,11无意义)解决,共需内存232×2bit=1GB232×2bit=1GB。
3. 扫描这100亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。
4. 扫描bitmap,把对应位是01的整数输出即可。
题目2:给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
解题思路:
1. 建立两个1-BitMap(每个数分配1个bit位,0表示不存在,1表示存在),共需内存232×1bit×2=1GB232×1bit×2=1GB 。
2. 对这两个位图进行逐位‘与’运算,把结果为‘1’的位对应的整数输出即可。
题目3: 1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
解题思路:
1. 采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示两次次,11表示多次)进行,共需内存232∗2bit=1GB232∗2bit=1GB。
2. 扫描这100亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。
3. 查看bitmap,把对应位是‘01’或者‘10’的整数输出即可。
相关文章推荐
- 海量数据处理问题
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
- 海量数据处理算法(top K问题)
- 海量数据处理问题
- 15道海量数据处理的问题,牛人不牛人都可以试试!
- 海量数据处理问题汇总及方法总结
- 海量数据处理问题
- 海量数据处理的 Top K算法(问题) 小顶堆实现
- 海量数据处理的问题(1)
- 海量数据处理算法(top K问题)
- 海量数据处理问题
- 第二部分、处理海量数据问题之六把密匙
- 常见海量数据处理问题
- 海量数据处理算法(top K问题)
- .NET 海量数据处理,并处理事务问题
- 海量数据处理之排序问题
- 程序员求职之道(《程序员面试笔试宝典》)之海量数据处理(排序问题)?
- 【转】海量数据处理问题
- 海量数据处理问题 解决方法总结
- 万变不离其宗之海量数据下的算法问题处理思路