Prosty nieoptymalny unionfind w OCaml

Napisałem program OCaml dlaunion find algorytm. Ten algorytm, który napisałem, nie jest optymalny i jest najprostszą wersją.

Umieściłem tutaj kod OCaml, ponieważ nie jestem pewien, czy ten kod jest wystarczająco dobry, czy nie(pomimo samego algorytmu), chociaż ten kod może działać bez błędów.

Po raz pierwszy napisałem kompletną pracę po tym, jak zacząłem uczyć się OCamla, więc proszę mi pomóc, przeglądając go.

Przydatne sugestie pomogą mi poprawić moje umiejętności OCaml. Dzięki

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);;

Po pierwsze,

Czy tworzę strukturę danychunion (jak wunion find) poprawnie?

Czy powinienem uwzględnić dwie tablice w środku, czy może jest lepszy sposób?

Druga,

ja używamarray w tym kodzie, alearray jestmutable co nie jest dobrefp dobrze?

Czy istnieje sposób na uniknięcie używania tablicy?

Wreszcie,

Czy ten fragment kodu jest wystarczająco dobry?

Wszystko można poprawić?

P.S. Nie używam jeszcze bitów obiektowych OCaml, ponieważ nie nauczyłem się tej części.

questionAnswers(2)

yourAnswerToTheQuestion