【问题标题】:Why does the Clojure zipper implementation use different types and data structures from Huet's zipper?为什么 Clojure 拉链实现使用与 Huet 的拉链不同的类型和数据结构?
【发布时间】:2015-09-02 21:58:17
【问题描述】:

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

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

Huet 的 zipper 始终使用链表(注意我说的是 Loc 类型本身,而不是 zipper 运行的数据结构),而在某些地方,例如 l,Clojure 实现使用向量。为什么要更改,对 Clojure 实现的时间复杂度有何影响?

【问题讨论】:

    标签: algorithm clojure zipper


    【解决方案1】:

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

    pnodeschanged? 作为优化一起工作:当你去up 如果changed? 是假的那么你从 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 将被延迟分配,因为结果序列被进一步计算消耗。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2023-03-17
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多