【整理】Bit-map/Bloom-filter
2011-10-30 22:38
387 查看
Bit-map:用一个bit位来标记某个元素对应的Value, 而Key即是该元素,由于采用了Bit为单位来存储数据,在存储空间方面可以大大节省。
假设要对0-7内的5个元素(4,7,2,5,3)排序(假设没有重复),就可采用Bit-map的方法来达到排序的目的。要表示8个数,只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0(如下图:)
![](data:image/png;base64,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)
然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) ,当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位 置为一(如下图):
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS8AAABKCAIAAABl8kXSAAADRklEQVR4nO2by20CQRAF94BzmFhMAGQCV0LBF0LBEqkgYmlfFhsMyDu/3me6njhZsmteqwvDsgxGCNHIMPcBCCFjsJEQlWAjISrBRkJUgo2EqAQbCVEJNhKiksc2DoSQPimxsYHp0+LGeslSsP4R6E8WNsKKztIphY2worN0SmEjrOgsnVLYCCs6S6cUNsKKztIphY2worN0SmEjrOgsnVLYCCs6S6cUNsKKztIphY2worN0SmEjrOgsnVLYCCs6S6cUNsKKztIphY2worN0SmEjrOgsnVLYCCs6S6cUNsKKztIphY2worN0SjWx8fyxSm9pfCzS9rPd+Rqy8ofuxvIc4FXWgw3rrN8Q7vUKi1Ft43m/TD8n+35sjm3O15CVN3Q3lucAr7N7t6GnjSxGPqvSxvFJYrHan379ZPIThhsrZ+huLM8BXmVUsZ+NLEYJq87G4/bROcbzLffnKX/DjZUxdDeW5wDHHC4e9rSRxShiVdn4uU1vKS22v/9Jn/ar2+eP8vM1ZE0fuhvLc4BmZof1KOH7zk67fjayGGWsGhvHp4QHr5jP+2Xj1wkNWLmvfPqzPAdoZhcbD2ZmPW1kMQpZNTYeN0/fvx43KS3S6mPCSxI31uShu7E8B3iXjjayGIWsWhufnKDL0CtZWUN3YXkO8C6dbWQxCljYOCMLGyVYOouBjTOysFGCpbMYfa7itB96A1aDN+uNWZ4DvMssV3FYDK6p5oA8We7XVK/DNdU8kAeLzxvnZHl/3njD4PPGPJADi3txZmXNcC/OJT1tZDHKWI3uU/05X//bEUtZJbcjdmd5DvA2XW1kMYpYlTZyq341a67vcPS1kcUoYVXbaMbX2KpZc3y/sbeNZixGLquJjVVxY71kKVj/CPQnCxthRWfplMJGWNFZOqWwEVZ0lk4pbIQVnaVTChthRWfplMJGWNFZOqWwEVZ0lk4pbIQVnaVTChthRWfplMJGWNFZOqWwEVZ0lk4pbIQVnaVTChthRWfplMJGWNFZOqWwEVZ0lk4pbIQVnaVTChthRWfplMJGWNFZOqWwEVZ0lk6ppzYSQnok20ZCiH+wkRCVYCMhKsFGQlSCjYSoBBsJUQk2EqISbCREJV+FMI0xGXpjtAAAAABJRU5ErkJggg==)
然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:
![](data:image/png;base64,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)
然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。下面的代码给出了一个BitMap的用法:排序。
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数
8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可(可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样就用了小小的1.2M左右的内存表示了所有的8位数的电话)
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数
将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是 0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变;或者不用2bit来进行表示,用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。
----------------------------------------------------------------------------------------------------------------------
Bloom
Filter:一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom
Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false
positive),因此Bloom
Filter不适合那些“零错误”的应用场合,而在能容忍低错误率的应用场合下,Bloom
Filter通过极少的错误换取了存储空间的极大节省。
集合表示和元素查询
下面我们具体来看Bloom Filter是如何用位数组表示集合的。初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jiaomeng/275417/o_bf1.jpg)
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash
Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注:如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位,即第二个“1“处)。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jiaomeng/275417/o_bf2.jpg)
在判断y是否属于这个集合时,对y应用k次哈希函数,若所有hi(y)的位置都是1(1≤i≤k),就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素(因为y1有一处指向了“0”位);y2或者属于这个集合,或者刚好是一个false
positive。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jiaomeng/275417/o_bf3.jpg)
Bloom
filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom
filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom
Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。
假设要对0-7内的5个元素(4,7,2,5,3)排序(假设没有重复),就可采用Bit-map的方法来达到排序的目的。要表示8个数,只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0(如下图:)
然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) ,当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位 置为一(如下图):
然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:
然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。下面的代码给出了一个BitMap的用法:排序。
//定义每个Byte中有8个Bit位 #include <memory.h> #define BYTESIZE 8 void SetBit(char *p, int posi) { for(int i=0; i < (posi/BYTESIZE); i++) p++; *p = *p|(0x01<<(posi%BYTESIZE));//将该Bit位赋值1 return; } void BitMapSortDemo() { //为了简单起见,我们不考虑负数 int num[] = {3,5,2,10,6,12,8,14,9}; //BufferLen这个值是根据待排序的数据中最大值确定的 //待排序中的最大值是14,因此只需要2个Bytes(16个Bit) //就可以了。 const int BufferLen = 2; char *pBuffer = new char[BufferLen]; //要将所有的Bit位置为0,否则结果不可预知。 memset(pBuffer,0,BufferLen); for(int i=0;i<9;i++) SetBit(pBuffer,num[i]); //首先将相应Bit位上置为1 //输出排序结果 for(int i=0;i<BufferLen;i++)//每次处理一个字节(Byte) { for(int j=0;j<BYTESIZE;j++)//处理该字节中的每个Bit位 { //判断该位上是否是1,进行输出,这里的判断比较笨。 //首先得到该第j位的掩码(0x01<<j),将内存区中的 //位和此掩码作与操作。最后判断掩码是否和处理后的 //结果相同 if((*pBuffer&(0x01<<j)) == (0x01<<j)) printf("%d ",i*BYTESIZE + j); } pBuffer++; } } int _tmain(int argc, _TCHAR* argv[]) { BitMapSortDemo(); return 0; }
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数
8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可(可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样就用了小小的1.2M左右的内存表示了所有的8位数的电话)
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数
将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是 0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变;或者不用2bit来进行表示,用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。
----------------------------------------------------------------------------------------------------------------------
Bloom
Filter:一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom
Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false
positive),因此Bloom
Filter不适合那些“零错误”的应用场合,而在能容忍低错误率的应用场合下,Bloom
Filter通过极少的错误换取了存储空间的极大节省。
集合表示和元素查询
下面我们具体来看Bloom Filter是如何用位数组表示集合的。初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jiaomeng/275417/o_bf1.jpg)
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash
Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注:如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位,即第二个“1“处)。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jiaomeng/275417/o_bf2.jpg)
在判断y是否属于这个集合时,对y应用k次哈希函数,若所有hi(y)的位置都是1(1≤i≤k),就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素(因为y1有一处指向了“0”位);y2或者属于这个集合,或者刚好是一个false
positive。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/jiaomeng/275417/o_bf3.jpg)
Bloom
filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中。Counting bloom
filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom
Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。
相关文章推荐
- Python 几个内建函数: map, reduce,filter,sorted 整理
- Python学习笔记(5):lambda,filter,map,reduce,zip用法整理
- 海量数据处理:分治-Hash映射+Bit-map+Bloome Filter
- Python常用内置函数整理(lambda,reduce,zip,filter,map)
- Map-Reduce实现Join 算法(mapreduce侧连接 maponly 连接 map bloomfilter reduce连接) (join二)
- 掌握常用的几个(如,just, map,flatMap和filter等)
- map/unordered_map原理和使用整理
- 渲染器 Shader BitmapShader
- Map 基础知识整理
- python3中使用map,reduce和filter
- js中every、filter、forEach、map和some迭代法 — 第5.2.8节
- Graphics->BitmapPixels
- php中array_map,array_filter,array_walk区别
- 海量数据处理算法—Bit-Map
- javascript利用map,every,filter,some,reduce,sort对数组进行最优化处理
- 海量数据处理算法—Bit-Map
- 类级框架——list,map和set(整理)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)zhuanzai
- for in与for of的区别,以及forEach,map,some,every,filter的区别
- Bloom-Filter布隆过滤器