簡體   English   中英

為什么Clojure拉鏈實現使用Huet拉鏈的不同類型和數據結構?

[英]Why does the Clojure zipper implementation use different types and data structures from Huet's zipper?

我正在將Huet的原始論文Clojure的實現進行比較,並試圖找出改變的原因。 我是Clojure的新手,所以如果我對Clojure代碼的解釋錯了,請糾正我。

在Huet的論文中,路徑的類型是(在Ocaml中) Top | Node of tree list * path * tree list;; Top | Node of tree list * path * tree list;; 在Clojure中,有兩個額外的字段, pnodeschanged? 這些領域的目的是什么? 我是否正確地相信lr對應於Huet類型中的第一個和第三個條目,而ppath是第二個?

Huet的拉鏈始終使用鏈接列表(注意我說的是Loc類型本身,而不是拉鏈操作的數據結構),而在某些地方,例如l ,Clojure實現使用向量。 為什么要改變,以及Clojure實現的時間復雜性有何影響?

首先,您對lrppath理解是正確的。

pnodeschanged? 作為優化一起工作:當你up如果changed? 如果為false,則從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將被懶惰分配,因為結果序列被進一步計算消耗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM