簡體   English   中英

Ocaml - 構建二叉樹

[英]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.

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