【问题标题】:How does Scala implement HashMap data structure?Scala是如何实现HashMap数据结构的?
【发布时间】:2020-05-21 11:49:56
【问题描述】:

我最近迷上了函数式编程,我真的很喜欢 Scala。只是出于好奇,我决定开始实现自己的数据结构。我从一个 SinglyLinkedList 开始,在这里我区分了两个案例类:案例Empty 和案例Cons(head,tail)。我想知道是否有人可以指出我如何实现 HashMap?提前感谢您的帮助:)

【问题讨论】:

  • 我碰巧有一个关于持久化数据结构实现的collection of references(主要是 Clojure,但 Scala 非常模仿那里的想法)。

标签: scala data-structures functional-programming hashmap


【解决方案1】:

我假设你的意思是不可变的 HashMap?那你可以看看tries

在 HashMap 中,您假设如果对象相等,则它们具有相同的散列,并且它们具有不同的散列,它们不相等。所以,你可以做的是:

  • 创建一个树,其中从根到叶的路径是键的哈希
  • 在节点中有例如对列表(键 -> 值)
  • 那么查找键值对就是遍历trie,然后遍历列表

如果散列很好,那么(通常)你应该有非常视图冲突,所以你在 trie 部分花费的时间比在列表部分中花费的时间更多。

在 FP 中使用它是关于使用技巧来允许在复制/添加/删除值时重用 trie 的部分,以便它保持相对便宜。如何有效地做到这一点是一个较长的主题,但您可以查看以下文章:

或者只是看Scala code for an immutable HashMap。它甚至引用了paper that it was based on

【讨论】:

  • trie 的好特性是您可以使用它来创建各种持久数据结构,这些结构类似于命令式数据结构,尽管它们是不可变的。
  • 是的,它们不仅用于地图,还用于例如用于不可变向量。
【解决方案2】:

HashMap[K, V] 应该包含哈希向量,类似于Vector[List[V]]。和hash 功能。尝试实现这个特性。

提示:尝试使用不可变数据结构来做到这一点

trait HashMap[K, V] {

  val hashVector: Vector[List[V]] = ???

  def hash(key: K): Int = ???

  def updated(key: K, value: => V): HashMap[K, V] = ???

  def get(key: Key): V = ???

  def getOrElse(key: Key, defaultValue: V): V = ???
}

数据结构说明: HashMap 类似于 HashTable,包含指向具有相同 hash(key) 值的链元素的链接的数组。

你也可以定义一些有用的构造函数:

object HashMap {
  def empty[K, V]: HashMap[K, V] = ???

  def fromSeqPairs[K, V](seq: Seq[(K, V)]): HashMap[K, V] = ???

  def filled[K, V](seq: Seq[K], defaultValue: V): HashMap[K, V] = ???
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 2014-04-08
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2015-08-16
    • 1970-01-01
    相关资源
    最近更新 更多