数组形式实现
时间复杂度:

  • 合并:O(n)
  • 查询:O(1)

type UnionFindSet struct {
    set []int // 下标代表元素,值代表属于的集合,相同值代表属于同一个集合
}

func NewUnionFindSet(cap int) *UnionFindSet {
    temp := UnionFindSet{
        set: make([]int, cap),
    }

    for i := 0; i < cap; i++ {
        temp.set[i] = i
    }
    return &temp
}

// Union 合并两个set,时间复杂度O(n)
func (u *UnionFindSet) Union(x, y int) {
    xID := u.set[x]
    yID := u.set[y]
    if xID == yID {
        return
    }

    for i := 0; i < len(u.set); i++ {
        if u.set[i] == xID {
            u.set[i] = yID
        }
    }
}

// Find 查看元素属于哪个集合
func (u *UnionFindSet) Find(x int) int {
    return u.set[x]
}

// IsConnected 连通性判断,判断两个元素是否属于同一个集合
func (u *UnionFindSet) IsConnected(x, y int) bool {
    return u.set[x] == u.set[y]
}

SyntaxError
199 声望19 粉丝