我爲union find
算法編寫了OCaml程序。我寫的這個算法不是最優的,也是最簡單的版本。OCaml中的簡單非最佳unionfind
我把我的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
好?
有沒有辦法避免使用數組?
最後,
總體而言,這是一段代碼不夠好?
什麼都可以改進?
P.S.我沒有使用OCaml的面向對象的一點,因爲我還沒有學到這一點。
我認爲http://codereview.stackexchange.com/會更適合這類問題。 – jrouquie
啊,對不起,不知道那個網站。 –
有太多的stackexchange網站,沒有人應該被期望成爲這個網站的臨時用戶,並保持跟蹤,或有任何願意註冊每一個(雖然儘可能微不足道)。他在這個網站上有很多問題,我不會擔心太多的傑克遜。 – nlucaroni