Tree Ocaml-构建二叉树

Tree Ocaml-构建二叉树,tree,functional-programming,ocaml,Tree,Functional Programming,Ocaml,我正在阅读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

我正在阅读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;;
键入'a elem=Empty |'a*'a elem*'a elem;的节点;;
让rec插入x=函数
|空->节点(x,空,空)
|节点(y、左、右)作为节点->
如果xy那么
节点(y,左侧,插入x右侧)
其他的
节点;;
我是否正确地理解了这种方法会创建树中插入新元素的部分的副本,并将旧树的一部分附加到此新副本

如果是这样,我的评估是不是每次插入都只创建
O(高度(树))
节点

这种(对我来说有点不寻常)方法是否依赖于这样一个事实:如果逐个插入多个值,GC将有效地删除节点组的所有旧副本

我是否正确地理解了这种方法会创建树中插入新元素的部分的副本,并将旧树的一部分附加到此新副本

如果是这样,我的评估是不是每次插入都只创建O(高度(树))节点

对。如果正确平衡树(例如红黑树),则表示插入为O(log(n))

这种(对我来说有点不寻常)方法是否依赖于这样一个事实:如果逐个插入多个值,GC将有效地删除节点组的所有旧副本

对。函数式编程语言通常会产生大量短期垃圾,例如元组、闭包和小数据类型值。但实现经过了优化,使其非常便宜(例如,通过轻量级堆表示、指针凹凸分配和分代收集)

还请注意,这种方法有一个基本优势:功能数据结构自动持久化,即旧版本保持有效,并且可以同时使用数据结构的多个版本。对于命令式数据结构,当您需要“恢复”旧版本时,有两种选择:(1)预先复制整个结构,或(2)维护更改日志并向后运行。这两个选项通常都比使用免费持久性的功能结构更昂贵

有关各种功能数据结构的复杂性、摊销成本和各种其他方面的详细讨论,请参见Chris Okasaki的优秀著作。(His涵盖了大部分相同的内容,可免费获取。)