轻松的树遍历和快速随机节点访问

时间:2011-12-25 11:53:57

标签: data-structures clojure random-access zipper

在Alex Taggart的评论之后编辑。

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

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

实现是使用zipper遍历树并创建由key索引的节点的哈希表。毋庸置疑,上述内容效率非常低:

  • 需要创建每个节点的2个副本
  • 需要在2个数据结构(树和散列映射)之间一致地镜像任何更改。

简而言之,是否有时间/空间有效的方法将遍历/更新的容易性与拉链相结合以及快速访问clojure中的哈希表?

1 个答案:

答案 0 :(得分:2)

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

默认情况下,Clojure的数据结构是不可变的。树状结构中的节点因此不会自行更新,除非您使用某种引用类型(如Var)。我不太了解您的具体用例,以获取有关访问节点的最佳方法的建议。访问嵌套结构中节点的一种方法是get-in function,您可以在其中提供节点返回其值的路径。

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