banner
NEWS LETTER

Python并查集三种

Scroll down

纯面向过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def find(lst: list, idx: int):
if lst[idx] == idx:
return idx
lst[idx] = find(lst, lst[idx])
return lst[idx]


def test(lst: list, a: int, b: int):
a_leader = find(lst, a)
b_leader = find(lst, b)
if a_leader == b_leader:
return True
return False


def merge(lst: list, a: int, b: int):
a_leader = find(lst, a)
b_leader = find(lst, b)
if a_leader != b_leader:
lst[a_leader] = b_leader

lst = [i for i in range(n + 1)]

半oop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Disjoin:
def __init__(self):
self.mapping = dict()

def find(self, idx: int):
if idx not in self.mapping:
self.mapping[idx] = idx

if self.mapping[idx] == idx:
return idx

self.mapping[idx] = self.find(self.mapping[idx])
return self.mapping[idx]

def test(self, a: int, b: int):
a_leader = self.find(a)
b_leader = self.find(b)
if a_leader == b_leader:
return True
return False

def merge(self, a: int, b: int):
a_leader = self.find(a)
b_leader = self.find(b)
if a_leader != b_leader:
self.mapping[a_leader] = b_leader

纯oop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Disjoin:
def __init__(self, id_):
self.id = id_
self.leader = self

def find(self):
if self.leader == self:
return self
node = self
node = node.leader.find()
self.leader = node
return node

def test(self, b: "Disjoin"):
a_leader = self.find()
b_leader = b.find()
if a_leader == b_leader:
return True
return False

def merge(self, b: "Disjoin"):
a_leader = self.find()
b_leader = b.find()
if a_leader != b_leader:
a_leader.leader = b
其他文章
目录导航 置顶
  1. 1. 纯面向过程
  2. 2. 半oop
  3. 3. 纯oop