Java集合框架分析(十)——布隆过滤器的简单java实现

    上一篇已经分析的很透彻了,代码应该很好实现了,来个简单版的,直接定义k=8,忽略P(error),直接上代码:

/**
 * 简单的布隆过滤器实现,k值设为8,不计算P(error)值,测试的的时候输入10000个字符串,位集大小设成5000 << 10000
 * @author lenovo
 *
 */
class BloomFilterdemo {
	//设置的位集大小
	private int defaultSize = 5000 << 10000;
	//最大索引位置
	private int basic = defaultSize - 1;
	//建立一个二进制位集
	private BitSet bits = new BitSet(defaultSize);
	private String key;
	/**
	 * 构造函数
	 * @param key 输入的key值
	 */
	public void BloomFilter(String key) {
		this.key = key;

	}
	/**
	 * 随机数生成器
	 * @param key
	 * @return 
	 */
	private int[] lrandom(String key) {
		
		int[] randomsum = new int[8];

		for (int i = 0; i < 8; i++) {
			randomsum[i] = hash(key, i);
		}

		return randomsum;
	}
	/**
	 * 添加元素的方法
	 * @param key
	 */
	public void add(String key) {
		int keycode[] = lrandom(key);
		for (int i = 0; i < 8; i++) {
			bits.set(keycode[i]);
		}

	}
	/**
	 * 判断一个元素是否在表中
	 * @param key
	 * @return
	 */
	public boolean exits(String key) {

		int keyCode[] = lrandom(key);
		if (bits.get(keyCode[0]) && bits.get(keyCode[1])
				&& bits.get(keyCode[2]) && bits.get(keyCode[3])
				&& bits.get(keyCode[4]) && bits.get(keyCode[5])
				&& bits.get(keyCode[6]) && bits.get(keyCode[7])) {
			return true;
		}
		return false;

	}
	/**
	 * 自己定义的hash算法
	 * @param key 输入的key值
	 * @param n 自定义的参数,用来传入不同参数生成不同的随机数
	 * @return
	 */
	public int hash(String key, int n) {

		return (int) (key.hashCode() * 21* n ^ n);

	}

}

public class BloomFilter {

	public static void main(String[] args) {

		BloomFilterdemo bf = new BloomFilterdemo();
		
		Long aBeginTime = System.currentTimeMillis();// 记录BeginTime
		for (int i = 0; i < 10000; i++) {
			bf.add("" + i);
		}
		Long aEndTime = System.currentTimeMillis();// 记录EndTime
		System.out.println("insert time-->" + (aEndTime - aBeginTime));
		Long lBeginTime = System.currentTimeMillis();// 记录BeginTime
		System.out.println(bf.exits("" + 888888));
		Long lEndTime = System.currentTimeMillis();// 记录EndTime
		System.out.println("seach time--->" + (lEndTime - lBeginTime));

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值