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 のオブジェクト指向ビットを使用していません。