【发布时间】:2012-03-06 05:03:52
【问题描述】:
如何在 OCaml 中定义一棵树 + 指向其子树的指针,以便在该子树中添加叶子需要恒定时间?
【问题讨论】:
-
在 OCaml 的纯子集中,数据是不可变的。所以你不能给树添加叶子。你只能制作一棵与老树相似但有额外叶子的新树。如果您使用 OCaml 的不纯结构,则该解决方案看起来与任何命令式语言几乎一样。您能展示一下到目前为止您尝试过的代码吗?
-
在 OCaml 的不纯子集中,数据是可变的。你可以改变记录、字符串、记录,所以你正在寻找的东西在 OCaml 中确实是可能的,而不是在纯语言中。
-
@Jeffrey:我所做的只是通过沿着路径添加叶子,所以就像
type tree = Empty | Node of 'a * tree list let rec add a path = function | Empty -> Node (a, []) | Node(s, c) -> if (empty path) then Node(s, Node(a, [])::c) else Node(s, List.map (fun x -> if (greater_than path (path_to x)) then add a (substract path (path_to x)) else x) c)但是,我使用的路径将在下一步构建树,所以有一个指针会很方便。也许我会在这里尝试一些建议,拉链或可变记录。 -
平衡树有帮助吗?如果节点被添加到所有地方并且上下文必须在整个树中移动,则拉链不会有很大的复杂性。
-
不,我不能使用平衡树,我需要保留树的结构。但是是的,我可以使用拉链。我想知道在一般情况下如何扩展它,因为每个节点可能有不同数量的后继者,我使用列表来表示子集
标签: list pointers tree constants ocaml