[英]Ocaml - building binary trees
我正在閱讀Jason Hickey的OCaml教程,簡而言之就是建議樹的建議方法:
type 'a elem = Empty | Node of 'a * 'a elem * 'a elem;;
let rec insert x = function
| Empty -> Node (x, Empty, Empty)
| Node (y, left, right) as node ->
if x < y then
Node (y, insert x left, right)
else if x > y then
Node (y, left, insert x right)
else
node;;
我是否正確理解這種方法是否會復制樹中插入新元素的部分,並將舊樹的一部分附加到此新副本中?
如果是這樣,我的評估是每次插入只創建O(height(tree))
節點嗎?
這(對我來說有點不尋常)方法是否依賴於以下事實:如果逐個插入多個值,那么GC的所有舊節點副本都將被有效刪除?
我是否正確理解這種方法是否會復制樹中插入新元素的部分,並將舊樹的一部分附加到此新副本中?
如果是這樣,我的評估是每次插入只創建O(高度(樹))節點嗎?
是。 如果你正確平衡樹(例如紅黑樹),那么這意味着插入是O(log(n))。
這(對我來說有點不尋常)方法是否依賴於以下事實:如果逐個插入多個值,那么GC的所有舊節點副本都將被有效刪除?
是。 函數式編程語言通常會產生大量短期垃圾,例如元組,閉包和小數據類型值。 但是實現被優化以使其非常便宜(例如,通過輕量級堆表示,指針碰撞分配和分代收集)。
另請注意,此方法有一個基本優勢:功能數據結構是自動持久的 ,即舊版本保持有效,並且可以同時使用多個版本的數據結構。 使用命令式數據結構,當您需要“恢復”舊版本時,您有兩個選項:(1)預先復制整個結構,或(2)維護更改日志並向后運行。 這兩種選擇通常比使用功能結構更昂貴,其中持久性是免費的。
有關復雜性,攤銷成本和各種功能數據結構的各種其他方面的詳細討論,請參閱Chris Okasaki關於純功能數據結構的優秀書籍。 (他的論文涵蓋了大部分相同的內容,並且是免費提供的。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.