Algorithm 为什么Clojure zipper实现使用不同于Huet';s拉链?
我正在与之比较,并试图弄清楚为什么会做出这些改变。我是Clojure新手,所以如果我对Clojure代码的解释有误,请纠正我 在Huet的论文中,路径的类型是(在Ocaml中)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正在操作的数据结构),而在
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将被延迟分配,因为生成的序列将被进一步的计算消耗