leetcode--并查集模板总结(python3)

问题介绍:
并查集一般用来解决连通性方面的问题,最典型的比如图的连通性,与邻接表配合最佳
连通这个概念抽象出来的特点是:

1、自反性: a=a
2、对称性: a=b, b=a
3、传递性: a=b, b=c, a=c

可以看出来等于号则拥有连通性这样的性质,所以这题读完等式方程的可满足性,我立马就回忆起了并查集(虽然很久没用过了),借此机会总结一下。

模板:

class UF():
    def __init__(self, n):
        self.count = n
        self._parent = [0] * n
        self._weight = [0] * n

        for i in range(n):
            self._parent[i] = i
            self._weight[i] = 1

    def connect(self, p, q):
        rootP = self.find(p)
        rootQ = self.find(q)
        if rootP == rootQ:
            return
        # 轻根到重根,为了平衡
        if self._weight[rootP] > self._weight[rootQ]:
            self._parent[rootQ] = rootP
            self._weight[rootP] += self._weight[rootQ]
        else:
            self._parent[rootP] = rootQ
            self._weight[rootQ] += self._weight[rootP]
        self.count -= 1

    def is_connected(self, p, q):
        return self.find(p) == self.find(q)

    def find(self, x):
        while self._parent[x] != x:
            # 路径压缩
            self._parent[x] = self._parent[self._parent[x]]
            x = self._parent[x]
        return x

    def get_count(self):
        return self.count

思考:
1、self._weight 的作用是什么?
--find方法的复杂度为O(logn)但是,如果树的合并不合理会退化成O(n),所以往大树上挂小树能够使树相对平衡。
2、self._parent[x] = self._parent[self._parent[x]] 的意义?
这样在find的过程中就能够优化查找路径,由于自反性也不用考虑越界相关的问题。

文献参考:
感谢东哥的总结
https://labuladong.gitbook.io/algo/gao-pin-mian-shi-xi-lie/unionfind-suan-fa-xiang-jie

你可能感兴趣的:(leetcode--并查集模板总结(python3))