Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 轻松的树遍历和快速随机节点访问_Data Structures_Clojure_Random Access_Zipper - Fatal编程技术网

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

Data structures 轻松的树遍历和快速随机节点访问,data-structures,clojure,random-access,zipper,Data Structures,Clojure,Random Access,Zipper,根据Alex Taggart下面的评论进行编辑 我使用一个拉链来轻松地遍历和编辑一棵可以增长到数千个节点的树。每个节点在首次创建时都是不完整的。数据将一直以随机位置添加/删除,叶节点将被分支替换,等等 树可能非常不平衡。 快速随机访问节点也很重要 一个实现是使用拉链遍历树,并创建一个由键索引的节点的哈希表。不用说,上述方法效率很低,因为: 需要创建每个节点的2个副本 任何更改都需要在两个数据结构(树和hashmap)之间一致地镜像 简言之,是否有一种时间/空间效率高的方法可以将拉链式遍历/更

根据Alex Taggart下面的评论进行编辑

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

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

一个实现是使用拉链遍历树,并创建一个由键索引的节点的哈希表。不用说,上述方法效率很低,因为:

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

简言之,是否有一种时间/空间效率高的方法可以将拉链式遍历/更新的便捷性与clojure中哈希表的快速访问结合起来

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

默认情况下,Clojure的数据结构是不可变的。因此,树状结构中的节点不会自我更新,除非使用某种引用类型(如Var)。我对您的特定用例了解不够,无法就访问节点的最佳方式提供建议。访问嵌套结构中的节点的一种方法是提供节点的路径以返回其值


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

拉链不是数据结构,它是遍历和修改数据结构的一种方式。鉴于此,你的问题不太有意义。此外,“高效”并没有很好的定义。“高效”是指不让同一事物的多个副本占用内存,也不必为每次编辑更新2个数据结构。是的,我知道结构共享和整个不变性。“进去”离我需要做的事情最近。这真是一个愚蠢的问题,因为我使用了错误的工具来做这项工作。只是好奇,你最终使用了什么工具?为什么它更合适呢?问题是在需要细粒度控制的地方重新构造任意大的xml树(在特定位置提取特定属性,并通过在特定条件下按特定属性的值排序来重新构造文档)。使用Zipper进行解析/提取有点过火。使用XPath/XSLT更合适,性能也可以接受。很高兴我在这些方面投入了时间。