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