从今天开始仔细学习学习大数据量处理相关的算法,这是第一个算法,布隆过滤器
适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集
基本原理及要点:
对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,
查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的
结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位
会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个
counter数组代替位数组,就可以支持删除了。
还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数个
数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少
要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数
组里至少一半为 0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底
的对数)。
代码实现如下(这个算法的关键是hash函数的设计):
package com.xhb.algorithms;
import java.security.MessageDigest;
import java.util.BitSet;
public class BloomFilter {
private BitSet bitset = null;
private BloomHasher bloomHasher = null;
public BloomFilter(BloomHasher hashers, int bitarrLength) {
this.bloomHasher = hashers;
this.bitset = new BitSet(bitarrLength);
}
public boolean isExists(String str) {
boolean result = true;
for (int i = 0; i < bloomHasher.getHashers().length; i++) {
result = result && (bitset.get(bloomHasher.getHashers()[i].hash(str)));
}
return result;
}
public void addElement(String str) {
if(isExists(str)) return;
for (int i = 0; i < bloomHasher.getHashers().length; i++) {
bitset.set(bloomHasher.getHashers()[i].hash(str), true);
}
}
public static void main(String[] args) {
BloomFilter filter = new BloomFilter(new BloomHasher(2), 2 << 10);
String strs[] = { "abc", "", "asdf", "dxerer","abc","abc" };
for (String str : strs) {
System.out.println(filter.isExists(str));
filter.addElement(str);
System.out.println(filter.isExists(str));
}
}
}
class BloomHasher {
private Hasher[] hashers;
public Hasher[] getHashers() {
return hashers;
}
public BloomHasher(int hashNum) {
hashers = new Hasher[hashNum];
for (int i = 0; i < hashNum; i++) {
hashers[i] = buildHasher(i);
}
}
private Hasher buildHasher(final int i){
return new Hasher() {
public int hash(String str) {
try {
MessageDigest md5 = MessageDigest
.getInstance("MD5");
md5.update(str.getBytes());
byte[] bytes = md5.digest(str.getBytes());
int result = bytes[i];
return result < 0 ? -result : result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
}
}
interface Hasher {
int hash(String str);
}
分享到:
相关推荐
Bloomfilter布隆过滤器技术分享PPT。 介绍了布隆过滤器的使用方法与适用场景等。 适合用于技术分享。
bloom filter布隆过滤器学习资料大全,收集了很多相关的论文,并总结了各种布隆过滤器的变种
自制布隆过滤器,采用八种不同哈希函数来获取随机数,错误率低
bloom filter 布隆过滤器,这是源码,简单易学易用
介绍Bloom Filter(布隆过滤器)原理、实现及具体应用,包含9个不同PPT及PDF文档资料,对Bloom Filter感兴趣、想学习的同学可以下载查看下
硬核 - Redis 布隆(Bloom Filter)过滤器原理与实战.doc
布隆过滤器C源码
布隆过滤器,大家学过数据结构的应该都清楚,一般的字典树要实现嵌入和查找都内存的消耗非常大,布隆过滤器有BloomFilter,string, BKDRHash, APHash, DJBHash> bf五个参数你要查找的元素个数,查找元素类型,三个...
布隆过滤器Bloom Filters的一个简单Java库
C++实现的布隆过滤器,其中使用到的bitset也是自己简单实现的一个BitContainer。可以处理千万条到亿条记录的存在性判断。做成dll可以在很多场合使用,如自己写爬虫,要判断一个url是否已经访问过,判断一个单词是否...
使用java实现的布隆过滤器算法,jdk-1.7,使用java实现的布隆过滤器算法,jdk-1.7,使用java实现的布隆过滤器算法,jdk-1.7,
布隆过滤器的一个Go实现,参考bloomfilter.js
bloomfilter布隆过滤器 海量数据处理
布隆去重工具类,感兴趣的了解一下。
布隆过滤器在网页去重中的应用 , 海量数据处理中的一个绝好应用
主要介绍了布隆过滤器(bloom filter)介绍以及php和redis实现布隆过滤器实现方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
NULL 博文链接:https://ansjsun.iteye.com/blog/1168722
用于 JavaScript 的布隆过滤器。 用法 const bfilter = require ( 'bfilter' ) ; 贡献和许可协议 如果你向这个项目贡献代码,你就隐含地允许你的代码在 MIT 许可下分发。 您还隐式验证所有代码都是您的原创作品。 ...
布隆过滤器是一种数据结构,主要用于判断一个元素是否可能在一个集合中存在。它可以在插入和查询数据时快速地判断一个元素是否可能在这个集合中,比如在缓存中查询一个元素是否存在。 它的原理是使用多个哈希函数对...
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多...