16
16
์ด๋ฃจ์ง ๋ชปํ๋ค.
17
17
"""
18
18
19
- """TC: O() , SC: O()
19
+ """TC: O(n * ฮฑ(n)) , SC: O(n )
20
20
21
21
n์ ์ฃผ์ด์ง ๋
ธ๋์ ๊ฐ์, e๋ ์ฃผ์ด์ง ์ฃ์ง์ ๊ฐ์.
22
22
27
27
- find๋ฅผ ํตํด์ 0๋ฒ์งธ ๋
ธ๋์ ๋ชจ๋ ๋
ธ๋๋ค์ด ๊ฐ์ ์งํฉ์ ์ํด์๋์ง ํ์ธํ๋ค.
28
28
- ๋ ์ข์ ๊ตฌํ:
29
29
- union ์ํ ์ค ๊ฐ์ ์งํฉ์ ์ํ ๋ ๋
ธ๋๋ฅผ ํฉ์น๋ ค๊ณ ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ฉด False ๋ฆฌํด
30
+ - union-find๋ [Disjoint-set data structure - Wikipedia](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)
31
+ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ค. ์ฌ๊ธฐ์ time complexity ๊ด๋ จ ์ค๋ช
์ด ์์ธํ๊ฒ ๋์ค๋๋ฐ ๊ถ๊ธํ๋ฉด ์ฐธ๊ณ .
30
32
31
33
SC:
32
- -
34
+ - union-find์์ ์ธ parent ์ ๋ณด๋ง ๊ด๋ฆฌํ๋ค. ๊ฐ ๋
ธ๋๋ง๋ค parent ๋
ธ๋(์ธ๋ฑ์ค), rank๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก O(n).
33
35
34
36
TC:
35
- -
37
+ - union ๊ณผ์ ์ union by rank ์ ์ฉ์ O(ฮฑ(n)) ๋งํผ์ ์๊ฐ์ด ๋ ๋ค. ์ด๋ ฮฑ(n)์ inverse Ackermann function
38
+ ์ผ๋ก, ๋งค์ฐ ๋๋ฆฐ ์๋๋ก ๋์ด๋๋ฏ๋ก ์ฌ์ค์ ์์๋ผ๊ณ ๋ด๋ ๋ฌด๋ฐฉํ๋ค.
39
+ - union ์ํ์ ์ต๋ e๋ฒ ์งํํ๋ฏ๋ก O(e * ฮฑ(n)).
40
+ - e = n-1 ์ด๋ฏ๋ก O(n * ฮฑ(n)).
36
41
"""
37
42
38
43
@@ -48,22 +53,36 @@ def valid_tree(self, n, edges):
48
53
49
54
# union find
50
55
parent = list (range (n ))
56
+ rank = [0 ] * n
51
57
52
- def find (x ) :
58
+ def find (x : int ) -> bool :
53
59
if x == parent [x ]:
54
60
return x
55
61
56
- parent [x ] = find (parent [x ])
62
+ parent [x ] = find (parent [x ]) # path-compression
57
63
return parent [x ]
58
64
59
- def union (a , b ):
65
+ def union (a : int , b : int ) -> bool :
66
+ # ์๋๋ ๊ฐ์ ๋ฆฌํดํ์ง ์์๋ ๋์ง๋ง, ๊ฐ์ ์งํฉ์ ์ํ ๋
ธ๋๋ฅผ
67
+ # unionํ๋ ค๋ ์ํฉ์ ํ๋ณํ๊ธฐ ์ํด ๊ฐ ๋ฆฌํด.
68
+
60
69
pa = find (a )
61
70
pb = find (b )
71
+
72
+ # union by rank
73
+ if pa == pb :
74
+ # parent๊ฐ ๊ฐ์. rank ์์
์ ํด๋ ๋๋ค.
75
+ return True
76
+
77
+ if rank [pa ] < rank [pb ]:
78
+ pa , pb = pb , pa
79
+
62
80
parent [pb ] = pa
63
81
64
- # ์๋๋ ๊ฐ์ ๋ฆฌํดํ์ง ์์๋ ๋์ง๋ง, ๊ฐ์ ์งํฉ์ ์ํ ๋
ธ๋๋ฅผ
65
- # unionํ๋ ค๋ ์ํฉ์ ํ๋ณํ๊ธฐ ์ํด ๊ฐ ๋ฆฌํด.
66
- return pa == pb
82
+ if rank [pa ] == rank [pb ]:
83
+ rank [pa ] += 1
84
+
85
+ return False
67
86
68
87
if len (edges ) != n - 1 :
69
88
# ํธ๋ฆฌ์๋ ์ฃ์ง๊ฐ `(๋
ธ๋ ๊ฐ์) - 1`๊ฐ ๋งํผ ์๋ค.
@@ -84,24 +103,26 @@ def union(a, b):
84
103
for e in edges :
85
104
if union (* e ):
86
105
return False
87
-
106
+
88
107
return True
89
108
90
109
91
- """TC: O(), SC: O()
110
+ """TC: O(n ), SC: O(n )
92
111
93
112
n์ ์ฃผ์ด์ง ๋
ธ๋์ ๊ฐ์, e๋ ์ฃผ์ด์ง ์ฃ์ง์ ๊ฐ์.
94
113
95
114
์์ด๋์ด(์ด์ด์):
96
- - union-find๋ฅผ ์ฐ๋ฉด union์ ์ฌ๋ฌ ๋ฒ ์ํํด์ผ ํ๋๋ฐ ์ด ๊ณผ์ ์์ ์๊ฐ์ ๋ง์ด ์ก์๋จน๋๊ฒ ๊ฐ๋ค.
97
115
- ํธ๋ฆฌ๋ฅผ ์ ์ด๋ค๋์ง ํ์ธํ๋ ค๋ฉด ํ ๋
ธ๋์์ ์์ํด์ dfs๋ฅผ ๋๋ ค์ ๋ชจ๋ ๋
ธ๋๋ค์ ๋๋ฌ ๊ฐ๋ฅํ์ง
98
116
์ฒดํฌํ๋ฉด ๋๋๋ฐ, ์ด๊ฒ ์๊ฐ๋ณต์ก๋์ ๋ ์ ๋ฆฌํ์ง ์์๊น?
99
117
100
118
SC:
101
- -
119
+ - adjacency list๋ฅผ ๊ด๋ฆฌํ๋ค. O(e).
120
+ - ํธ์ถ ์คํ์ ํ์์ ์์ํ๋ ๋
ธ๋๋ก๋ถํฐ ์ฌ์ดํด์ด ๋์ค์ง ์๋ ๊ฒฝ๋ก์ ์ต๋ ๊ธธ์ด๋งํผ ๊น์ด์ง ์ ์๋ค.
121
+ ์ต์
์ ๊ฒฝ์ฐ O(n).
122
+ - ์ด๋ e = n-1 ์ด๋ฏ๋ก ์ข
ํฉํ๋ฉด O(n).
102
123
103
124
TC:
104
- -
125
+ - ๊ฐ ๋
ธ๋์ ์ ๊ทผํ๋ ๊ณผ์ ์ O(1). ์ด๋ฐ ๋
ธ๋๋ฅผ ์ต์
์ ๊ฒฝ์ฐ n๊ฐ ์ ๊ทผํด์ผ ํ๋ฏ๋ก O(n).
105
126
"""
106
127
107
128
0 commit comments