Простой неоптимальный unionfind в OCaml
Я написал программу OCaml дляunion find
алгоритм. Этот алгоритм, который я написал, не является оптимальным и является самой простой версией.
Я поместил свой код OCaml здесь, потому что я не уверен, достаточно ли этот код хорош(несмотря на сам алгоритм), хотя этот код может работать без ошибок.
Впервые я написал полный рабочий материал после того, как начал изучать OCaml, поэтому, пожалуйста, помогите мне, ознакомившись с ним.
Полезные предложения помогут мне улучшить свои навыки OCaml. Спасибо
type union_find = {id_ary : int array; sz_ary : int array};;
let create_union n = {id_ary = Array.init n (fun i -> i);
sz_ary = Array.init n (fun i -> 1)};;
let union u p q =
let rec unionfy id_ary i =
let vp = id_ary.(p) in
let vq = id_ary.(q) in
if i < Array.length id_ary then begin
if i != q && id_ary.(i) = vp then id_ary.(i) <- vq;
unionfy id_ary (i + 1)
end
else print_string "end of union\n"
in
unionfy u.id_ary 0;;
let is_connected u p q = u.id_ary.(p) = u.id_ary.(q);;
Прежде всего,
Я создаю структуру данныхunion
(как вunion find
) правильно?
Должен ли я включить два массива внутри или есть какой-нибудь лучший способ?
Во-вторых,
Я используюarray
в этом коде, ноarray
являетсяmutable
что не так хорошо дляfp
правильно?
Есть ли способ избежать использования массива?
В заключение,
В целом, достаточно ли этот кусок кода?
Что-нибудь может быть улучшено?
Постскриптум Я пока не использую объектно-ориентированный бит OCaml, так как не научился этому.