Java实现基于bitmap的字符串去重统计
字符串与整数不同,不能直接用位图表示。本文介绍两种基于bitmap思想的字符串去重统计方法:布隆过滤器和哈希映射法。
## 方法一:布隆过滤器(Bloom Filter)
布隆过滤器是bitmap的扩展应用,它使用多个哈希函数,将每个字符串映射到bitmap的多个位置上。
```java
import java.util.BitSet;
import java.util.function.Function;
public class BloomFilter {
private BitSet bitmap;
private int numBits;
private int numHashes; // 哈希函数数量
// 使用不同的种子计算哈希
private int hash(String str, int seed) {
int h = str.hashCode();
// 使用简单的混合函数与seed结合
return Math.abs((h ^ seed) % numBits);
}
public BloomFilter(int size, int hashes) {
this.numBits = size;
this.numHashes = hashes;
this.bitmap = new BitSet(size);
}
// 将字符串添加到过滤器
public void add(String str) {
for (int i = 0; i < numHashes; i++) {
int pos = hash(str, i);
bitmap.set(pos);
}
}
// 检查字符串是否可能在集合中
// 返回false表示一定不在,返回true表示可能在
public boolean mayContain(String str) {
for (int i = 0; i < numHashes; i++) {
int pos = hash(str, i);
if (!bitmap.get(pos)) {
return false; // 如果有任一位为0,则字符串一定不在集合中
}
}
return true; // 所有位都为1,字符串可能在集合中
}
// 估计集合中元素数量
// m = 位数,k = 哈希函数数量,X &