- 用于解决连通性问题
- union和is_same_set可看作O(1)时间复杂度
class UnionFindSet:
def __init__(self, elements):
self.father = {}
self.rank = {}
for i in elements:
self.father[i] = i
self.rank[i] = 1
def find_head(self, element):
stack = []
while self.father[element] != element:
stack.append(element)
element = self.father[element]
while stack:
tmp = stack.pop()
self.father[tmp] = element
return element
def union(self, element1, element2):
head1 = self.find_head(element1)
head2 = self.find_head(element2)
if head1 == head2:
return
rank1 = self.rank[head1]
rank2 = self.rank[head2]
if rank2 > rank1:
head1, head2 = head2, head1
self.father[head2] = head1
self.rank[head1] += self.rank[head2]
self.rank.pop(head2)
def is_same_set(self, element1, element2):
head1 = self.find_head(element1)
head2 = self.find_head(element2)
if head1 == head2:
return True
else:
return False