簡體   English   中英

在OCaml中擴展樹?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM