๐ข ์ต๋จ๊ฒฝ๋ก
- ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ (Shortest Path Problem)
๐๊ฐ์ค๊ทธ๋ํ์ ๋ ๊ฐ์ ์ ์ u์ v๊ฐ ์ฃผ์ด์ก์ ๋, u์ v์ฌ์ด์ ๋ฌด๊ฒ์ ํฉ์ด ์ต์์ธ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ - ์ต๋จ๊ฒฝ๋ก๊ธธ์ด : ๊ฐ์ ๋ค์ ๋ฌด๊ฒ ํฉ
- ์์ฉ๋ถ์ผ
๐ ์ธํฐ๋ท ํจํท ๋ผ์ฐํ , ํญ๊ณตํธ ์์ฝ, ์๋์ฐจ ๋ค๋น๊ฒ์ด์ ๋ฑ๋ฑ
๐ข ์ต๋จ๊ฒฝ๋ก ์์ฑ
- ์์ฑ 1
๐ ์ต๋จ๊ฒฝ๋ก ๋ถ๋ถ๊ฒฝ๋ก(Subpath)์ญ์ ์ต๋จ๊ฒฝ๋ก์ด๋ค. - ์์ฑ 2
๐ ์ถ๋ฐ์ ์ ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์ ์ด๋ฅด๋ ์ต๋จ๊ฒฝ๋ก๋ค์ ํธ๋ฆฌ๊ฐ ์กด์ฌํ๋ค.
= ๋จ์ผ์ ์ต๋จ๊ฒฝ๋ก(Single-Source Shortest Paths) - ์ต๋จ๊ฒฝ๋ก๋ ์ต์์ ์ฅํธ๋ฆฌ์ ๋ฌ๋ฆฌ
๐ ๋ฌด๋ฐฉํฅ๋ฟ๋ง ์๋๋ผ ๋ฐฉํฅ๊ทธ๋ํ์๋ ์ ์๋๋ค.
๐ ๊ทธ๋ํ์ ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ์ธ์ดํด์ด ์๊ฑฐ๋, ๋ฌด๋ฐฉํฅ๊ทธ๋ํ์ ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์์ผ๋ฉด ๋ถ์ ํ๋ค.
๐ ์ต๋จ๊ฒฝ๋กํธ๋ฆฌ(Shortest Path Tree)๋ ๋ฃจํธํธ๋ฆฌ - ๊ฐ์ค ๋ฐฉํฅ๊ทธ๋ํ์ ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ์ธ์ดํด์ด ์กด์ฌ
๐ ์ต๋จ๊ฒฝ๋ก๋ ์กด์ฌํ์ง X - ๊ฐ์ค ๋ฌด๋ฐฉํฅ๊ทธ๋ํ์ ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์กด์ฌ
๐ ์ต๋จ๊ฒฝ๋ก๋ ์กด์ฌํ์ง ์๋๋ค. - ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ | ์๊ณ ๋ฆฌ์ฆ | ์๊ฐ |
์์ด ์๋ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์๋ ๊ทธ๋ํ |
Dijkstra(๋ค์ต์คํธ๋ผ) | O(Mlog(N)) or O(N^2) |
์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์๋ ๋ฐฉํฅ๊ทธ๋ํ |
Bellman-Ford(๋ฒจ๋ง-ํฌ๋)(BFS์ ์ํจ) | O(NM) |
๋น๊ฐ์ค๊ทธ๋ํ | BFS | O(N + M) |
DAG ( ๋ฐฉํฅ ๋น์ธ์ดํด ๊ทธ๋ํ) | Topological Ordering(์์์ ๋ ฌ) | O(N + M) |
๐ข Dijkstra ์๊ณ ๋ฆฌ์ฆ
- ์ ์ s๋ก๋ถํฐ ์ ์ v์ ๊ฑฐ๋ฆฌ : s์ v์ฌ์ด์ ์ต๋จ๊ฒฝ๋ก์ ๊ธธ์ด
- Dijkstra ์๊ณ ๋ฆฌ์ฆ์ ์ถ๋ฐ์ ์ s๋ก๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ค.
- ์ ์
๐ ๊ทธ๋ํ๊ฐ ์ฐ๊ฒฐ๋์๋ค.
๐ ๊ฐ์ ๋ค์ ๋ฌด๋ฐฉํฅ์ด๋ค.
๐ ๊ฐ์ ์ ๋ฌด๊ฒ๋ ์์๊ฐ ์๋๋ค. - ์ ์ s๋ก๋ถํฐ ์์ํ์ฌ ์ ์ ๋ค์ ์ฐจ๋ก๋ก ๋ฐฐ๋ญ์ ๋ฃ๋ค๊ฐ ๊ฒฐ๊ตญ์ ๋ชจ๋ ์ ์ ์ ๋ฐฐ๋ญ์ ๋ฃ๋๋ค.
- ๊ฐ ์ ์ v์ ๊ฑฐ๋ฆฌ ๋ผ๋ฒจ d(v)๋ฅผ ์ ์ฅํ์ฌ ๋ฐฐ๋ญ๊ณผ ์ธ์ ์ ์ ๋ค์ ๊ตฌ์ฑํ๋ ๋ถ๊ทธ๋ํ์์ s๋ก๋ถํฐ v๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ํํ
- ๋ฐ๋ณต์ ๊ฐ ํ์ ์์
๐ ๋ฐฐ๋ญ ๋ฐ์ ์ ์ ๊ฐ์ด๋ฐ ๊ฑฐ๋ฆฌ ๋ผ๋ฒจ d๊ฐ ์ต์์ธ ์ ์ u๋ฅผ ๋ฐฐ๋ญ์ ๋ฃ๋๋ค.
๐ u์ ์ธ์ ํ ์ ์ ๋ค์ ๋ผ๋ฒจ์ ๊ฐฑ์ ํ๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ต์์ ์ฅํธ๋ฆฌ์ Prim-Jarnik์๊ณ ๋ฆฌ์ฆ๊ณผ ๋งค์ฐ ํก์ฌํ ๊ฒ์ ๋๋ ์ ์๋ค.
Alg DijkstraShortestPaths(G,s)
input a simple undirected weighted graph G with nonnegative edge weights, vertex s of G
ouput lable d(u), for each vertex u of G, s.t. d(u) is the distance from s to u in G
for each ∈ G.vertexs()
d(v) <- ∞ // ๋ชจ๋ ์ ์ ์ ๊ฑฐ๋ฆฌ๋ 0
d(s) <- 0 // ์์ ์ ์ s์ ๊ฑฐ๋ฆฌ๋ 0
Q <- a priority queue containing all the vertexs of G using d labels as keys
while(!(Q.isEmpty())
u <- Q.removeMin() // ํ์ผ๋ก ๊ตฌํํ, Q ์์, ์ต์ํ์ ๋ฃจํธํค๋ฅผ ๋ฐํํด์, ์ต์ ๊ฐ ์ ์ u๋ฅผ ๋ฐํ
for each e ∈ G.incidentEdges(u) // u์ ๋ถ์ฐฉ๋ ๊ฐ์ ๋ค ์ ๋ถ์ ๋ํด
z <- G.opposite(u,e) // z๋ ์ ์ u์ ๋ถ์ฐฉ๋ ๊ฐ์ ์ ํตํ ๋ฐ๋ํธ ์ ์
if(z ∈ Q.elements()) // ๊ทธ ์ ์ z๊ฐ ์์ง Q์ ์กด์ฌํ๋, ์ฆ, ์์ง ๋ฐฐ๋ญ์ ๋ค์ด๊ฐ์ง ๋ชปํ ์ ์ ์ด๋ฉด
if(d(u) + w(u,z) < d(z)) // ๊ฐ์ ์ํ์งํ ( ๊ธฐ์กด์ ์ ์ z์ distance๋ณด๋ค > ์์ u์ ์ ๊ณผ ์ด์ด์ง ๊ฐ์ (u,z)์ distance์ ํฉ์ด ๋ ์์ผ๋ฉด
d(z) <- d(u) + w(u,z) // d(z) ์
๋ฐ์ดํธ
Q.replaceKey(z,d(z)) // ๊ทธ๋ฆฌ๊ณ , z์ ์ ์ ๊ฐ์ค์น๊ฐ ์
๋ฐ์ดํธ ๋ฌ์ผ๋ฉด, ์ ์ฒด, Q ๊ตฌ์กฐ ์
๋ฐ์ดํธ
- ์ถ๊ฐ์ค๋ช
๐ ๋ฐฐ๋ญ(Sack) : ๊ฐ์์ด๋ฏ๋ก, ๊ตฌํํ์ง ์์ !!
๐ ์ฐ์ ์์ ํ๊ฐ, ๋ฐฐ๋ญ ๋ฐ์ ์ ์ ๋ค์ ๋ณด๊ดํ๋ค. = ( ํค(distance)-์์(vertex) )
๐ ๊ฐ ์ ์ v์ ๋ ๊ฐ์ ๋ผ๋ฒจ์ ์ ์ฅ = ( ๊ฑฐ๋ฆฌ( distance ) : d(v) , ๋ถ๋ชจ ์ ์ ( parent ) : p(v) )
๐ข ๊ฐ์ ์ํ
- ๊ฐ์ e = (u,z)์ ๋ํด ๊ณ ๋ คํ๋ค.
๐ u๋ ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐฐ๋ญ์ ๋ค์ด๊ฐ ์ ์
๐ z๋ ๋ฐฐ๋ญ ๋ฐ์ ์กด์ฌํ๋ ์ ์ - ๊ฐ์ e์ ์ํ(relaxation)๋ฅผ ํตํด ๊ฑฐ๋ฆฌ d(z)๋ฅผ ๊ฐฑ์ ํ๋ค. ์ฆ,
๐ d(z) <- min( d(z) , d(u) + w(u,z) )
- ์๊ณ ๋ฆฌ์ฆ ๋ถ์
๐ ์ฐ์ ์์ ํ์ ๊ตฌํ์, ๋ ๊ฐ์ง ์ ํ ๊ฐ๋ฅ
1. ํ ๊ตฌํ
2. ๋ฌด์๋ฆฌ์คํธ ๊ตฌํ - ํ์ ๊ธฐ์ดํ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
๊ฐ ์ ์ ์ ์ฐ์ ์์ ์ ํ๋ฒ ์ฝ์ , ํ๋ฒ ์ญ์ ๋๋ฉฐ, ๊ฐ๊ฐ์ ์ฝ์ ๊ณผ ์ญ์ ์ = O(log(N)) ์๊ฐ ์์
์ฐ์ ์์ ํ ๋ด์ ์ ์ z์ ํค๋ ์ต๋ deg(z)๋ฒ ๊ฐฑ์ ๋๋ฉฐ ๊ฐ๊ฐ์ ํค ๊ฐฑ์ ์ = O(log(N)) ์๊ฐ ์์
๐ ๊ทธ๋ํ G๊ฐ ์ธ์ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ก ํํ๋ ๊ฒฝ์ฐ, Dijkstra ์๊ณ ๋ฆฌ์ฆ = O((N+M)log(N)) ์๊ฐ์ ์ํ
๐ ๊ทธ๋ํ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก, ์คํ์๊ฐ = O(Mlong(N)) ํํ ๊ฐ๋ฅ
๐ ๊ทธ๋ํ๊ฐ ๋จ์ํ๋ค๊ณ ์ ์ ํ๋ฏ๋ก = (์ต์ ์ ๊ฒฝ์ฐ) O(N^2log(N)) - ๋ฌด์๋ฆฌ์คํธ์ ๊ธฐ์ดํ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
๊ฐ ์ ์ ์ ์ฐ์ ์์ ํ์ ํ๋ฒ ์ฝ์ , ํ๋ฒ ์ญ์ ๋๋ฉฐ, ์ฝ์ ๊ณผ ์ญ์ ์ = ์ฝ์ ( O(1) ), ์ญ์ ( O(N) ) ์๊ฐ ์์
์ฐ์ ์์ ํ ๋ด์ ์ ์ z์ ํค๋ ์ต๋ deg(z)๋ฒ ๊ฐฑ์ ๋๋ฉฐ ๊ฐ๊ฐ์ ํค ๊ฐฑ์ ์ O(1) ์๊ฐ ์์
๐ ๊ทธ๋ํ๊ฐ ์ธ์ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ก ํํ๋ ๊ฒฝ์ฐ, Dijkstra ์๊ณ ๋ฆฌ์ฆ = O(N^2 + M) ์๊ฐ์ ์ํ
๐ ๊ทธ๋ํ๊ฐ ๋จ์ํ๋ค๊ณ ์ ์ ํ๋ฏ๋ก = O(N^2)๋ก ๋จ์ํ ๊ฐ๋ฅ - ๊ฒฐ๊ณผ์ ์ผ๋ก, ๋ ๊ฐ์ง ์ฐ์ ์์ ํ ๊ตฌํ ๋น๊ต ( ํ vs ๋ฌด์๋ฆฌ์คํธ )
๐ ํ์ผ๋ก ๊ตฌํํ๋ฉด = O(Mlog(N)) ์๊ฐ ์์
๐ ๋ฌด์๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ฉด = O(N^2) ์๊ฐ ์์
๐ ๋ ๊ตฌํ ๋ชจ๋ : ์ฝ๋ฉํ๊ธฐ ์ฝ๊ณ , ์์์ ์์๋ก ๋ณด๋ฉด ๋น์ทํ๋ค.
๐ (์ต์ ์ ๊ฒฝ์ฐ๋ง์) ์๊ฐํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ ํ์ง๊ฐ ์๋ค.
1. ํฌ์๊ทธ๋ํ( ์ฆ, M < (N^2)/log(N) )์ ๋ํด์๋ ํ ๊ตฌํ์ด ์ ๋ฆฌ
2. ๋ฐ์ง๊ทธ๋ํ( ์ฆ, M > (N^2)/log(N) )์ ๋ํด์๋ ๊ตฌํ์ด ์ ๋ฆฌ
๐ข Bellman-Ford ์๊ณ ๋ฆฌ์ฆ
- ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์๋๋ผ๋ ์๋ํ๋ค.
- ๋ฐฉํฅ๊ฐ์ ์ผ๋ก ์ ์ ํ๋ค = If ) ๊ทธ๋ ์ง ์์ผ๋ฉด, ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ์ธ์ดํด์ด ์๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- i - ๋ฒ์งธ ํ์ ์์ i ๊ฐ์ ๊ฐ์ ์ ์ฌ์ฉํ๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ๋๋ค.
- ์คํ์๊ฐ : O(NM)
- BFS์ ๊ธฐ์ดํ๋ค. = ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง๋ ์ธ์ดํด์ด ์๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ๋ฐ๊ฒฌ ๊ฐ๋ฅํ๋ค.
- ์ธ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก, ๊ฐ์ ๋ฆฌ์คํธ ๊ตฌ์กฐ ๊ทธ๋ํ์์ ์ํ ๊ฐ๋ฅํ๋ค.
Alg Bellman-FordShortestPaths(G,s)
input a weighted digraph G with n vertexs, and a vertex s of G
output label d(u), for each vertex u of G, s.t. d(u) is the distance from s to u in G
// ๊ทธ๋ํ ๋ด์ ๋ชจ๋ ์ ์ distance = ∞
for each v ∈ G.vertexs()
d(v) <- ∞
d(s) <- 0 // ์์ ์ ์ s์ distance = 0
for i <- 1 to n - 1
for each e ∈ G.edges() // ๊ทธ๋ํ ๋ด์ ๋ชจ๋ ๊ฐ์ ์ผ๋ก ๋ถํฐ
// ๊ฐ์ ์ํ
u <- G.Origin(e) // u๋ ๊ฐ์ e์ ์ ์ฅ๋ origin(์์) ์ ์
z <- G.opposite(u,e) // z๋ ์ ์ u์ ๊ฐ์ e๋ก ๋ถํฐ ์ด์ด์ง๋ ๋ฐ๋ํธ ์ ์
d(z) <- min(d(z),d(u) + w(u,z)) // ํ์ฌ ์ ์ z์ distance > u์ ์ ๊น์ง ๊ฑฐ์ณ + u์ z์ ์ ์ผ๋ก ์ด์ด์ง๋ ๊ฐ์ e์ ๊ฑฐ๋ฆฌ์ ํฉ ์ค์ ์์ ๊ฒ์ z์ ๊ฑฐ๋ฆฌ๋ก ์
๋ฐ์ดํธ
๐ข ๋ชจ๋ ์ ์ต๋จ๊ฒฝ๋ก
- ๋ชจ๋ ์ ์ต๋จ๊ฒฝ๋ก(all-pair shortest paths) ๋ฌธ์ : ๊ฐ์ค ๋ฐฉํฅ๊ทธ๋ํ G์ ๋ชจ๋ ์ ์ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฌธ์
- ๊ทธ๋ํ์ ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์๋ค๋ฉด, Dijkstra ์๊ณ ๋ฆฌ์ฆ N๋ฒ ํธ์ถํ ์๋ ์๋ค. = O(NMlog(N))
- ๊ทธ๋ํ์ ์์ ๋ฌด๊ฒ๋ฅผ ๊ฐ์ง ๊ฐ์ ์ด ์๋ค๋ฉด, Bellman-Ford ์๊ณ ๋ฆฌ์ฆ N๋ฒ ํธ์ถํ ์๋ ์๋ค = O((N^2)M)
- ๋์
๐ ๋์ ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming)์ ์ฌ์ฉ = O(N^3) ์๊ฐ์ ์ํ ๊ฐ๋ฅํ๋ค.
( Floyed-Warshall ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์ํํ๋ค. )
Alg allPairsShortestPaths(G)
input a simple weighted digraph G without negative-weight cycle // ์์ ๊ฐ์ค์น ์ธ์ดํด ๊ทธ๋ํ
output a numbering V1,V2,....,Vn of the vertexs of G and a matrix D
(s.t D[i,j] = distance of Vi,Vj in G
Let V1,V2,.....,Vn be an arbitrary numbering of the vertexs of G
for i <-1 to n
for j <- 1 to n
if(i == j)
D[i,j] <- 0 // ์๊ธฐ ์์ distacne = 0
elseif((Vi,Vj) ∈ G.edges())
D[i,j] <- w(Vi,Vj)
else
D[i,j] <- ∞
for k <- 1 to n
for i <-1 to n
for j <- 1 to n
D[i,j] <- min( D[i,j], D[i,k] + D[k,j] )
728x90
๋ฐ์ํ
'Algorithm Theory' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์๋ฒ(Greedy Method) (0) | 2020.12.15 |
---|---|
์ต์์ ์ฅํธ๋ฆฌ(Minimum Spanning Tree) (0) | 2020.12.15 |
๋์ ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2020.12.14 |
๋ฐฉํฅ ๊ทธ๋ํ(Directed graph) (0) | 2020.12.14 |
๊ทธ๋ํ ์ํ(Graph Traversal) (0) | 2020.12.14 |