Tree 在OCaml中扩展树?

Tree 在OCaml中扩展树?,tree,ocaml,Tree,Ocaml,我想用OCaml表示游戏树。当前位置是根,根的子项表示一次移动后产生的一些位置,依此类推。我想动态地扩展这个游戏树(一个接一个地添加新的可能动作) 我有一个“职位”类型。我认为最天真的方式是: type tree=Nil |位置节点*(树列表) 但这不允许我通过添加新的移动来增加我的树,因为列表是不可变的。我还考虑过: type tree=Nil |位置节点*((树列表)ref) 但是每次我想要扩展一个节点时,我都必须替换整个子树列表,我想这会导致大量无用的空间?因此,我能想到的唯一办法是:

我想用OCaml表示游戏树。当前位置是根,根的子项表示一次移动后产生的一些位置,依此类推。我想动态地扩展这个游戏树(一个接一个地添加新的可能动作)

我有一个“职位”类型。我认为最天真的方式是:

type tree=Nil |位置节点*(树列表)

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

type tree=Nil |位置节点*((树列表)ref)

但是每次我想要扩展一个节点时,我都必须替换整个子树列表,我想这会导致大量无用的空间?因此,我能想到的唯一办法是:

输入'a mlist=Empty | a*('a mlist)ref)的Cons;;
类型tree=Nil |位置节点*((tree mlist)ref)


但它看起来非常不雅观,特别是因为我基本上永远不能使用空或Nil,这取决于我是如何编码叶子的。

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

您拥有的可能性是:

  • 通过递归从底部构建树-计算值,首先构建树的叶子,然后继续到根。这意味着您必须知道您想深入到什么程度,这在这里可能不是一个选项,但这个解决方案是纯功能的,或者
  • 使用一些可变表示法,例如数组。这不是纯粹的功能,而是一种选择,如果您需要实现可变性的话

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

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

否则,您将不得不使用哈希表。它们是某种动态数组。你有一个基本尺寸和一个增长参数。只要保持当前数组的大小,就不会发生任何事情,但是当您添加的元素超过当前大小所支持的元素数时,hastable会根据growth参数的不同而变化并变大。您必须找到正确的参数,这样您的表就不会有太多无用的空间,但不会增长到经常使用的空间。:)


希望它能帮上大忙

我正在动态扩展树(根据到目前为止构建的树选择加深或加厚的位置),所以第一项是不可能的。至于第二个,我看不出数组对我有什么帮助:我不知道一个节点最终会有多少子节点,所以我无法选择数组的大小。这个游戏是arimaa,其中一个位置上legjal移动的数量大约是一万,所以我不想为每个节点创建巨大的数组,包括那些我只会尝试,比如说,十个移动的数组。tree list ref对我来说看起来完全正常。只要在列表的最前面添加新的树,您就不会担心空间问题。我认为拉链在这里会很好地工作。如果他们同意的话,也许其他人可以扩展它。哦,谢谢nlucaroni,我只读过关于二叉树拉链的书,没有意识到原来的Huet纸正是我需要的!