Scala中的完美哈希

时间:2010-05-09 09:28:46

标签: scala types hash scala-2.8 perfect-hash

我有一些课程C:

class C (...) { ... }

我想用它来索引有效的地图。最有效的地图是阵列。 所以我在伴随对象中添加了一个“全局”“静态”计数器,为每个对象提供唯一的id:

object C {
  var id_counter = 0
}

在C的主要构造函数中,每次创建C我想要 记住全球计数器值并增加它 问题1:怎么做?

现在我可以在C对象中使用id作为索引数组的完美哈希。 但是数组不保留像map那样的类型信息,给定的数组是由C的id索引的。

问题2:是否可以使用类型安全?

更新
问题2中的类型安全涉及地图索引的类型,以避免混合两个不相关的整数。 课程的价值是(类型)安全..

问题1询问如何在默认构造函数中增加变量?
即:放在哪里?

id_counter += 1

3 个答案:

答案 0 :(得分:1)

我没有看到问题。我可能会将计数器设为私有,因此classobject C之外的代码无法改变它。增加var类型Int是微不足道的:

idCounter += 1

数组在Scala中是类型安全的,因为它们是由JVM数组直接实现的(从2.8开始)。

我怀疑我并不是真的明白你的问题......

<强>更新

大概是在构造函数中增加计数器。

至于创建一个真正完美的哈希函数,我认为你并没有真正走上正轨。 (您只是将映射从您的实际密钥推送到您自己的代码中。)您应该阅读有关创建最小和/或完美哈希函数的技术。

答案 1 :(得分:1)

回答你的问题2:

case class C_Id(val asInt: Int)

object C {
  private var list: ArrayBuffer[C] 
  // resizable array in scala.collection.mutable
  // you can also use ArrayList

  def apply(id: C_Id) = list(id.asInt) // only accepts an id of C
  ...
}

class C (...) {
  // in constructor:
  list += this
}

编辑问题1:默认构造函数只是类型的主体,但方法和其他构造函数的定义除外。

答案 2 :(得分:0)

您是否可以使用C private的默认构造函数,并在随播对象中提供一个工厂方法(可以轻松处理更新计数器)?