为什么Clojure拉链实现使用Huet拉链的不同类型和数据结构?

时间:2015-09-02 21:58:18

标签: algorithm clojure zipper

我将Huet's original paperClojure's implementation进行比较,并试图找出更改的原因。我是Clojure的新手,所以如果我对Clojure代码的解释错了,请纠正我。

在Huet的论文中,路径的类型是(在Ocaml中)Top | Node of tree list * path * tree list;;。在Clojure中,还有两个字段pnodeschanged?。这些领域的目的是什么?我是否相信lr对应于Huet类型中的第一个和第三个条目,ppath是第二个?

Huet的拉链始终使用链接列表(注意我在谈论Loc类型本身,而不是拉链操作的数据结构),而在某些地方,例如l, Clojure实现使用向量。为什么要改变,以及对Clojure实施的时间复杂性有何影响?

1 个答案:

答案 0 :(得分:5)

首先,您对lrppath的理解是正确的。

pnodeschanged?作为优化协同工作:当up changed?为假时,您将从pnodes中弹出节点而不是从当前重建节点节点和左右兄弟列表。

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

[1]确定它的O(1)仅在创建时:nleft conses将被懒惰地分配,因为结果序列被进一步计算消耗。