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