海量数据处理(1)Bitmap, Bloom Filter, Hash(转)

http://dijunzheng2008.blog.163.com/blog/static/989598972010713251555/

读书笔记。这一篇的Bitmap和Bloom Filter,都是在大规模数据下出现的新方法。其实概念都不是特别复杂,但是没有接触过的话,不容易一下子想出来。

1. Bitmap

问题:数据库里存了很多800电话号码,数量特别大,以至于内存放不下,如何排序?

方案:电话号码类似于800-810-5555,如果除掉800不看,后面8个十进位,最多可以表示1千万个数

那么我们用1.25M bytes内存(叫它bitmap或者bit array),每byte有8bits, 正好表示1千万个数。全部初始化成0.

一一拜访这些800电话号码,把它对应的bit点亮(设成1).

从头到尾go through这块内存, 按顺序输出电话号码。

O(N)的复杂度,很精巧,空间换时间的典范。

思考题:如果不想初始化这块内存,这个方法还能工作么?提示:再用一块内存(方法比较绕)

 

2. Bloom Filter

问题:网络爬虫遇到一个网络地址类似于“http://mach.debagua.net”这样的,如何知道以前爬过没有?--通常这个问题以这样的形式出现:硬盘上有1M个文件,每个文件里面包含着大量URL,如何检测URL重复?

方案: 构造一个bit array,这个array的大小可以这样,如果有1G个URL,就用2Gbytes。用八个index函数(f1,f2,…f8)作用于特定的URL, 得到八个正整数(n1,n2,…n8)。在bit array里面把n1,n2,…n8对应的bits点亮。这个方案的缺点是可能有误判。解决误判的方案可能有白名单。另外它不支持删除,解决方法是用counting bloom filter.

如何根据输入元素个数n,确定位数组m的大小及hash函数个数?当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为 0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。

 

3.Hashing 
适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存 
基本原理及要点: 
hash函数选择,针对字符串,整数,排列,具体相应的hash方法。 
碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法,opened addressing。

(1)开放定址法 
hi=(h(key)+di) mod m i=1,2,...,k(k<=m-1) 
其中m为表长,di为增量序列 
如果di值可能为1,2,3,...m-1,称线性探测再散列。 
如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2) 
称二次探测再散列。 
如果di取值可能为伪随机数列。称伪随机探测再散列。开放地址法堆装填因子的要求 
开放定址法要求散列表的装填因子α≤l,实用中取α为0.5到0.9之间的某个值为宜。

(2)二次探查法(quadratic probing) 
二次探查法的探查序列是: 
hi=(h(key)+i*i)%m 0≤i≤m-1 //即di=i2 
即探查序列为d=h(key),d+12,d+22,…,等。 
该方法的缺陷是不易探查到整个散列空间。

(3)双重散列法(double hashing) 
该方法是开放定址法中最好的方法之一,它的探查序列是: 
hi=(h(key)+i*h1(key))%m 0≤i≤m-1 //即di=i*h1(key) 
即探查序列为: 
d=h(key),(d+h1(key))%m,(d+2h1(key))%m,…,等。 
该方法使用了两个散列函数h(key)和h1(key),故也称为双散列函数探查法。

(4)拉链法 
拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t[0..m-1]。凡是散列地址为i的结点,均插入到以t为头指针的单链表中。t中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。

(5)建立一个公共溢出区 
假设哈希函数的值域为[0,m-1],则设向量hashtable[0..m-1]为基本表,另外设立存储空间向量overtable[0..v]用以存储发生冲突的记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值