Einfaches nicht optimales Unionfind in OCaml

Ich habe ein OCaml-Programm für geschriebenunion find Algorithmus. Dieser von mir geschriebene Algorithmus ist nicht optimal und die einfachste Version.

Ich habe meinen OCaml-Code hier eingetragen, weil ich nicht sicher bin, ob dieser Code gut genug ist oder nicht(trotz des Algorithmus selbst), obwohl dieser Code ohne Fehler ausgeführt werden kann.

Dies ist das erste Mal, dass ich eine vollständige Arbeitssache geschrieben habe, nachdem ich angefangen habe, OCaml zu lernen. Bitte helfen Sie mir, indem Sie es durchlesen.

Nützliche Vorschläge helfen mir, meine OCaml-Kenntnisse zu verbessern. Vielen Dank

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

Zuerst,

Schaffe ich die Datenstruktur vonunion (wie inunion find) richtig?

Sollte ich zwei Arrays einbinden oder gibt es einen besseren Weg?

Zweite,

ich benutzearray in diesem Code, aberarray istmutable das ist nicht so gut fürfp Recht?

Gibt es eine Möglichkeit, Array zu vermeiden?

Endlich,

Ist dieser Code insgesamt gut genug?

Kann etwas verbessert werden?

P.S. Ich verwende noch kein objektorientiertes OCaml-Bit, da ich diesen Teil noch nicht gelernt habe.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage