首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Scala中对bloom filter建模

如何在Scala中对bloom filter建模
EN

Stack Overflow用户
提问于 2019-03-04 14:44:51
回答 1查看 99关注 0票数 0

我正在尝试在Scala中为bloom filter建模。逻辑本身实际上非常简单,但我正在努力弄清楚如何充分利用Scala的数据结构,使其更好、更实用、更实用。

我的问题是:如果我使用一个case类,我需要构造函数来生成哈希函数和存储实际布隆过滤器数据的位数组。但是,在像"add“这样会更改位数组内容的方法中,我需要返回一个新的布隆过滤器,而不是改变现有布隆过滤器的内容,以便我的方法在引用上是透明的。

不幸的是,我不能构造新的布隆过滤器,因为我不希望新的布隆过滤器重新创建新的位数组和新的散列函数,我也不能传递现有的,因为位数组和散列函数都不是布隆过滤器案例类的一部分。

那么,我应该如何在Scala中对此进行建模呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-04 16:02:11

修改为使用BitSet,以下注释

这是它可能的工作原理的概述。

代码语言:javascript
复制
trait HashFunctions[T] {
  def apply(value: T): BitSet
}

object Bloom {
  class BloomFactory[T](hash: HashFunctions[T]) {
    case class Bloom(flags: BitSet) {
      def add(value: T): Bloom =
        Bloom(flags union hash(value))
      def test(value: T): Boolean =
        hash(value).subsetOf(flags)
    }
  }

  def apply[T](): BloomFactory[T]#Bloom = new BloomFactory(DefaultHashFunctions[T]).Bloom(BitSet.empty)
}

请注意,这样做确实会在每次添加一个值时创建一个新的Bloom,但这会使类变得不可变,这是一个好主意。散列函数是在伴生对象中创建的,这样就不会在每次add到过滤器时发生这种情况。

显然,这在速度和内存使用方面都可以显著提高效率。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54977877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档