并查集
应用场景
- 照片中的像素
- 网络中的计算机
- 社交网络的朋友
- 等
Code
class UnionFind:
def __init__(self, n):
self.id = [i for i in range(n)]
self.size = [1] * n
def root(self, i):
while i != self.id[i]:
self.id[i] = self.id[self.id[i]]
i = self.id[i]
return i
def connected(self, p, q):
return self.root(p) == self.root(q)
def union(self, p, q):
i = self.root(p)
j = self.root(q)
if i == j:
return
if self.size[i] < self.size[j]:
self.id[i] = j
self.size[j] += self.size[i]
else:
self.id[j] = i
self.size[i] += self.size[j]
说明:
- id保存对应根节点的id
- size保存当前根节点的元素个数
关键点:
- root,查找过程中,更新查找路径上节点的父节点值为祖父节点,达到路径压缩目的,缩短查找路径长度
- union,连接过程中,将元素个数少的树挂载到元素个数多的树上,降低树的整体高度