Segmentlab
实验背景
本实验研究了如何将星型收缩法应用至生成无向图的最小生成树的方法(Bor˚ uvka’s Algorithm),并在此基础上通过Python处理图像
实验细节
1 Bor˚ uvka’s Algorithm
1.1 MST
MST : edge seq * int -> edge seq
函数功能:
生成所给图的最小生成树,并以edge seq 的形式返回
函数思路:
以随机生成的0,1串模拟硬币的正反面,运用Bor˚ uvka’s Algorithm即可,注意修改各点信息的存储形式以使得时间复杂度得以在数据量大的时候能够胜任
函数代码:
type vertex = int
type weight = int
type edge = vertex * vertex * weight
fun cmp (x,y) = Int.compare (x,y)
fun pint n = print ((Int.toString n)^" ")
fun MST (E : edge seq, n : int) : edge seq =
let
fun joinerStarContract (V,E,s) =
let
val minE = filter (fn (_,(a,_,_)) => a>=0) (enum (inject E (tabulate (fn _ => (~1,~1,(~1,~1,~1))) n)))
val coins = Rand.flip s n
val P = filter (fn (u,(v,w,l)) => ((nth coins u) = 0 andalso (nth coins v) = 1) ) minE
val V' = inject (map (fn (u,(v,_,_)) => (u,v)) P) V
in
(V',P)
end
fun MST' ((V,E),S,seed) =
if length E = 0 then S
else
let
val _ = ()
val _ = pint (length E)
val (V',PT) = joinerStarContract (V,E,seed)
val _ = pint (length PT)
val E' = filter (fn (u,(v,w,l)) => u<>v) (map (fn (u,(v,w,l)) => (nth V' u,(nth V' v,w,l))) E)
val S' = map (fn (u,(v,w,l)) => l) PT
val _ = pint (lengt