并查集

  1. 用于解决连通性问题
  2. 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

 

posted @ 2021-01-07 11:16  zhangfanyi  阅读(42)  评论(0)    收藏  举报