我試圖派生描述結構化值的Graphviz文件。這是爲了診斷目的,所以我希望我的圖儘可能地反映內存中的實際結構。我使用的是下面值映射到Graphviz的頂點,所以我可以重用頂點時的值有兩個或兩個以上的入站參考:基於物理標識的替代Hashtbl.hash
let same = (==)
module StateIdentity : Hashtbl.HashedType = struct
type t = R.meta_t state
let hash = Hashtbl.hash
let equal = same
end
module StateHashtbl = Hashtbl.Make (StateIdentity)
爲Hashtbl.hash
的文件表明,它是適合使用的時候都StateIdentity.equal = (=)
當StateIdentity.equal = (==)
,但我想確保哈希表訪問儘可能接近O(1),所以不希望Hashtbl.hash
在每次查找中走過一個(在這種情況下可能很大)對象圖。
我知道ocaml的來回移動時的參考,但有一個O(1)代理參考身份提供ocaml的?
答案Hashtable of mutable variable in Ocaml表明沒有。
我厭惡的序列號附加到狀態,因爲這是診斷代碼,所以我讓做的任何錯誤都掩蓋其他錯誤的可能性。
「Hashtbl.hash的文檔表明,當StateIdentity.equal =(=)和StateIdentity.equal =(==)時它們都適用。」雖然不是這樣。當與物理平等相關聯時,「Hashtbl.hash」有很多衝突,意思是你使用它,你的散列表可能會退化成一系列結構相同,物理上不同的密鑰的長列表。 –
@PascalCuoq,很對。 「合適的」我的意思是「保持替換和找到不變」,並不是指保持查找關鍵比較的數量不變。 –