2

在亚历克斯·塔格特下面的评论之后编辑。

我正在使用拉链轻松遍历和编辑可以增长到数千个节点的树。每个节点在第一次创建时都是不完整的。数据将一直在随机位置添加/删除,叶节点将被分支替换,等等。

树可能非常不平衡。对节点的快速随机访问也很重要。

一种实现是使用 zipper 遍历树并创建由键索引的节点的哈希表。不用说上面的效率很低,因为:

  • 每个节点需要创建2个副本
  • 任何更改都需要在 2 个数据结构(树和哈希图)之间一致地镜像。

简而言之,是否有一种时间/空间有效的方法来结合使用拉链的轻松遍历/更新和 clojure 中哈希表的快速访问?

4

1 回答 1

2

Clojure 的数据结构是持久的并且使用结构共享。这意味着添加、删除或累积等操作并不像您描述的那样低效。内存成本将是最小的,因为您没有复制已经存在的内容。

默认情况下,Clojure 的数据结构是不可变的。因此,除非您使用某种引用类型(如 Var),否则树状结构中的节点不会自行更新。我对您的具体用例知之甚少,无法就访问节点的最佳方式提供建议。访问嵌套结构中的节点的一种方法是get-in 函数,您可以在其中提供节点的路径以返回其值。

希望这有助于解决您的问题。

于 2012-12-08T13:28:55.493 回答