平潭综合实验区建设工程网站,网站建设发帖论坛社区,网站开发立项申请表,企业开发网站建设Bitmap是什么#xff1f;
用内存中连续的二进制位#xff08;bit#xff09;#xff0c;用0或1标识数据是否存在。
长度为10的bitmap#xff0c;1#xff0c;2#xff0c;3#xff0c;4 在bitmap中存在。 Bitmap实现
1、字符串 数值对应字符串的下标、二进制位0
用内存中连续的二进制位bit用0或1标识数据是否存在。
长度为10的bitmap1234 在bitmap中存在。 Bitmap实现
1、字符串 数值对应字符串的下标、二进制位01表示是否存在。01组成的字符串 问题 非单调递增字符串长度过大。
2、数组
java中 int类型4byte32 bitnew int[32] 占32*32bit。
用int的每一位标识一个数字1个int类型可以表示32的数字。
思路
个int占4字节即4*832位申请一个int数组长度为 int tmp[1N/32]即可存储数据
N代表要进行查找的总数
tmp中的每个元素在内存在占32位可以对应表示十进制数0~31,所以可得到BitMap表:
tmp[0]:可表示0~31
tmp[1]:可表示32~63
tmp[2]可表示64~95
…….
那么接下来就看看十进制数如何转换为对应的bit位
假设这40亿int数据为6,3,8,32,36,……那么具体的BitMap表示为
如何判断int数字8在tmp数组的哪个下标index 通过直接除以32取整数部分-》 8/320 -》 tmp[0]
我们如何知道了8在tmp[0]中的32个位中的哪个位
在tmp[0]中的第 8mod328。数字8就在tmp[0]中的第8个bit位从右边数起 Bitmap应用场景
1、在3亿个整数中找出不重复的整数限制内存不足以容纳3亿个整数。
BitMap小小变种:2-BitMap。
为每个整数分配2bit用不同的0、1组合来标识特殊意思
00表示此整数没有出现过、01表示出现一次、11表示出现过多次就可以找出重复的整数了
需要的内存空间是正常BitMap的2倍为3亿*2/8/1024/102471.5MB。 具体的过程如下
扫描着3亿个整数组BitMap。
查看BitMap中的对应位置如果00则变成01是01则变成11是11则保持不变
将3亿个整数扫描完之后也就是说整个BitMap已经组装完毕。最后查看BitMap将对应位为11的整数输出即可。 2、已知某个文件内包含一些电话号码每个号码为8位数字统计不同号码的个数。
8位最多99 999 999可以理解为从0-99 999 999的数字每个数字对应一个Bit位所以只需要99M个Bit1.2MBytes这样就用了小小的1.2M左右的内存表示了所有的8位数的电话 3、用户标签存储
思路每个标签eg程序员 --》bitMap存的是用户对应的uid 业务逻辑的处理思路
and 关系用运算 、or的关系用 | 运算 、bitMap不支持非运算如果要求非的情况通过遍历全量用户然后进行异或操作 4、布隆过滤器 (Bloom Filter) 它就是专门用来解决这种去重问题的。
描述Bloom Filter 反馈不存在的值一定不存在、反馈存在值可能不存在。存在一定概率的误判
原理
1通过一系列的hash算法得到key的hash值。在位数组中标识为1。
2判断key是否存在如果所有hash运算反馈的位数组结论都是 1 那么存在。如果有一个反馈是0 说明这个值不存在。
这也说明了为什么布隆过滤器可以精确的知道反馈不存在的值