union findアルゴリズム用の OCaml プログラムを作成しました。私が書いたこのアルゴリズムは最適ではなく、最も単純なバージョンです。
OCaml コードをここに置いたのは、(アルゴリズム自体にもかかわらず)このコードが十分かどうかわからないからです。ただし、このコードはエラーなしで実行できます。
OCamlを学び始めてから、完全に動作するものを書いたのはこれが初めてなので、レビューして助けてください。
役立つ提案は、OCaml のスキルを向上させるのに役立ちます。ありがとう
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);;
初めに、
union(のように)のデータ構造をunion find正しく作成していますか?
内部に2つの配列を含める必要がありますか、それとももっと良い方法がありますか?
2番、
arrayこのコードで使用していますarrayが、どちらが適切mutableではないfpでしょうか?
配列の使用を避ける方法はありますか?
ついに、
全体として、このコードは十分でしょうか?
何か改善できますか?
PS 私はまだ OCaml のオブジェクト指向ビットを使用していません。