(********************************************************************) (* OCaml code from the book ``Learn Programming with OCaml'' *) (* See https://usr.lmf.cnrs.fr/lpo/ *) (* *) (* Sylvain Conchon and Jean-Christophe Filliâtre *) (* Copyright 2025 Université Paris-Saclay and CNRS *) (* *) (* Openly licensed via CC BY SA 4.0 *) (* See https://creativecommons.org/licenses/by-sa/4.0/deed.en *) (********************************************************************) (* Program 72 on page 316 Union-find Data Structure *) type t = { rank: int array; link: int array; } let create n = { rank = Array.make n 0; link = Array.init n (fun i -> i) } let rec find t i = let p = t.link.(i) in if p = i then i else begin let r = find t p in t.link.(i) <- r; r end let union t i j = let ri = find t i in let rj = find t j in if ri <> rj then begin if t.rank.(ri) < t.rank.(rj) then t.link.(ri) <- rj else begin t.link.(rj) <- ri; if t.rank.(ri) = t.rank.(rj) then t.rank.(ri) <- t.rank.(ri) + 1 end end
This document was generated using caml2html