Completed
Push — master ( 7183e8...ac4041 )
by Xianshun
01:28
created

QuickUnion   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 27
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 27
rs 10
wmc 7

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 3 2
A root() 0 5 2
A union() 0 10 2
A connected() 0 2 1
1
from abc import ABCMeta, abstractmethod
2
3
4
class UnionFind(object):
5
    __metaclass__ = ABCMeta
6
7
    @abstractmethod
8
    def union(self, v, w):
9
        pass
10
11
    @abstractmethod
12
    def connected(self, v, w):
13
        pass
14
15
    @staticmethod
16
    def create(size):
17
        return QuickUnion(size)
18
19
20
class QuickFind(UnionFind):
21
    id = None
22
23
    def __init__(self, capacity):
24
        self.id = [i for i in range(capacity)]
25
26
    def connected(self, v, w):
27
        return self.id[v] == self.id[w]
28
29
    def union(self, v, w):
30
        p = self.id[v]
31
        q = self.id[w]
32
33
        if p != q:
34
            for i in range(len(self.id)):
35
                if self.id[i] == p:
36
                    self.id[i] = q
37
38
39
class QuickUnion(UnionFind):
40
    id = None
41
    sizes = None
42
43
    def __init__(self, capacity):
44
        self.id = [i for i in range(capacity)]
45
        self.sizes = [1] * capacity
46
47
    def root(self, v):
48
        while v != self.id[v]:
49
            self.id[v] = self.id[self.id[v]]  # path compression
50
            v = self.id[v]
51
        return v
52
53
    def connected(self, v, w):
54
        return self.root(v) == self.root(w)
55
56
    def union(self, v, w):
57
        vroot = self.root(v)
58
        wroot = self.root(w)
59
60
        if self.sizes[vroot] > self.sizes[wroot]:
61
            self.id[wroot] = vroot
62
            self.sizes[vroot] += self.sizes[wroot]
63
        else:
64
            self.id[vroot] = wroot
65
            self.sizes[wroot] += self.sizes[vroot]
66