У меня есть следующий код:Как создать график с циклами без изменяемых данных?
module MakeLink (Key : Map.OrderedType) = struct
module Links = Map.Make (Key)
type 'a t =
{ links : 'a t Links.t;
value : 'a
}
type key_t = Key.t
let make value =
{ links = Links.empty;
value
}
let link linker ~to':linkable ~by:key =
{ linker with links =
Links.add key linkable linker.links
}
(* some functions for reading here *)
end
Как создать две ссылки, связанные друг с другом? Я пробовал:
let join a ~with':b ~by:key =
let rec a' = link a ~to':b' ~by:key
and b' = link b ~to':a' ~by:(Key.opposite key) in
a'
But it's looking like a hen that hatched from their own egg. И мой вопрос: Как создать граф с циклами (например: двусвязный список) без изменяемых данных с использованием (в OCaml или другом языке)?
Вы можете устранить проблему, перемещая ссылки в отдельной структуре данных (обычно это матрица, которая может быть или не изменяться, хотя первая будет работать лучше), а затем использовать карту (или просто массив, если ids - целые числа) от идентификаторов узлов до данных узла. Другим преимуществом разделения данных является то, что вы можете легко адаптировать существующие алгоритмы и применять их на своих графиках. Использование массивов приведет к лучшему использованию локализации кеша. – didierc