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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta