Annotation of researchv10no/cmd/sml/doc/examples/union-find.sml, revision 1.1

1.1     ! root        1: (* Union-find algorithm *)
        !             2: 
        !             3: datatype 'a setelem 
        !             4:   = NILSET
        !             5:   | ELEM of 'a * 'a setelem ref * int ref
        !             6: 
        !             7: exception SETINFO
        !             8: 
        !             9: fun new_setelem x = ELEM(x, ref nilset, ref 1)
        !            10: 
        !            11: fun set_union(NILSET, f) = f
        !            12:   | set_union(e, NILSET) = e
        !            13:   | set_union(e as ELEM(_,e_next,e_size), f as ELEM(_,f_next,f_size)) =
        !            14:       if !e_size < !f_size
        !            15:       then (f_size := !e_size + !f_size; e_next := f)
        !            16:       else (e_size := !e_size + !f_size; f_next := e)
        !            17: 
        !            18: fun find NILSET = NILSET
        !            19:   | find (e as ELEM(_,ref NILSET,_)) = e
        !            20:   | find (ELEM(_,f,_)) = let g = find !f in (f := g; g) end
        !            21: 
        !            22: fun setinfo NILSET = raise SETINFO
        !            23:   | setinfo e = let ELEM(x,_,_) = find e in x end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.