增加交并计算功能

This commit is contained in:
algotao
2025-11-05 16:41:06 +08:00
parent 869bae0a9e
commit 44d9206b9f
10 changed files with 950 additions and 12 deletions

View File

@@ -343,3 +343,55 @@ func LoadFromFile(filename string, headerOnly bool) (bft *BloomFilter, err error
return bft, nil
}
// And 两个布隆过滤器进行AND运算返回新的布隆过滤器
func (b *BloomFilter) And(other *BloomFilter) (*BloomFilter, error) {
// 检查参数一致性
if b.k != other.k || b.falsePositiveRate != other.falsePositiveRate {
return nil, errors.New("bloom filters must have same k and falsePositiveRate for AND operation")
}
// 创建新的布隆过滤器
result := newBloomFilter(b.m, b.k, b.elementsMax, b.falsePositiveRate)
// 执行AND运算
result.rb = roaring64.And(b.rb, other.rb)
// 计算AND后的元素数量这是一个估计值因为AND操作后元素数量无法精确计算
// 使用两个过滤器中较小的元素数量作为估计
if b.elementsAdded < other.elementsAdded {
result.elementsAdded = b.elementsAdded
} else {
result.elementsAdded = other.elementsAdded
}
return result, nil
}
// Or 两个布隆过滤器进行OR运算返回新的布隆过滤器
func (b *BloomFilter) Or(other *BloomFilter) (*BloomFilter, error) {
// 检查参数一致性
if b.k != other.k || b.falsePositiveRate != other.falsePositiveRate {
return nil, errors.New("bloom filters must have same k and falsePositiveRate for OR operation")
}
// 创建新的布隆过滤器
result := newBloomFilter(b.m, b.k, b.elementsMax, b.falsePositiveRate)
// 执行OR运算
result.rb = roaring64.Or(b.rb, other.rb)
// 计算OR后的元素数量这是一个估计值
// 使用两个过滤器中较大的元素数量作为估计,但不能超过最大容量
if b.elementsAdded > other.elementsAdded {
result.elementsAdded = b.elementsAdded
} else {
result.elementsAdded = other.elementsAdded
}
if result.elementsAdded > result.elementsMax {
result.elementsAdded = result.elementsMax
}
return result, nil
}