[英]Extending a tree in 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);;
type 'a mlist = Empty | Cons of 'a * (('a mlist) ref);; type tree = Nil | Node of position * ((tree mlist) ref);;
但这似乎非常不雅致,尤其是因为根据编码方式,我基本上从不使用Empty或Nil。
OCaml中的列表类型是不可变的,因此您无法通过这种方式真正做到:将其添加到尾部并不容易。
您拥有的可能性是:
如果要继续使用纯函数,请执行以下操作:设置二叉树类型type 'a tree = Nil | F of 'a | Node of 'a tree * position * 'a tree;;
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会演化,并且会根据增长参数而变大。 您将必须找到正确的参数,以便表不会有太多无用的空间,但又不会经常增加。 :)
希望这对你有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.