BloomFilter过滤器过滤算法的简单实现(学习笔记)
2013-01-17 02:50
405 查看
BloomFilter主要包括两种操作:
add():添加元素到其中
contains():判断一个元素是否在其中,(没有就是没有,说了有但实际上有可能没有)
关于contains()函数:
①,如果结果返回false:则元素一定不再其中
②,如果返回true,则不一定就在其中,这就是误差
BloomFilter实现(m(byte数组的大小)+k(hash次数)+n(需要存储的数据量))byte映射,多个hash函数
既然涉及到byte存储,那么必然需要一种映射关系了,也就是需要知道一个元素用哪些byte来表示,这也就是hash函数所干的事情。直观地想,一个元素一个byte基本上不可能,一般情况下这样的hash函数可以说不存在,所以这里假设用k位来表示,一般采用k次hash来确定这些byte。实际上,BloomFilter中一般包含m(byte数组的大小),k(hash次数)和n(需要存储的数据量)。 在元素加入实现add()操作时,连续k次hash,将得到的对应k位全置为1。当查询元素是否在集合中时,也是连续k次hash,如果这k次得到的位不是全为1,那么返回false;否则返回
true。传统的算法优化都是以时间换空间或者以空间换时间,BloomFilter则是以正确率换空间。
原文链接:http://bjyjtdj.iteye.com/blog/1455029
-------------------------------------------------------------------------------------------------------------------------------
BloomFilter简单的java例子实现;
package com.me;
import java.util.BitSet;
//BloomFilter主要有两种操作:add(),contains()
public class BloomFilter {
private int defaultSize = 2 << 20;
private int basic = defaultSize - 1;
private BitSet bitSet;
public BloomFilter() {
bitSet = new BitSet(defaultSize);
}
// 将元素加入其中,
public void add(String url) {
if (url == null) {
return;
}
int key1 = hashA(url);
int key2 = hashB(url);
int key3 = hashC(url);
bitSet.set(key1);
bitSet.set(key2);
bitSet.set(key3);
}
// 判断一个元素是不是在其中
public boolean contains(String url) {
if (url == null) {
return true;
}
int key1 = hashA(url);
int key2 = hashB(url);
int key3 = hashC(url);
if (bitSet.get(key1) && bitSet.get(key2) && bitSet.get(key3)) {
return true;
}
return false;
}
private int check(int speed) {
return basic & speed;
}
public boolean ifNotContainsSet(String url) {
if (url == null) {
return true;
}
int key1 = hashA(url);
int key2 = hashB(url);
int key3 = hashC(url);
if (bitSet.get(key1) && bitSet.get(key2) && bitSet.get(key3)) {
return true;
}
bitSet.set(key1);
bitSet.set(key2);
bitSet.set(key3);
return false;
}
private int hashA(String url) {
int speed = 0;
for (int i = 0; i < url.length(); i++) {
speed = 13 * speed + url.charAt(i);
}
return check(speed);
}
private int hashB(String url) {
int speed = 0;
for (int i = 0; i < url.length(); i++) {
speed = 23 * speed + url.charAt(i);
}
return check(speed);
}
private int hashC(String url) {
int speed = 0;
for (int i = 0; i < url.length(); i++) {
speed = 34 * speed + url.charAt(i);
}
return check(speed);
}
public static void main(String[] args) {
String bd = "http://www.baidu.com";
BloomFilter bloomFilter = new BloomFilter();
//not contains
String tb = "http://www.taobao.com";
System.out.println(bloomFilter.contains(tb));
//if not contains then add
System.out.println(bloomFilter.contains(bd));
bloomFilter.add(bd);
System.out.println(bloomFilter.contains(bd));
//if not contains then set (ifNotSet)
String gg = "http://www.google.com";
System.out.println(bloomFilter.ifNotContainsSet(gg));
System.out.println(bloomFilter.contains(gg));
}
}
add():添加元素到其中
contains():判断一个元素是否在其中,(没有就是没有,说了有但实际上有可能没有)
关于contains()函数:
①,如果结果返回false:则元素一定不再其中
②,如果返回true,则不一定就在其中,这就是误差
BloomFilter实现(m(byte数组的大小)+k(hash次数)+n(需要存储的数据量))byte映射,多个hash函数
既然涉及到byte存储,那么必然需要一种映射关系了,也就是需要知道一个元素用哪些byte来表示,这也就是hash函数所干的事情。直观地想,一个元素一个byte基本上不可能,一般情况下这样的hash函数可以说不存在,所以这里假设用k位来表示,一般采用k次hash来确定这些byte。实际上,BloomFilter中一般包含m(byte数组的大小),k(hash次数)和n(需要存储的数据量)。 在元素加入实现add()操作时,连续k次hash,将得到的对应k位全置为1。当查询元素是否在集合中时,也是连续k次hash,如果这k次得到的位不是全为1,那么返回false;否则返回
true。传统的算法优化都是以时间换空间或者以空间换时间,BloomFilter则是以正确率换空间。
原文链接:http://bjyjtdj.iteye.com/blog/1455029
-------------------------------------------------------------------------------------------------------------------------------
BloomFilter简单的java例子实现;
package com.me;
import java.util.BitSet;
//BloomFilter主要有两种操作:add(),contains()
public class BloomFilter {
private int defaultSize = 2 << 20;
private int basic = defaultSize - 1;
private BitSet bitSet;
public BloomFilter() {
bitSet = new BitSet(defaultSize);
}
// 将元素加入其中,
public void add(String url) {
if (url == null) {
return;
}
int key1 = hashA(url);
int key2 = hashB(url);
int key3 = hashC(url);
bitSet.set(key1);
bitSet.set(key2);
bitSet.set(key3);
}
// 判断一个元素是不是在其中
public boolean contains(String url) {
if (url == null) {
return true;
}
int key1 = hashA(url);
int key2 = hashB(url);
int key3 = hashC(url);
if (bitSet.get(key1) && bitSet.get(key2) && bitSet.get(key3)) {
return true;
}
return false;
}
private int check(int speed) {
return basic & speed;
}
public boolean ifNotContainsSet(String url) {
if (url == null) {
return true;
}
int key1 = hashA(url);
int key2 = hashB(url);
int key3 = hashC(url);
if (bitSet.get(key1) && bitSet.get(key2) && bitSet.get(key3)) {
return true;
}
bitSet.set(key1);
bitSet.set(key2);
bitSet.set(key3);
return false;
}
private int hashA(String url) {
int speed = 0;
for (int i = 0; i < url.length(); i++) {
speed = 13 * speed + url.charAt(i);
}
return check(speed);
}
private int hashB(String url) {
int speed = 0;
for (int i = 0; i < url.length(); i++) {
speed = 23 * speed + url.charAt(i);
}
return check(speed);
}
private int hashC(String url) {
int speed = 0;
for (int i = 0; i < url.length(); i++) {
speed = 34 * speed + url.charAt(i);
}
return check(speed);
}
public static void main(String[] args) {
String bd = "http://www.baidu.com";
BloomFilter bloomFilter = new BloomFilter();
//not contains
String tb = "http://www.taobao.com";
System.out.println(bloomFilter.contains(tb));
//if not contains then add
System.out.println(bloomFilter.contains(bd));
bloomFilter.add(bd);
System.out.println(bloomFilter.contains(bd));
//if not contains then set (ifNotSet)
String gg = "http://www.google.com";
System.out.println(bloomFilter.ifNotContainsSet(gg));
System.out.println(bloomFilter.contains(gg));
}
}
相关文章推荐
- Silverlight学习笔记一(理解一下机制,使用一下布局,实现一个简单的用户登录)
- JAVA 用于练手的超简单登录注册,jdbc实现【学习笔记】
- Dynamic CRM 2013学习笔记(四十六)简单审批流的实现
- 深度学习笔记(二):简单神经网络,后向传播算法及实现
- linux驱动学习笔记1(简单实现open,read,write,ioctl)
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
- 关于java打印功能的最简单实现的学习笔记
- spring学习笔记5--简单模拟实现AOP(JDK版)
- 学习笔记——基本光照模型简单实现
- [Erlang 学习笔记]Erlang 简单实现 KMP--字符串匹配算法
- Android(java)学习笔记218:开发一个多界面的应用程序之人品计算器的简单实现
- 【Unity3d】学习笔记(10)——第一人称控制器的简单实现
- DayDayUp之HTML5学习笔记 二 使用header、aside、section、footer实现一个简单的界面
- Thinking in Java学习笔记,简单包装Thread,实现快速实现线程
- 学习笔记(五)Tensorflow实现Soft Regression简单识别MNIST手写数字
- hadoop学习笔记--8.MapReduce案例一:简单好友推介实现
- MyBatis学习笔记-04.MyBatis实现简单的增删改查以及事务的问题
- iOS学习笔记14(1)—Core Data简单介绍和实现
- D3D学习笔记之六---简单的动画实现。