package unionfind type UnionFind interface { Find(int, int) bool Union(int, int) } //================================================ type QuickFind struct { Nodes []int } func (qf *QuickFind) Find(x, y int) bool { return qf.Nodes[x] == qf.Nodes[y] } func (qf *QuickFind) Union(x, y int) { tmp := qf.Nodes[x] qf.Nodes[x] = qf.Nodes[y] for i := 0; i < len(qf.Nodes); i++ { if qf.Nodes[i] == tmp { qf.Nodes[i] = qf.Nodes[y] } } } //================================================ type QuickUnion struct { Nodes []int } func (qu *QuickUnion) Find(x, y int) bool { return qu.root(x) == qu.root(y) } func (qu *QuickUnion) Union(x, y int) { rootX := qu.root(x) rootY := qu.root(y) qu.Nodes[rootX] = qu.Nodes[rootY] } func (qu *QuickUnion) root(x int) int { for qu.Nodes[x] != x { x = qu.Nodes[x] } return x } //================================================ type WeightedQuickUnion struct { Nodes []int sizes []int } func (wqu *WeightedQuickUnion) Find(x, y int) bool { return wqu.root(x) == wqu.root(y) } func (wqu *WeightedQuickUnion) Union(x, y int) { rootX := wqu.root(x) rootY := wqu.root(y) if wqu.sizes[rootX] < wqu.sizes[rootY] { wqu.Nodes[rootX] = wqu.Nodes[rootY] wqu.sizes[rootY] += wqu.sizes[rootX] } else { wqu.Nodes[rootY] = wqu.Nodes[rootX] wqu.sizes[rootX] += wqu.sizes[rootY] } } func (wqu *WeightedQuickUnion) root(x int) int { for wqu.Nodes[x] != x { x = wqu.Nodes[x] } return x }
Sunday, August 12, 2012
How to Implement Union Find Algorithms
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment