从今天开始仔细学习学习大数据量处理相关的算法,这是第一个算法,布隆过滤器
适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集
基本原理及要点:
对于原理来说很简单,位数组+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);
}
分享到:
相关推荐
这个压缩包文件“bloom filter布隆过滤器学习资料大全”显然是一个关于布隆过滤器的资源集合,包含了相关的论文和变种总结,对于学习和理解这一技术非常有帮助。 布隆过滤器的核心思想是通过多个哈希函数将元素映射...
布隆过滤器是一种高效的空间节省的数据结构,用于判断一个元素是否可能在一个集合中,但可能会产生一定的误判率。它由一个很长的二进制向量和多个独立的哈希函数组成。布隆过滤器的基本原理是,当一个元素被添加到...
布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。它是由 Burton Howard Bloom 在1970年提出的,主要应用于大数据存储和检索,尤其在数据库、缓存系统和网络搜索等领域有广泛...
Redis集成布隆过滤器需要使用Redis 4.0以上版本,或者使用Redis 6.x版本,使用官方提供的插件机制或编译安装RedisBloom模块。使用布隆过滤器可以解决大量数据去重问题,提高系统性能和效率。 布隆过滤器的优点是: ...
例如,`bf_create(size_t capacity, uint8_t num_hashes)`用于创建一个布隆过滤器,`bf_insert(bloom_filter* filter, const void* item)`用于插入元素,`bf_query(bloom_filter* filter, const void* item)`用于...
- `Intersection(other *BloomFilter)`: 计算两个布隆过滤器的交集,创建一个新的布隆过滤器,只保留同时存在于两个过滤器中的元素的位。 4. **优化策略**: - **位数组大小**:位数组的大小直接影响误判率,需要...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。在Java开发中,特别是在处理大数据、内存限制或需要快速查询是否存在某个元素的场景下,布隆过滤器是一个...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它可能会误判,但不会漏判,即如果它说一个元素在集合中,那可能是错误的,但如果它说一个元素不在集合中,那么...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。由布隆在1970年提出,它不像传统的数据结构如哈希表那样保证不误判,而是允许有一定的错误率。这种特性使得...
`bloomfilter.js`可能是JavaScript版本的布隆过滤器实现,而"Go-布隆过滤器的一个Go实现参考bloomfilter.js"则表明该Go版本的实现是借鉴了JavaScript版本的设计思路或代码结构。 Go实现布隆过滤器的关键组件包括: ...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。它可能会误判,但不会漏判,即可能存在假阳性(False Positive),但绝不会有假阴性(False Negative)。...
**布隆过滤器(Bloom Filter)**是一种空间效率极高的概率型数据结构,用于测试一个元素是否在一个集合中。由Burton Howard Bloom在1970年提出,主要用于节省存储空间,尤其在大数据场景下,它能有效地解决大规模...
布隆过滤器,大家学过数据结构的应该都清楚,一般的字典树要实现嵌入和查找都内存的消耗非常大,布隆过滤器有BloomFilter,string, BKDRHash, APHash, DJBHash> bf五个参数你要查找的元素个数,查找元素类型,三个...
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。在C++中实现布隆过滤器,可以有效地处理大量数据,尤其是在内存有限的情况下。这个压缩包文件"Bloom_filter...
在Python中,有多个库实现了布隆过滤器,其中一个就是我们这里提到的"python-bloomfilter-master"。 这个Python库提供了对布隆过滤器的简单接口,使得开发者可以方便地在项目中应用布隆过滤器。安装过程非常直观,...
C++实现的布隆过滤器,其中使用到的bitset也是自己简单实现的一个BitContainer。可以处理千万条到亿条记录的存在性判断。做成dll可以在很多场合使用,如自己写爬虫,要判断一个url是否已经访问过,判断一个单词是否...
bloomfilter布隆过滤器 海量数据处理
Ruby 中的 BloomFilter原生计数过滤器 + Redis 计数/非计数过滤器Ruby 中的 BloomFilter原生(MRI/C)计数布隆过滤器Redis 支持的 getbit/setbit 非计数布隆过滤器Redis 支持的基于集合的计数 (+TTL) 布隆过滤器布隆...
在Java中,布隆过滤器的实现非常便捷,尤其是利用了Guava库提供的BloomFilter类。开发者可以非常简单地通过调用put方法添加元素,通过mayContain方法来检查元素是否存在。不仅如此,布隆过滤器还允许开发者自定义...
布隆过滤器是一种概率型数据结构,用于判断一个元素是否可能在一个集合中。它是由Burton Howard Bloom在1970年提出的,主要用于解决大数据集的存储和查询问题,尤其在空间效率上有着显著优势。在数据库、搜索引擎、...