高效的不可变地图实施?

时间:2009-08-20 04:56:46

标签: functional-programming map immutability performance

我想知道是否有地图的实现:

  • 不可变,以便我可以使用它 函数式编程,以及 毫不费力地确保交易和并发。
  • 快速即可。我检查了Binary 搜索树(RB,AVL)和尝试,但 似乎没有一个像他们一样快 哈希表。有地图吗? 支持恒定时间的实现 更新和检索? (或至少非常快速对数时间)

简而言之,是否存在可以与Hash Maps进行性能比较的功能数据结构?

4 个答案:

答案 0 :(得分:4)

Clojure有不可变的地图。 (link)。不确定它正在使用什么底层数据结构。 Clojure源代码将为您提供更多信息!

答案 1 :(得分:3)

Scala也有immutable maps,但它们比哈希表慢。我怀疑你的问题的答案是否定的,你将找不到具有O(1)预期时间插入/查询操作的不可变映射实现。

答案 2 :(得分:1)

无论如何只是为了与人分享,这些是关于使用Tries在Scala中实现持久向量的两个有趣的博客条目。他们还提到了Clojure的实现,以及最近Scala版本中新的IntMap。

http://www.codecommit.com/blog/scala/implementing-persistent-vectors-in-scala http://www.codecommit.com/blog/scala/more-persistent-vectors-performance-analysis

对于这些数据结构,我已经使用key作为整数进行了测试,但还没有使用字符串。因为我的真实应用程序将使用字符串作为键,我不确定实现是否比哈希映射更有效。如果我使用String的HashCode作为键,然后使用Persistent Vector来支持地图怎么办?我将使用32路trie来实现持久向量。我猜碰撞是非常罕见的,只会相应地花费内存。但我不确定复制更新所需的实际金额。

我很快会发布我的结果。

答案 3 :(得分:1)

我还没读过,但我认为有些人认为Purely Functional Data Structures是这类事物的圣经。