我写了一个程序ocaml的union find
算法。 这个算法我写的是不是最佳的,是最简单的版本。
我把我的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
正确的)?
我应该包括内部的两个阵列或者是有什么更好的办法?
第二,
我使用array
在此代码,但array
是mutable
这是不是好fp
吧?
有没有办法避免使用数组?
最后,
总体而言,是这片码好就够了吗?
什么都可以改善?
PS我没有使用的OCaml的面向对象位呢,因为我还没有学会的那部分。