您的位置:首页 > 其它

海量数据处理问题

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’的整数输出即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: