1616 ์ด๋ฃจ์ง ๋ชปํ๋ค.
1717"""
1818
19- """TC: O() , SC: O()
19+ """TC: O(n * ฮฑ(n)) , SC: O(n )
2020
2121n์ ์ฃผ์ด์ง ๋
ธ๋์ ๊ฐ์, e๋ ์ฃผ์ด์ง ์ฃ์ง์ ๊ฐ์.
2222
2727 - find๋ฅผ ํตํด์ 0๋ฒ์งธ ๋
ธ๋์ ๋ชจ๋ ๋
ธ๋๋ค์ด ๊ฐ์ ์งํฉ์ ์ํด์๋์ง ํ์ธํ๋ค.
2828 - ๋ ์ข์ ๊ตฌํ:
2929 - union ์ํ ์ค ๊ฐ์ ์งํฉ์ ์ํ ๋ ๋
ธ๋๋ฅผ ํฉ์น๋ ค๊ณ ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ฉด False ๋ฆฌํด
30+ - union-find๋ [Disjoint-set data structure - Wikipedia](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)
31+ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ค. ์ฌ๊ธฐ์ time complexity ๊ด๋ จ ์ค๋ช
์ด ์์ธํ๊ฒ ๋์ค๋๋ฐ ๊ถ๊ธํ๋ฉด ์ฐธ๊ณ .
3032
3133SC:
32- -
34+ - union-find์์ ์ธ parent ์ ๋ณด๋ง ๊ด๋ฆฌํ๋ค. ๊ฐ ๋
ธ๋๋ง๋ค parent ๋
ธ๋(์ธ๋ฑ์ค), rank๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก O(n).
3335
3436TC:
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)).
3641"""
3742
3843
@@ -48,22 +53,36 @@ def valid_tree(self, n, edges):
4853
4954 # union find
5055 parent = list (range (n ))
56+ rank = [0 ] * n
5157
52- def find (x ) :
58+ def find (x : int ) -> bool :
5359 if x == parent [x ]:
5460 return x
5561
56- parent [x ] = find (parent [x ])
62+ parent [x ] = find (parent [x ]) # path-compression
5763 return parent [x ]
5864
59- def union (a , b ):
65+ def union (a : int , b : int ) -> bool :
66+ # ์๋๋ ๊ฐ์ ๋ฆฌํดํ์ง ์์๋ ๋์ง๋ง, ๊ฐ์ ์งํฉ์ ์ํ ๋
ธ๋๋ฅผ
67+ # unionํ๋ ค๋ ์ํฉ์ ํ๋ณํ๊ธฐ ์ํด ๊ฐ ๋ฆฌํด.
68+
6069 pa = find (a )
6170 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+
6280 parent [pb ] = pa
6381
64- # ์๋๋ ๊ฐ์ ๋ฆฌํดํ์ง ์์๋ ๋์ง๋ง, ๊ฐ์ ์งํฉ์ ์ํ ๋
ธ๋๋ฅผ
65- # unionํ๋ ค๋ ์ํฉ์ ํ๋ณํ๊ธฐ ์ํด ๊ฐ ๋ฆฌํด.
66- return pa == pb
82+ if rank [pa ] == rank [pb ]:
83+ rank [pa ] += 1
84+
85+ return False
6786
6887 if len (edges ) != n - 1 :
6988 # ํธ๋ฆฌ์๋ ์ฃ์ง๊ฐ `(๋
ธ๋ ๊ฐ์) - 1`๊ฐ ๋งํผ ์๋ค.
@@ -84,24 +103,26 @@ def union(a, b):
84103 for e in edges :
85104 if union (* e ):
86105 return False
87-
106+
88107 return True
89108
90109
91- """TC: O(), SC: O()
110+ """TC: O(n ), SC: O(n )
92111
93112n์ ์ฃผ์ด์ง ๋
ธ๋์ ๊ฐ์, e๋ ์ฃผ์ด์ง ์ฃ์ง์ ๊ฐ์.
94113
95114์์ด๋์ด(์ด์ด์):
96- - union-find๋ฅผ ์ฐ๋ฉด union์ ์ฌ๋ฌ ๋ฒ ์ํํด์ผ ํ๋๋ฐ ์ด ๊ณผ์ ์์ ์๊ฐ์ ๋ง์ด ์ก์๋จน๋๊ฒ ๊ฐ๋ค.
97115- ํธ๋ฆฌ๋ฅผ ์ ์ด๋ค๋์ง ํ์ธํ๋ ค๋ฉด ํ ๋
ธ๋์์ ์์ํด์ dfs๋ฅผ ๋๋ ค์ ๋ชจ๋ ๋
ธ๋๋ค์ ๋๋ฌ ๊ฐ๋ฅํ์ง
98116 ์ฒดํฌํ๋ฉด ๋๋๋ฐ, ์ด๊ฒ ์๊ฐ๋ณต์ก๋์ ๋ ์ ๋ฆฌํ์ง ์์๊น?
99117
100118SC:
101- -
119+ - adjacency list๋ฅผ ๊ด๋ฆฌํ๋ค. O(e).
120+ - ํธ์ถ ์คํ์ ํ์์ ์์ํ๋ ๋
ธ๋๋ก๋ถํฐ ์ฌ์ดํด์ด ๋์ค์ง ์๋ ๊ฒฝ๋ก์ ์ต๋ ๊ธธ์ด๋งํผ ๊น์ด์ง ์ ์๋ค.
121+ ์ต์
์ ๊ฒฝ์ฐ O(n).
122+ - ์ด๋ e = n-1 ์ด๋ฏ๋ก ์ข
ํฉํ๋ฉด O(n).
102123
103124TC:
104- -
125+ - ๊ฐ ๋
ธ๋์ ์ ๊ทผํ๋ ๊ณผ์ ์ O(1). ์ด๋ฐ ๋
ธ๋๋ฅผ ์ต์
์ ๊ฒฝ์ฐ n๊ฐ ์ ๊ทผํด์ผ ํ๋ฏ๋ก O(n).
105126"""
106127
107128
0 commit comments