Unionfind simple no óptimo en OCaml
Escribí un programa OCaml paraunion find
algoritmo. Este algoritmo que escribí no es óptimo y es la versión más simple.
Pongo mi código OCaml aquí porque no estoy seguro de si este código es lo suficientemente bueno o no(a pesar del propio algoritmo), aunque este código puede ejecutarse sin errores.
Esta es la primera vez que escribí un trabajo completo después de que empecé a aprender OCaml, así que por favor, ayúdame revisándolo.
Sugerencias útiles me ayudarán a mejorar mis habilidades de OCaml. Gracias
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);;
Ante todo,
¿Estoy creando la estructura de datos deunion
(como enunion find
) correctamente?
¿Debo incluir dos matrices dentro o hay alguna forma mejor?
Segundo,
estoy usandoarray
en este código, peroarray
esmutable
que no es tan bueno parafp
¿Correcto?
¿Hay una manera de evitar el uso de matriz?
Finalmente,
En general, ¿es este pedazo de código lo suficientemente bueno?
¿Se puede mejorar algo?
PD No estoy usando el bit orientado a objetos de OCaml todavía, ya que no he aprendido en esa parte.