增加交并计算功能
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user