名人博客阅读摘要二(Hash算法、HashSet、Bitmap、boomfilter)
2014-07-29 08:35
176 查看
2. 从头到尾彻底解析Hash表算法
基本了解了Hash算法的思想。最快的Hash表算法中,对于解决冲突,使用了三个Hash值,一个用于表示位置,另外两个用于检验重复,思想很好,具体实现还不细看。
3. 探索hash_set
hash_set的底层数据结构是哈希表,因此要深入了解hash_set,必须先分析哈希表。哈希表是根据关键码值(Key-Value)而直接进行访问的数据结构,它用哈希函数处理数据得到关键码值,关键码值对应表中一个特定位置再由应该位置来访问记录,这样可以在时间复杂性度为O(1)内访问到数据。但是很有可能出现多个数据经哈希函数处理后得到同一个关键码——这就产生了冲突,解决冲突的方法也有很多,各大数据结构教材及考研辅导书上都会介绍大把方法。这里采用最方便最有效的一种——链地址法,当有冲突发生时将具同一关键码的数据组成一个链表。下图展示了链地址法的使用:4. Bit-map详解
所谓的Bit-map就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对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的用法:排序。
5. Bloom Filter详解
可以看作是bitmap的扩展。Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思想。
但BloomFilter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。
下面我们具体来看Bloom Filter是如何用位数组表示集合的。初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。
为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位,即第二个“1“处)。
在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素(因为y1有一处指向了“0”位)。y2或者属于这个集合,或者刚好是一个false positive。
Bloom filter不支持元素的删除,因为会牵涉到其它元素对应位,可对其扩展:Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。
相关文章推荐
- 名人博客阅读摘要三:外部排序
- 名人博客阅读摘要一:教你如何迅速秒杀掉:99%的海量数据处理面试题
- 开发者是如何提升技能水平的 发表于1小时前| 770次阅读| 来源SquareSpace| 1 条评论| 作者Denis Gobo 开源程序员博客代码编程经验分享 摘要:作为一个技术开发人员,不断的学
- 第一周阅读博客摘要
- Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)
- 博客系统开发推送第一季----编写发表博客,并生成阅读摘要
- 博客内容摘要及阅读顺序
- Django 快速搭建博客 第十一节(文章阅读量统计,自动生成文章摘要)
- 如何高效地阅读技术类书籍与博客(转载)
- MVC 前后端分离(REST-个人也认为是目前比较流行和比较好的方式) 2017-07-24 19:23 77人阅读 评论(0) 收藏 举报 分类: Spring(4) 目录(?)[+] 摘要
- 长征路上的益友——好的名人博客地址
- Python Tips阅读摘要
- <Android 应用之路> Android 开发技术选型(博客,新闻,阅读类)
- mongodb地理空间索引原理阅读摘要
- 阅读博客收益多
- 阅读笔记 - 几篇性能测试博文的要点摘要
- 公告:CSDN博客频道自定义摘要、图片水印、热门标签功能正式上线!
- 博客项目实现文章摘要
- Java虚拟机结构阅读摘要
- 我的博客被人黑了,基本可以确认,被人挂上了自己的广告,另外今天的博客不显示阅读次数了!