我将Huet's original paper与Clojure's implementation进行比较,并试图找出更改的原因。我是Clojure的新手,所以如果我对Clojure代码的解释错了,请纠正我。
在Huet的论文中,路径的类型是(在Ocaml中)Top | Node of tree list * path * tree list;;
。在Clojure中,还有两个字段pnodes
和changed?
。这些领域的目的是什么?我是否相信l
和r
对应于Huet类型中的第一个和第三个条目,ppath
是第二个?
Huet的拉链始终使用链接列表(注意我在谈论Loc类型本身,而不是拉链操作的数据结构),而在某些地方,例如l
, Clojure实现使用向量。为什么要改变,以及对Clojure实施的时间复杂性有何影响?
答案 0 :(得分:5)
首先,您对l
,r
和ppath
的理解是正确的。
pnodes
和changed?
作为优化协同工作:当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将被懒惰地分配,因为结果序列被进一步计算消耗。