Próbuję wyprowadzić plik Graphviz opisujący strukturę wartości. Ma to na celu diagnostykę, dlatego chcę, aby mój wykres odzwierciedlał rzeczywistą strukturę w pamięci tak ściśle, jak to możliwe. Używam poniżej mapowanie wartości wierzchołków Graphviz tak, że mogę ponownie użyć wierzchołek gdy wartość ma dwie lub więcej odniesień przychodzących:Algorytmy oparte na tożsamości fizycznej do 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)
Dokumentacja Hashtbl.hash
sugeruje, że nadaje się do zastosowania zarówno przy StateIdentity.equal = (=)
i kiedy StateIdentity.equal = (==)
, ale chciałbym, aby dostęp do tablicy hash był możliwie jak najbliżej O (1), wolałbym nie przepuszczać wykresu obiektów (potencjalnie dużego w tym przypadku) podczas każdego wyszukiwania.
Wiem, że Ocaml przenosi referencje dookoła, ale czy istnieje O (1) proxy dla tożsamości referencyjnej dostępnej w Ocaml?
Odpowiedź na Hashtable of mutable variable in Ocaml sugeruje, że nie.
Nie lubię dołączać numerów seryjnych do stanów, ponieważ jest to kod diagnostyczny, więc wszelkie błędy, które robię, mogą maskować inne błędy.
"Dokumentacja dla Hashtbl.hash sugeruje, że jest odpowiednia do użycia zarówno gdy StateIdentity.equal = (=), jak i gdy StateIdentity.equal = (==)" Nie jest to jednak możliwe. 'Hashtbl.hash' ma wiele kolizji w połączeniu z fizyczną równością, co oznacza, że gdybyś użył go, twój hashtable mógłby przerodzić się w krótką listę długich list strukturalnie równych, fizycznie różnych kluczy. –
@PascalCuoq, Całkiem dobrze. Przez "odpowiedni" rozumiałem "utrzymuje zastępowanie i znajdowanie niezmienników" i nie odnosiło się do utrzymywania stałej liczby stałych porównań kluczowych. –