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