Bloom Filter Bitmap 快速判断数据是否在集合中
时间:2022-07-22
本文章向大家介绍Bloom Filter Bitmap 快速判断数据是否在集合中,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
- 首先申请512M的内存,512M的内存可以存储2^29B = 2^32 * 2 bit = 1G内存
- 然后实现一个bitmap就是用1/0表示当前位数据是否存在 每个数分配1bit
- 。读入40亿个数,设置相应的bit位,读入要查询的数查看相应bit位是否为1,为1表示存在,为0表示不存在。
二、在2.5亿个整数中找出不重复的整数,内存空间不足以容纳这2.5亿个整数。
- 这次我们采用2-Bitmap标记数据,每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义。
- 共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。
三、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件url列表的交集?如果是三个乃至n个文件呢?
- 谈到两个文件的交集,或者多个文件的交集,我么首先想到的就是bloom过滤器。bloomfilter判断一个数据不在是100%肯定的,但是判断在一个集合中,是存在概率问题的。
- 如果允许有一定的错误率,可以使用Bloom filter。4G内存可以表示2^328=340亿bit。n=50亿,如果按出错率(E=0.01)算需要的大概是nlog2(1/E)1.44 =650亿个bit。现在可用的是340亿,相差并不多,可能会使出错率上升些。
- 方案:将其中一个文件中的url使用Bloom Filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。
python bloomfilter
rom pybloom_live import BloomFilter
bf = BloomFilter(capacity=1000)
bf.add("www.baidu.com")
print("www.baidu.com" in bf) # True
print("www.douban.com" in bf) # False
java 实现bitmap
public class BitMap {
/** 插入数的最大长度,比如100,那么允许插入bitsMap中的最大数为99 */
private long length;
private static int[] bitsMap;
private static final int[] BIT_VALUE = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020,
0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000,
0x00008000, 0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000 };
public BitMap(long length) {
this.length = length;
// 根据长度算出,所需数组大小
bitsMap = new int[(int) (length >> 5) + ((length & 31) > 0 ? 1 : 0)];
}
/**
* 根据长度获取数据 比如输入63,那么实际上是确定数62是否在bitsMap中
*
* @return index 数的长度
* @return 1:代表数在其中 0:代表
*/
public int getBit(long index) {
if (index < 0 || index > length) {
throw new IllegalArgumentException("length value illegal!");
}
int intData = (int) bitsMap[(int) ((index - 1) >> 5)];
return ((intData & BIT_VALUE[(int) ((index - 1) & 31)])) >>> ((index - 1) & 31);
}
/**
* @param index
* 要被设置的值为index - 1
*/
public void setBit(long index) {
if (index < 0 || index > length) {
throw new IllegalArgumentException("length value illegal!");
}
// 求出该index - 1所在bitMap的下标
int belowIndex = (int) ((index - 1) >> 5);
// 求出该值的偏移量(求余)
int offset = (int) ((index - 1) & 31);
int inData = bitsMap[belowIndex];
bitsMap[belowIndex] = inData | BIT_VALUE[offset];
}
public static void main(String[] args) {
BitMap bitMap = new BitMap(63);
bitMap.setBit(63);
System.out.println(bitMap.getBit(63));
System.out.println(bitMap.getBit(62));
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux Shell命令速查表
- Windows10实现滑动锁屏
- Vue&uni-app在微信浏览器隐藏titleNView的一个方法
- 使用OData服务将SAP C4C自定义BO的TextCollection暴露给外部消费者
- 如何在SAP C4C AdvancedListPane上批量执行若干BO实例的action
- SAP ABAP Webdynpro ALV的link to action的实现方法
- SAP CRM和C4C表格列宽度调整的工作原理
- SAP C4C里如何创建两个具有依赖关系的下拉菜单
- 温故知新——Spring AOP
- tf.random_shuffle 函数
- IndexError: dimension specified as 0 but tensor has no dimensions
- 死磕YOLO系列,YOLOv2的自我修养
- three.js 几何体(二)
- three.js 几何体(三)
- three.js 几何体-组合网格