在OCaml中扩展树?

时间:2014-04-13 13:18:21

标签: tree ocaml

我想在OCaml中表示游戏树。当前位置是根,根的子代表一次移动后的一些结果位置,依此类推。我想动态扩展这个游戏树(逐个添加新的可能移动)。

我有一个"位置"类型。我想是天真的方式:

type tree = Nil | Node of position * (tree list);;

但这不允许我通过添加新动作来增加我的树,因为列表不可变。我也考虑过:

type tree = Nil | Node of position * ((tree list) ref);;

但是每次我想扩展一个节点时,我都必须替换整个子树列表,这会导致我认为有很多无用的空间?所以我能想到的唯一方法如下: type 'a mlist = Empty | Cons of 'a * (('a mlist) ref);; type tree = Nil | Node of position * ((tree mlist) ref);;

但它似乎非常不优雅,特别是因为我基本上不会使用Empty或Nil,这取决于我编码的方式。

2 个答案:

答案 0 :(得分:0)

OCaml中的列表类型是不可变的,所以你不能真正这样做:添加到它的尾部并不是一件容易的事。

你有的可能性是:

  • 通过递归从底部构建树 - 计算值并首先构建树的叶子,然后继续到根。这意味着你必须知道你想要走多远,这可能不是一个选择,但这个解决方案是纯粹的功能,或
  • 使用一些可变的表示,例如阵列。这不是纯粹的功能,但如果你需要实现可变性,这是一个选择。

答案 1 :(得分:0)

如果您想继续使用纯功能: 制作二叉树类型 type 'a tree = Nil | F of 'a | Node of 'a tree * position * 'a tree;;

该类型本身仍然是静态的,但如果您创建函数以便它们返回一个新树,您只需拥有一个更新函数,它将使您的树保持最新。您将有更多时间添加和查找元素。这里的优点是通过使用二叉树,您可以更快地找到元素。

否则,您将不得不使用哈希表http://caml.inria.fr/pub/docs/manual-ocaml/libref/Hashtbl.html。它们是某种动态数组。您有基本大小和增长参数。只要你保持当前数组的大小没有任何发生,但是当你添加的元素超过当前大小所支持的元素时,hastable会根据增长参数逐渐发展并变大。你必须找到正确的参数,这样你的表不会有太多无用的空间,但不会经常增长。 :)

希望它是完整的帮助

相关问题