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
)的数据结构?
我应该在里面包含两个数组还是有更好的方法?
第二,
我array
在这段代码中使用,但是这array
不是mutable
很好fp
吗?
有没有办法避免使用数组?
最后,
总的来说,这段代码足够好吗?
有什么可以改进的吗?
PS我还没有使用OCaml的面向对象位,因为我还没有学会那部分。