BitMap 是什么?
BitMap 简称位图,实际上是一个散列表,只不过这个散列表中各个槽是计算机存储中的最小单元bit.
那BitMap数据结构长什么样呢?
一个长度为8的BitMap是下面这样的:
状态 | 实际表示 |
---|---|
初始化状态 | 00000000 |
使用后状态 | 00100000 |
BitMap 特性
- 数据结构本身所占用的存储极小
- 每个槽位上的值只能是0或者1
所以,上面的两个特性决定的它的使用场景。特别是在解决大数据中识别问题。具体0和1能表示什么,取决于业务上赋予它的值。比如有一下场景:
- 可以表示自然数是否存在问题。直接把自然数定位到数组下标,用1标记存在,用0标记不存在即可。
- 所知道的数组下标都只能是自然数,所以,可以将其他数据最终转换成自然数后,再使用BitMap进行标记。比如小明今天来上课的问题,就可以用学号直接替代自然数,标记用1或者0标记今天是否来上课问题。
- 网络爬虫中标记某一个url是否已经爬过了的问题。可以使用hash算法,将长url转换成自然数,然后用1或者0标记是否爬过。
BitMap在redis中应用
redis中除了list,set,zset,string,map这五种常用数据结构以外,还有hylog,geo,bitmap,sub/pub这四种数据结构。
其中,bitmap在redis中的应用,可以解决现在分布式服务器之间数据同步访问的问题。(注:redis4.0以上已经有bloomfilter插件了,可以配置开启)
Bloom Filter原理剖析
布隆过滤器原理就是使用BitMap来标记一个内容在map中是否存在。为了把其他的内容统一转换成自然数,也就是数组的下标,使用了hash算法,然后在对应的位置上标记是否存在。
关于hash算法
hash算法是指通过对数据的关键字进行某种运算,直接求出元素的地址。这里的地址指的是hashtable的下标位置。因为,hashtable本省就是一个数组结构。衡量hash算法好坏有两个重要指标。
- hash冲突尽可能的小,也就是尽可能的分散在各个槽内
- 装填因子=表中填充数据长度/hashtable.length 要尽可能的大
bloomfilter 在使用hash运算的时候也会产生hash冲突,解决hash冲突有两种方式:
- 扩大table的长度
- 解决hash冲突(它使用多次hash来解决该问题的)
对于连续的密集型的数据,可以使用下标位置代替数字本身,可以节省空间
标签:hash,标记,自然数,特性,BitMap,应用,下标,bitmap From: https://www.cnblogs.com/euler-blog/p/18598192这一特性在redisson中保存hashSlot就是典型的应用