Algorithm 为什么Clojure zipper实现使用不同于Huet';s拉链?

Algorithm 为什么Clojure zipper实现使用不同于Huet';s拉链?,algorithm,clojure,zipper,Algorithm,Clojure,Zipper,我正在与之比较,并试图弄清楚为什么会做出这些改变。我是Clojure新手,所以如果我对Clojure代码的解释有误,请纠正我 在Huet的论文中,路径的类型是(在Ocaml中)Top |树列表的节点*路径*树列表。在Clojure中,有两个附加字段,pnodes和changed?。这些领域的目的是什么?我认为l和r对应于Huet类型中的第一个和第三个条目,而ppath是第二个条目,对吗 Huet的zipper始终使用链表(注意,我指的是Loc类型本身,而不是zipper正在操作的数据结构),而在

我正在与之比较,并试图弄清楚为什么会做出这些改变。我是Clojure新手,所以如果我对Clojure代码的解释有误,请纠正我

在Huet的论文中,路径的类型是(在Ocaml中)
Top |树列表的节点*路径*树列表。在Clojure中,有两个附加字段,
pnodes
changed?
。这些领域的目的是什么?我认为
l
r
对应于Huet类型中的第一个和第三个条目,而
ppath
是第二个条目,对吗


Huet的zipper始终使用链表(注意,我指的是Loc类型本身,而不是zipper正在操作的数据结构),而在某些地方,例如
l
,Clojure实现使用向量。为什么要更改,以及Clojure实现的时间复杂性意味着什么?

首先,您对
l
r
ppath
的理解是正确的

pnodes
changed?
作为优化一起工作:如果
up
如果
changed?
为false,则从pnodes中弹出节点,而不是从当前节点和左、右同级列表中重建节点

对于
l
的向量和
r
的列表的使用。同样,这是关于重建节点的成本。在Huet的论文中有一个
(rev left)@(t::right)
,它是O(nleft),其中nleft是left的大小。在Clojure中,我们有
(concat l(cons node r))
,它是O(1)[1],因为
l
作为向量不需要反转(Clojure中的向量可以有效地在任何方向上遍历,但只能在右侧追加)

[1] 好的,只有在创建时才是O(1):nleft conses将被延迟分配,因为生成的序列将被进一步的计算消耗