Algorithm Theory
์ต์์ ์ฅํธ๋ฆฌ(Minimum Spanning Tree)
Meng's Computer
2020. 12. 15. 01:40
๐ข ๊ฐ์ค๊ทธ๋ํ
- ๊ฐ์ค๊ทธ๋ํ(Weighted Graph) : ๊ฐ ๊ฐ์ ์ด ๋ฌด๊ฒ(weight)๋ผ ๋ถ๋ฅด๋ ์์น๊ฐ์ ๊ฐ์ง๋ ๊ทธ๋ํ
- ๋ฌด๊ฒ๊ฐ ๋ ์ ์๋ ๊ฒ๋ค์ ๊ฑฐ๋ฆฌ,๋น์ฉ,์๊ฐ ๋ฑ ๋ค์ํ๋ค.
๐ข ์ต์์ ์ฅํธ๋ฆฌ
- ์ ์ฅ ๋ถ๊ทธ๋ํ(Spanning Subgraph) : ๊ทธ๋ํ G์ ๋ชจ๋ ์ ์ ๋ค์ ํฌํจํ๋ ๋ถ๊ทธ๋ํ
- ์ ์ฅํธ๋ฆฌ(Spanning Tree) : (์์ )ํธ๋ฆฌ์ธ ์ ์ฅ ๋ถ๊ทธ๋ํ
- ์ต์์ ์ฅํธ๋ฆฌ(MST, Minimum Spanning Tree) : ๊ฐ์ค๊ทธ๋ํ์ ์ด ๊ฐ์ ๋ฌด๊ฒ๊ฐ ์ต์์ธ ์ ์ฅํธ๋ฆฌ
- ์์ฉ๋ถ์ผ
๐ ๊ตํต๋ง, ํต์ ๋ง ๋ฑ๋ฑ
- ์ต์์ ์ฅํธ๋ฆฌ ์์ฑ
๐ 1. ์ธ์ดํด์์ฑ
๐ 2. ๋ถํ ์์ฑ
์ด ๋๊ฐ์ ์์ฑ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํ์ฑ ๊ฒ์ฆ์ ์ด์ฉํ๋ค.
๐ข ์ธ์ดํด ์์ฑ
- ์ธ์ดํด ์์ฑ
๐ T๋ฅผ ๊ฐ์ค๊ทธ๋ํ G์ ์ต์์ ์ฅํธ๋ฆฌ๋ผ ๊ฐ์ ํ์.
๐ e๋ฅผ T์ ์กด์ฌํ์ง ์๋ G์ ๊ฐ์ ์ผ๋ก, C๋ฅผ e๋ฅผ T์ ์ถ๊ฐํ์ฌ ํ์ฑ๋ ์ธ์ดํด๋ก ๊ฐ์ ํ์.
๐ ๊ทธ๋ฌ๋ฉด C์ ๋ชจ๋ ๊ฐ์ f์ ๋ํด, weight(f) <= weight(e) ์ด๋ค. - ์ฆ๋ช
๐ ๋ชจ์๋ฒ : ๋ง์ฝ weight(f) > weight(e)๋ผ๋ฉด, f๋ฅผ e๋ก ๋์ฒดํจ์ผ๋ก์จ ๋ฌด๊ฒ๊ฐ ๋ ์์ ์ ์ฅํธ๋ฆฌ๋ฅผ ์ป์ ์ ์๊ธฐ ๋๋ฌธ
๐ข ๋ถํ ์์ฑ
- ๋ถํ ์์ฑ
๐ G์ ์ ์ ๋ค์ ๋ ๊ฐ์ ๋ถ๋ถ์งํฉ U์ V๋ก ๋ถํ ํ๋ค๊ณ ํ์.
๐ e๋ฅผ ๋ถํ ์ ๊ฐ๋ก์ง๋ฅด๋ ์ต์ ๋ฌด๊ฒ์ ๊ฐ์ ์ด๋ผ๊ณ ํ์.
๐ ๊ฐ์ e๋ฅผ ํฌํจํ๋ G์ ์ต์์ ์ฅํธ๋ฆฌ๊ฐ ๋ฐ๋๋ฆฌ ์กด์ฌํ๋ค. - ์ฆ๋ช
๐ T๋ฅผ G์ MST๋ผ ํ์.
๐ ๋ง์ฝ T๊ฐ e๋ฅผ ํฌํจํ์ง ์๋๋ค๋ฉด, e๋ฅผ T์ ์ถ๊ฐํ์ฌ ํ์ฑ๋ ์ธ์ดํด C๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ์ ๋ค ๊ฐ์ด๋ฐ ๋ถํ ์
๊ฐ๋ก์ง๋ฅด๋ ๊ฐ์ f๊ฐ ์กด์ฌํ ๊ฒ์ด๋ค.
๐ ์ธ์ดํด ์์ฑ์ ์ํด, weight(f) <= weight(e)
๐ ๊ทธ๋ฌ๋ฏ๋ก, weight(f) == weight(e)
๐ f๋ฅผ e๋ก ๋์ฒดํ๋ฉด ๋ ํ๋์ MST๋ฅผ ์ป์ ์ ์๋ค.
๐ข ์ต์์ ์ฅํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
- ํฌ๊ฒ 3๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ์ด ์กด์ฌํ๋ค.
๐ 1. Prim-Jarnik ์๊ณ ๋ฆฌ์ฆ ( ๋ง์ด ์ )
๐ 2. Kruskal ์๊ณ ๋ฆฌ์ฆ ( ๋ง์ด ์ )
๐ Baruvka ์๊ณ ๋ฆฌ์ฆ ( 1๋ฒ + 2๋ฒ ๋๋ )
๐ข Prim-Jarnik ์๊ณ ๋ฆฌ์ฆ
- ํ์(Greedy) ์๊ณ ๋ฆฌ์ฆ์ ์ผ์ข
- ๋์ : ๋จ์ ์ฐ๊ฒฐ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ
- ์์ด๋์ด
๐ ์์์ ์ ์ s๋ฅผ ํํ์ฌ, s๋ก๋ถํฐ ์์ํด์, ์ ์ ๋ค์ (๊ฐ์์)๋ฐฐ๋ญ์ ๋ฃ์ด๊ฐ๋ฉฐ ๋ฐฐ๋ญ ์์์ MST T๋ฅผ ํค์ ๋๊ฐ
๐ s๋ T์ ๋ฃจํธ(root)๊ฐ ๋ ๊ฒ์ด๋ค.
๐ ๊ฐ ์ ์ v์ ๋ผ๋ฒจ d(v)๋ฅผ ์ ์ = d(v)๋ ๋ฐฐ๋ญ ์์ ์ ์ ๊ณผ ๋ฐฐ๋ญ ๋ฐ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ weight
๐ ๋ฐ๋ณต์ ๊ฐ ํ์ ์์
: ๋ฐฐ๋ญ ๋ฐ ์ ์ ๋ค ๊ฐ์ด๋ฐ ์ต์ d(z) ๋ผ๋ฒจ์ ๊ฐ์ง ์ ์ z๋ฅผ ๋ฐฐ๋ญ์ ๋ฃ๊ณ , z์ ์ธ์ ํ ์ ์ ๋ค์ ๋ผ๋ฒจ์ ๊ฐฑ์ ํ๋ค.
Alg PrimJarnikMST(G)
input a simple connected weighted graph G with n vertexs and m edges
output an MST T for G
for each v ∈ G.vertexs()
d(v) <- ∞ // ์ฌ๊ธฐ์, d(v)๋ ๊ฐ ์ ์ ๋ค์ ๊ฑฐ๋ฆฌ
p(v) <- ∅ // ์ฌ๊ธฐ์, p(v)๋ ๊ฐ ์ ์ ๋ค์ MST๋ก ์ด๋ค์ง๊ธฐ์ํ ์ง๊ณ ๋ถ๋ชจ ์ ์ ์ ๋ณด
s <- a vertex of G
d(s) <- 0
Q <- a priority queue containing all the vertexs of G using d labels as keys
while(!(Q.isEmpty()) // ์ฐ์ ์์ ํ๋ฅผ ๋น์ธ ๋๊น์ง ๋ฐ๋ณต์ธ๋ฐ, ๋ฐ๋ณต ์์
์, ๋ฐฐ๋ญ(MST)์ ์ ์ ์ ํ๋์ฉ ๋ํ๊ฐ๋ ๊ฒ
u <- Q.removeMin() // ์ฐ์ ์์ ํ์ ๋ค์ด๊ฐ์๋, ๊ฐ์ฅ ๊ฑฐ๋ฆฌ d ๊ฐ ์์ ์ ์ ๋ฐํ u
for each e ∈ G.incidentEdges(u) // ์ ์ u์ ๋ถ์ฐฉ๋ ๊ฐ์ ์ ๋ถ๋ฅผ ๋ณธ๋ค.
z <- G.opposite(u,e) // ์ ์ u์ ์ด์ด์ง ๊ฐ์ e๋ฅผ ํตํ ๋ฐ๋ํธ ์ ์ ์ z๋ผ ํ๋ค.
if((z ∈ Q) & (w(u,z) < d(z))) // ์ ์ z๊ฐ ์ฐ์ ์์ ํ์ ์๋ ๊ฒ์ด๊ณ , ์ฆ ์์ง ๋ฐฉ๋ฌธ ์ํ ์ ์ ์ด๊ณ , ์ ์ u๋ฅผ ๊ฑฐ์ณ ์ ์ z๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ, ์์ง ํ์ฌ ์ ์ z๊ฑฐ๋ฆฌ๋ณด๋ค ์ ์ผ๋ฉด
d(z) <- w(u,z) // ์ ์ z์ ๊ฑฐ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธํ๋ค.
p(z) <- e // ๊ทธ๋ฆฌ๊ณ , ์ ์ z์ ๋ถ๋ชจ๊ฐ์ ์ e๋ก ์
๋ฐ์ดํธํ๋ค.
Q.replaceKey(z,w(u,z)) // ์ด๋ ๊ฒ, ์ ์ z์ ๊ฑฐ๋ฆฌ(d)๊ฐ ์ฐ์ ์์๊ฐ ๋ฐ๊ผ์ ์๋ ์์ผ๋, ์ฐ์ ์์ํ ์ฌ๋ฐฐ์น๋ฅผ ์งํํ๋ค.
- ์ถ๊ฐ์ค๋ช
๐ (๊ฐ์์)๋ฐฐ๋ญ ๋ฐ์ ์ ์ ๋ค์ ์ฐ์ ์์ ํ์ ์ ์ฅ : ํค(๊ฑฐ๋ฆฌ)-์์(์ ์ ์ ๋ณด)
๐ ๊ฐ ์ ์ v์ ์ธ ๊ฐ์ ๋ผ๋ฒจ์ ์ ์ฅํ๋ค.
1. ๊ฑฐ๋ฆฌ(distance) : d(v)
2. ์์น์(locator) : ์ฐ์ ์์ ํ์์์ v์ ์์น
3. ๋ถ๋ชจ(parent) : p(v), MST์์ v์ ๋ถ๋ชจ๋ฅผ ํฅํ ๊ฐ์
- ์๊ณ ๋ฆฌ์ฆ ๋ถ์
๐ ๋ผ๋ฒจ ์์ : ์ ์ z์ ๊ฑฐ๋ฆฌ, ๋ถ๋ชจ, ์์น์ ๋ผ๋ฒจ์ O(deg(z))์๊ฐ ์ฝ๊ณ ์ด๋ค. ๋ผ๋ฒจ์ ์ฝ๊ณ ์ฐ๋๋ฐ O(1)์๊ฐ ์์
๐ ์ฐ์ ์์ ํ( ํ์ผ๋ก ๊ตฌํํ ๊ฒฝ์ฐ ) ์์
1. ๊ฐ ์ ์ ์ ์ฐ์ ์์ ํ์ ํ๋ฒ ์ฝ์ ๋๊ณ ํ๋ฒ ์ญ์ : ์ฝ์ ๊ณผ ์ญ์ ์ ๊ฐ๊ฐ O(log(N))์๊ฐ ์์
2. ์ฐ์ ์์ ํ ๋ด์ ์ ์ w์ ํค๋ ์ต๋ deg(w)๋ฒ ๋ณ๊ฒฝ : ๊ฐ ํค ๋ณ๊ฒฝ์ O(log(N))์๊ฐ ์์ (ํ ์ด๋๊น)
๐ ๊ทธ๋ํ๊ฐ ์ธ์ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ก ํํ๋์ด ์๋ค๋ฉด, Prim-Jarnik ์๊ณ ๋ฆฌ์ฆ์ O((N+M)log(N))์๊ฐ์ ์ํํ๋ค.
๐ ๋จ์ ์ฐ๊ฒฐ๊ทธ๋ํ์์ N = O(M)์ด๋ฏ๋ก, ์ด ์คํ์๊ฐ : O(Mlog(N))
๐ข Kruskal ์๊ณ ๋ฆฌ์ฆ
- ํ์(Greedy) ์๊ณ ๋ฆฌ์ฆ
- ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์ด๊ธฐ ์์
๐ ๋ชจ๋ ์ ์ ์ ๊ฐ๊ฐ์ ๋ ์์ ์ธ (์ค์ ์)๋ฐฐ๋ญ์ ๋ฃ๋๋ค.
๐ ๋ฐฐ๋ญ ๋ฐ ๊ฐ์ ๋ค์ ์ฐ์ ์์ ํ์ ์ ์ฅํ๋ค. = ํค(๋ฌด๊ฒ)-์์(๊ฐ์ )
๐ ๋น์ด ์๋ MST T๋ฅผ ์ด๊ธฐํ - ๋ฐ๋ณต์ ๊ฐ ํ์ ์์
: ๋ ๊ฐ์ ๋ค๋ฅธ ๋ฐฐ๋ญ ์์ ์๋์ ์ ๊ฐ์ง ์ต์ ๋ฌด๊ฒ์ ๊ฐ์ ์ MST T์ ํฌํจํ๊ณ ๋ ๋ฐฐ๋ญ์ ํ๋๋ก ํฉ์น๋ค. - ๋ฐ๋ณต์ด ์๋ฃ๋๋ฉด
: MST T๋ฅผ ํฌํจํ๋ ํ ๊ฐ์ ๋ฐฐ๋ญ๋ง ๋จ๊ฒ ๋ ๊ฒ์ด๋ค.
Alg KruskalMST(G)
input a simple connected weighted graph G with n vertexs and m edges
output an MST T for G
for each v ∈ G.vertexs()
define a Sack(v) <- {v} // Sack์ ๋ฐฐ๋ญ์ ์๋ฏธ, ์ด๊ฒ์ ์ค์ ๊ตฌํ์์๋ Parent(v)๋ก ์ ์ดํ๋ฉด ํธํ๋ค.
Q <- a priority queue containnig all the edges of G using weights as keys
T <- ∅
while(T has fewer than n - 1 edges)
(u,v) <- Q.removeMin()
if(Sack(u) ≠ Sack(v))
Add edge (u,v) to T
Merge Sack(u) and Sack(v)
return T
- ์๊ณ ๋ฆฌ์ฆ ๋ถ์
๐ ์ฐ์ ์์ ํ ์ด๊ธฐํ ์์
ํ์ ์ฌ์ฉํ์ฌ ์ฐ์ ์์ ํ Q๋ฅผ ๊ตฌํํ๋ฉด, ๋ฐ๋ณต์ ์ธ ์ฝ์ ๋ฐฉ์์ ์ํด์๋ O(Mlog(M))์๊ฐ์,
์ํญ์ ํ ์์ฑ ๋ฐฉ์์ ์ํด์๋ O(M) ์๊ฐ์ Q ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
๐ ๋ฐ๋ณต์ ๊ฐ ํ์ ์์๋
์ต์ ๋ฌด๊ฒ์ ๊ฐ์ ์ O(log(M))์๊ฐ์ ์ญ์ ๊ฐ๋ฅ = ์ฌ๊ธฐ์, G๊ฐ ๋จ์๊ทธ๋ํ์ด๋ฏ๋ก, O(log(M)) = O(log(N))
๊ฐ ๋ฐฐ๋ญ์ ์ํ ๋ถ๋ฆฌ์งํฉ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ฉด, find(u) ≠ find(v) ๊ฒ์ฌ์ O(1) ์๊ฐ ( ๋๋ parent ๋ฐฐ์ด์ ์ด์ฉ ! )
๋ ๊ฐ์ ๋ฐฐ๋ญ Sack(u), Sack(v)๋ฅผ ํฉ์น๋๋ฐ O(min( |Sack(u)|, |Sack(v)| )) ์๊ฐ ์์ ( ๋ ์์ ๋ฐฐ๋ญ์ ์ฎ๊น )
๐ ์ด ๋ฐ๋ณต ํ์ : (์ต์ ์ ๊ฒฝ์ฐ) M๋ฒ
๐ ๊ทธ๋ฌ๋ฏ๋ก, Kruskal ์๊ณ ๋ฆฌ์ฆ์ O((N + M)log(N)) ์๊ฐ์ ์ํ
๐ G๊ฐ ๋จ์ ์ฐ๊ฒฐ๊ทธ๋ํ์ธ ๊ฒฝ์ฐ N = O(M)์ด๋ฏ๋ก, ์คํ์๊ฐ์ O(Mlog(N)) ์ด๋ค.
๐ข MST ์๊ณ ๋ฆฌ์ฆ ๋น๊ต
์๊ณ ๋ฆฌ์ฆ | ์ฃผ์์ ๋ต | ์ํ์๊ฐ | ์ธ๋ถ ๋ฐ์ดํฐ๊ตฌ์กฐ |
Prim-Jarnik | ํ์ | O(Mlog(N)) | ์ ์ ๋ค์ ์ ์ฅํ๊ธฐ ์ํ ์ฐ์ ์์ ํ |
Kruskal | ํ์ | O(Mlog(N)) | 1. ๊ฐ์ ๋ค์ ์ ์ฅํ๊ธฐ ์ํ ์ฐ์ ์์ ํ 2. ๋ฐฐ๋ญ๋ค์ ๊ตฌํํ๊ธฐ ์ํ ๋ถ๋ฆฌ์งํฉ(๋ฆฌ์คํธ๋ก ๊ตฌํ๊ฐ๋ฅ) or ๊ฐ ์ ์ ์ ๋ํด ๋ถ๋ชจ์ ์ (Parent๋ฐฐ์ด)๋ฐฐ์ด์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ |
728x90
๋ฐ์ํ