๐ Greedy ๊ทธ๋ฆฌ๋
@ 6~N์ฐจ์
@ Chapter 2
๐ซ Greedy ๊ทธ๋ฆฌ๋ (์์ฌ์์ด)
์ต์ ํด, ์ต๊ณ ์ข์ ํด๋ต
๋ถ๋ฌธ์
์๋์ ๋ฌธ์ ์ ๋๊ฐ์ ์ฑ์ง์ ๊ฐ์ง๋ฉด์ ๋จ์ง ํฌ๊ธฐ๋ง ์์ ๋ฌธ์
- ์์ฌ์์ด ๋ฐฉ๋ฒ์ ๊ฐ์
- ์ผ๋ จ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉด์ (์ต์ )ํด๋ฅผ ๊ตฌ์ฑํ๋ค๊ณ ํ๋จ๋๋ ์์๋ค์ ๋ชจ์
- ๋งค ๋จ๊ณ๋ง๋ค ์ ์ฒด์ ์ผ๋ก ์ต์ ์ธ์ง๋ ํ๋จํ์ง ์๊ณ ํ์ฌ ์ต์ ์ด๋ผ๊ณ ํ๋จ๋๋ ๊ฒฐ์ ์ ํจ. ์ฆ ๊ณผ๊ฑฐ๋ ๋ฏธ๋๋ ์๊ฐํ์ง ์๊ณ , ์ค์ง ํ์ฌ์ ์ต๋ ๋ง์กฑ๋ง์ ์ถ๊ตฌ(่ฟ่ฆ็ผ)
- ์ ์ฒด๋ฅผ ๊ณ ๋ ค์น ์๊ณ ํ์ฌ๋ง์ ์๊ฐํ๋ฏ๋ก ๋น๊ต์ ๊ฐ๋จํ ๊ตฌํ
- ํ๋ฒ ๋ด๋ฆฐ ๊ฒฐ์ ์ ์ทจ์โข๋ณ๊ฒฝํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ค๋ฅธ ์ต์ ํ ๋ฌธ์ ํด๊ฒฐ๊ธฐ๋ฒ๋ณด๋ค ๋น ๋ฆ
- ์ต์ ํด๋ฅผ ๊ตฌํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด ์์ฌ์์ด ๋ฐฉ๋ฒ์ ๊ธฐ๋ฐํ ๊ทผ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ณ ๋ ค ๊ฐ๋ฅ
Greedy
์ง๊ธ ์ต์ ํด ์ ํ
์ง๊ธ๋ง์ ์๊ฐํ๋ฏ๋ก ๋น๊ต์ ๊ตฌํ ์ฌ์
์ทจ์/๋ณ๊ฒฝ X โ ๋น๊ต์ ๋น ๋ฆ
์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด ๊ทผ์ฌ ์๊ณ ๋ฆฌ๋ฌ
- ์์ฌ์์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ค๋ฉด
- ์ต์ ํ ๋ฌธ์ โง์ต์ ๋ถ๋ถ๊ตฌ์กฐ โง ์ต์ ์ ํ
- ์ต์ ํ ๋ฌธ์ (optimization problem)
- ๊ฐ๋ฅํ ๋ชจ๋ ๋์ ์ค์์ ๊ฐ์ฅ ์ข์ ํด๋ต(์ต์ ํด)์ ๊ณ ๋ฅด๋ ๋ฌธ์
- ๊ฐ์ฅ ๊ฐ๊น์ด ๊ธธ์ ์ฐพ์๋ผ, ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ผ, โฆ
- ์ต์ ๋ถ๋ถ๊ตฌ์กฐ(optimal substructure)
- ๋ฌธ์ (problem)์ ์ต์ ํด๊ฐ ๋ถ๋ฌธ์ (subproblem)๋ค์ ์ต์ ํด๋ก๋ถํฐ ํจ์จ์ ์ผ๋ก ์์ฑ
- ๋ถ๋ฌธ์ ๋ ์๋์ ๋ฌธ์ ์ ๋๊ฐ์ ์ฑ์ง์ ๊ฐ์ง๋ฉด์ ๋จ์ง ํฌ๊ธฐ๋ง ์์ ๋ฌธ์
- ์ต์ ์ ํ
- ๊ฐ ๋จ๊ณ์์ ๋ด๋ฆฌ๋ ์ ํ์ด ์ต์ ์ด๋ผ๋ ์ฌ์ค์ ์ํ์ ๊ท๋ฉ๋ฒ์ผ๋ก ์ฆ๋ช
- ์กฐ๊ฑด (1 && 2 && 3)
- ์ต์ ํ ๋ฌธ์ Optimization Problem
- ์ต์ ํด ๋ฌธ์ (๊ฐ์ฅ ๊ฐ๊น์ด ๊ธธ, ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ, โฆ)
- ์ต์ ๋ถ๋ถ๊ตฌ์กฐ Optimal Substructure
- ๋ฌธ์ ์ ์ต์ ํด, ๋ถ๋ฌธ์ ๋ค์ ์ต์ ํด๋ณด๋ฃจํฐ ํจ์จ์ ์ผ๋ก ์์ฑ
- ์ต์ ์ ํ
- ๊ฐ ๋จ๊ณ ์ ํ์ด ์ต์ ์์ ์ํ์ ๊ท๋ฉ๋ฒ์ผ๋ก ์ฆ๋ช
- ์ต์ ํ ๋ฌธ์ Optimization Problem
๊ทธ๋ฆฌ๋์ ๊ตฌ์ฑ
- ์ ํ ์์
- ํ ์ํ์์ ์ต์ ํด์ ํฌํจ์ํฌ ๋์์ ์ ํ
- ํ๋น์ฑ ์กฐ์ฌ
- ์ ํ๋ ํด๊ฐ ์ฃผ์ด์ง ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ๊ฒ์ฌ
- ํด๋ต ์กฐ์ฌ
- ์๋์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋์ง๋ฅผ ๊ฒ์ฌ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
greedy_method( )
{
solution = { };
while (condition)
{
s = select(); // 1. ์ ํ ์์
- ํ ์ํ์์ ์ต์ ํด์ ํฌํจ์ํฌ ๋์์ ์ ํ
if (feasible(s)) // 2. ํ๋น์ฑ ์กฐ์ฌ - ์ ํ๋ ํด๊ฐ ์ฃผ์ด์ง ๋ฌธ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ๊ฒ์ฌ
{
solution = solution โช {s};
if (problem_solved(solution)) // 3. ํด๋ต ์กฐ์ฌ - ์๋์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋์ง๋ฅผ ๊ฒ์ฌ
{
return solution;
}
}
}
}
๐ซ Optimization Problem - ์ต์ ํ ๋ฌธ์ ์์
์ต๋จ ๊ฒฝ๋ก ๋ฌธ์
๊ณ ์๋๋ก์์ ์๋์ฐจ๋ฅผ ๋ชฐ๊ณ ์ด์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์์ธ์์ ๊ฐ๋ฆ๊น์ง ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ์์ฃผ์ ํ์ฐฝ์ ์ฐจ๋ก๋ก ๊ฒฝ์ ํด์ผ ํ๋ค๋ฉด ์์ธ์์ ํ์ฐฝ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ ๋ฐ๋์ ์์ฃผ๋ฅผ ๊ฒฝ์ ํ์ฌ์ผ ํ๋ค. ์ฆ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ ์ต์ ๋ถ๋ถ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค.
์ฌ์ดํด์ด ์๋ ์ต์ฅ ๊ฒฝ๋ก ๋ฌธ์
์ญ์ ๊ณ ์๋๋ก์์ ์๋์ฐจ๋ฅผ ๋ชฐ๊ณ ์ด์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์. ์ด๋ฒ ์ฌํ์ ๋๋ฃจ๋๋ฃจ ์ฌ๋ฌ ๋์๋ฅผ ๋ง์ด ๋ค๋ฆฌ๋ฉด์ ์ต๋ํ ๋ฆ๊ฒ ๋ชฉ์ ์ง์ ๋์ฐฉํ๊ณ ์ ํ๋ค. ์์ธ์์ ๊ฐ๋ฆ๊น์ง ๊ฐ๋ ์ต์ฅ ๊ฒฝ๋ก๊ฐ ๋์ , ๊ด์ฃผ, ๋ถ์ฐ, ๋๊ตฌ, ์์ฃผ๋ฅผ ์ฐจ๋ก๋ก ๊ฒฝ์ ํด์ผ ํ๋ค๋ฉด ๋ถ์ฐ์์ ์์ฃผ๋ก ๊ฐ๋ ์ต์ฅ ๊ฒฝ๋ก๋ ๋ฐ๋์ ๋๊ตฌ๋ฅผ ํฌํจํ๋๊ฐ? ์๋ ์ ์๋ค. ์ฆ ์ต์ฅ ๊ฒฝ๋ก ๋ฌธ์ ๋ ์ต์ ๋ถ๋ถ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์๋๋ค.
๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
๊ฐ๋ฅํ ์ ์ ์์ ๋์ ์ ๋ฐ๊ธฐ
ํฐ ์ก๋ฉด ๋์ ๋ถํฐ(์์ฌ์ ๋ถ๋ฆฐ๋ค!) ์ฐจ๋ก๋ก ์ ํํ์ฌ ๋จ์ ๊ฑฐ์ค๋ฆ๋ ์ก์๋ณด๋ค ์์ ๊ฒฝ์ฐ ํด๋ต์ ํฌํจ์์ผ ๋๊ฐ๋ฉด ๋๋ค
1
2
3
4
5
6
7
8
9
10
11
int coin_change_making_GM(int change) {
int solution = 0, coin = 500;
while (true) {
if (change >= coin) {
solution++;
change = change - coin;
if (change == 0) return solution;
}
else coin = select_next(coin);
}
}
ํญ์ ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์๋๊ฐ? : NO 130์์ง๋ฆฌ ๋์ ์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ฑฐ์ค๋ฆ๋์ด 150์์ธ ๊ฒฝ์ฐ [์๊ณ ๋ฆฌ์ฆ 2.2]๋ 3๊ฐ{130์, 10์, 10์}๋ผ๋ ๋ต์ ๋ด๋์ง๋ง ์ต์ ํด๋ 2๊ฐ{100์, 50์} ์ต์ ๋ถ๋ถ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๊ฐ? : YES But, ๋ถ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๋ชจ๋ ์์๋ณด๊ณ ๊ทธ ์ค์ ์ต์ ํด๋ฅผ ์ฐพ์์ผ ํ๋๋ฐ ์์ฌ์์ด ๋ฐฉ๋ฒ์์๋ ์ผ๋จ ๋์ ์ ๊ฑฐ์ฌ๋ฌ์ฃผ๊ณ ๋์ ๋ถ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ค ๋ณด๋ ์ต์ ํด๋ฅผ ์ป์ ์ ์๊ฒ ๋จ
ํญ์ ์ต์ ํด๋ฅผ ๊ตฌํ ์ ์๋๊ฐ? X
150; 130, 10, 10 < 100, 50
์ต์ ๋ถ๋ถ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๊ฐ?
์ต์์ ์ฅํธ๋ฆฌ
๐ซ ์ต์ ์ ์ฅ ํธ๋ฆฌ
- ์ ์ฅ ํธ๋ฆฌ
- ์ฃผ์ด์ง ์ฐ๊ฒฐ ๊ทธ๋ํ์์ ์ฌ์ดํด์ ํ์ฑํ๋ ๊ฐ์ ์ ์ ๊ฑฐํ์ฌ ๋ง๋ ํธ๋ฆฌ
- ์ ์ ์ ์๊ฐ n ๊ฐ์ด๋ฉด ์ ์ฅ ํธ๋ฆฌ์ ๊ฐ์ ์๋ n-1 ๊ฐ
- ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์๋ ๊ทธ๋ํ(์ฌ์ดํด์์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ ํธ๋ฆฌ ํน์ฑ์ ๊ฐ์ง)
- ํ์ฉ ์) ๊ฐ ์ ์ ์ด ๋์๋ฅผ ๋ํ๋ด๊ณ ๊ฐ์ ์ด ๋๋ก๋ฅผ ๋ํ๋ธ๋ค๋ฉด ์ ์ฅ ํธ๋ฆฌ๋ ๋ชจ๋ ๋์๋ค์ ์ฐ๊ฒฐํ๋ ์ต์ํ์ ๋๋ก๋ง
- ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST: minimum spanning tree)
- ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ(MCST: minimum cost spanning tree)
- ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์๊ฐ ๋๋ ์ ์ฅ ํธ๋ฆฌ
- ํ์ฉ ์
- โ์ต์ํ์ ๋น์ฉ์ผ๋ก ๋ชจ๋ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก๋ง์ ๊ฑด์คํ๋ผโ
- โ๋๋ก์ ๊ธธ์ด๋ฅผ ์ต์๋ก ํ๋ฉด์ ๋ชจ๋ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก๋ง์ ๊ฑด์คํ๋ผโ
- ๋๋ก๋ง, ํต์ ๋ง, ์ ํต๋ง, ๋ฐฐ๊ด ๋ฑ ๋คํธ์ํฌ ์์์ ๋น์ฉ, ๊ฑฐ๋ฆฌ, ์๊ฐ ๋ฑ์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ทธ๋ํ๋ฅผ ์ด์ฉํ์ฌ ์ต์ ์ ์ฅ ํธ๋ฆฌ ๊ตฌํ๊ธฐ
- ๋ฌธ์ : ๋ฐฉ ํฅ์ฑ์ด ์๋ ์ฐ๊ฒฐ๋ ๊ฐ์ค์น ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์๊ฐ ๋๋ ์ ์ฅ ํธ๋ฆฌ ๊ตฌํ๊ธฐ
- ๋ฌด์์ ๊ธฐ๋ฒ
- ๊ฐ๋ฅํ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ชจ๋ ๊ตฌํ ๋ค์, ์ต์ ๋น์ฉ์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ ํ
- ๋ชจ๋ ์ ์ ๊ฐ์ ๊ฐ์ ์ด ์๋ ์์ ๊ทธ๋ํ์ ๊ฒฝ์ฐ ์ ์ฅ ํธ๋ฆฌ์ ์๋ n^(n-2)
- ์ ์ ์ด 10 ๊ฐ: 1์ต ๊ฐ์ ์ ์ฅ ํธ๋ฆฌ
- ์ ์ ์ด 19 ๊ฐ: ์ฝ 5.4 ร10^21 ๊ฐ์ ์ ์ฅ ํธ๋ฆฌ
- ์์ฌ์์ด ๋ฐฉ๋ฒ
- ํ๋ฆผ(Prim)์ ์๊ณ ๋ฆฌ์ฆ
- ํฌ๋ฌ์ค์ปฌ(Kruskal)์ ์๊ณ ๋ฆฌ์ฆ
๐ซ ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ๋ฌ
@ U ์ค๊ฐ๊ณ ์ฌ ์ถ์ : ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ๋ฌ ๊ณผ์ (์ต์์ ์ฅํธ๋ฆฌ, ๊ฐ์ค์น๊ฐ ์ค๋ณต๋๋๊ฒ ์๋ค๋ฉด ์ด๋ค ์๊ณ ๋ฆฌ๋ฌ์จ๋ ๊ฐ์ ๋ชจ์ ๊ฐ์ = ํ๋ฆผ ์๊ณ ๋ฆฌ๋ฌ ๊ฒฐ๊ณผ์ ๋๊ฐ์)
์ต์ ์ ์ฅ ํธ๋ฆฌ์ ๊ตฌํ๋, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ๋ฌ์ ์ผ์ข
- ์ ํ ์์
, ๊ฐ ๋จ๊ณ์์ ๊ฐ์ค์น๊ฐ ์ต์์ธ ๊ฐ์ ์ ์ ํ
- ๋ฐฉ๋ฒ 1. ์ต์๊ฐ ์ฐพ๊ธฐ ์๊ณ ๋ฆฌ๋ฌ์ ์ฌ๋ฌ ๋ฒ ์คํ (x)
- ๋ฐฉ๋ฒ 2. ๋ฏธ๋ฆฌ ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น์ ๋ฐ๋ผ ์ ๋ ฌ
- i.e. a-b 1, a-d 2, b-d 2, b-c 3, c-d 4
- ํ๋น์ฑ ์กฐ์ฌ, ์ ํํ ๊ฐ์ ๋๋ฌธ์ ์ฌ์ดํด์ด ๋ง๋ค์ด์ง๋ค๋ฉด ์ ํํ ๊ฐ์ ์ ๋ฒ๋ฆผ
- ๋ฐฉ๋ฒ 1. ๊น์ด ์ฐ์ ํ์ DFS์ ์ด์ฉ (x)
- ๋ฐฉ๋ฒ 2. ๋ฐฐํ์ /์๋ก์ ์งํฉ (Disjoint Set)์ ๊ฐ๋ ์ ์ด์ฉํ๋ Union-Find ์ฐ์ฐ
๋ฐ์๋ค์ฌ์ง ๊ฐ์ ์ ์๊ฐ n-1๊ฐ๊ฐ ๋๋ฉด ์ข
๋ฃ
โ n๊ฐ์ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ๋ ํ๋ก์คํธ์์ ์ถ๋ฐํ์ฌ ์ต์ข
1๊ฐ์ ํธ๋ฆฌ๋ฅผ ์์ฑ
Union-find
Disjoint Set ์๋ก์ ์งํฉ์ ํํํ๋ ์๋ฃ๊ตฌ์กฐ
Union
์๋ก ๋ค๋ฅธ ๋ ์งํฉ์ ๋ณํฉ
Find
์งํฉ ์์๊ฐ ์ด๋ค ์งํฉ์ ์ํด์๋์ง
์ด๋ค ์ ๋ ฌ ์๊ณ ๋ฆฌ๋ฌ์ ์ฐ๋๊ฐ ์๊ฐ์ ์ํฅ์
@ TODO : ๋ ์กธ์๋ค. ๋ค์ ๊ณต๋ถ.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
edge_set kruskal_MST(edge_set E, int n)
{
sort(E); // A
edge_set MST_E = { };
for (i=0; i๏ผn; i++) init_set(i); // B, n๊ฐ์ ์งํฉ(ํธ๋ฆฌ)์ ์์ฑ
while (MST_E์ ๊ฐ์ ์ ๏ผ n-1)
{
(u, v) = E์ ์ต์ ๊ฐ์ค์น ๊ฐ์ ;
E = E - {(u, v)} ;
if (find(u) โ find(v)) // u์ v๊ฐ ๋ค๋ฅธ ์งํฉ(ํธ๋ฆฌ) ์์
{
MST_E = MST_E โช {(u, v)} ;
union(u, v); // ๋ ์งํฉ(ํธ๋ฆฌ)์ ํฉ๋ณ
}
}
return MST_E;
}
- ์ฐ์ฐ
- ์ต์ด์ ์ ์ ํ๋๋ฅผ ์์๋ก ํ๋ ์งํฉ์ ๋ง๋๋ init_set ์ฐ์ฐ
- ์์์ ์ ์ ์ด ์ด๋ ์งํฉ์ ์์์ธ์ง๋ฅผ ์์๋ด๋ find ์ฐ์ฐ
- ๋ ์งํฉ์ ํ๋๋ก ํฉ์น๋ union ์ฐ์ฐ
- ์๊ฐ ๋ณต์ก๋(์ํ ๋ถ์)
- ํธ๋ฆฌ๋ก ๊ตฌํ๋ ์งํฉ์์ ์์์๊ธฐ๋ฐ union ์ฐ์ฐ๊ณผ ๊ฒฝ๋ก๋ถ๊ดด find ์ฐ์ฐ ์ฌ์ฉ
- ์ธ ์ฐ์ฐ์ ํฉํ์ฌ ์ ๋ถ m๋ฒ ์คํํ๊ณ init_set์ n๋ฒ ์คํํ๋ฉด O(m log*n)
- n์ด ๋งค์ฐ ํฌ๋๋ผ๋ logn ์ ์์ฃผ ์์ ์์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ O(m logn)โO(m). ์ฆ ์ธ ์ฐ์ฐ์ ์ ๋ถ m ๋ฒ์ ์คํํ ๊ฒฝ์ฐ O(m)์ด๋ฏ๋ก ์ฐ์ฐ ํ๋ํ๋ ๋น ์์์๊ฐ ๊ฑธ๋ฆผ
- ๋ณต์ก๋(์ ์ ์ ์๊ฐ n ์ด๊ณ ๊ฐ์ ์ ์๊ฐ e )
- A์์ ํต์ ๋ ฌ, ํฉ๋ณ์ ๋ ฌ, ํํ์ ๋ ฌ ๋ฑ ๊ฐ์ฅ ์ฑ๋ฅ์ด ์ฐ์ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด O(e loge)
- while ๋ฌธ์ ์ต๋ e ํ ๋ฐ๋ณต
- ํ๋ฒ ๋ฐ๋ณตํ ๋๋ง๋ค 2๋ฒ์ find ์ฐ์ฐ๊ณผ ์ต๋ 1๋ฒ์ union ์ฐ์ฐ ์คํํ๋ฏ๋ก while ๋ฌธ์ ํตํ์ด ์ต๋ 2e๋ฒ์ find ์ฐ์ฐ๊ณผ ์ต๋ e๋ฒ์ union ์ฐ์ฐ์ ์คํ
- B์ init_set ์ฐ์ฐ์ n๋ฒ ์คํ
- ์ ์ธ ์ฐ์ฐ์ ํฉํ์ฌ ์ ๋ถ n+3e๋ฒ์ ์คํํ๊ณ init_set์ ์คํ ํ์๊ฐ n์ด๋ฏ๋ก ์ํ๋ถ์์ ๋ฐ๋ผ ์๊ฐ ๋ณต์ก๋๋ O(n+3e)=O(n+e)
- ์ฐ๊ฒฐ ๊ทธ๋ํ์์๋ n-1 โค e์ด๋ฏ๋ก O(n+e) =O(e)
- ๊ฒฐ๊ตญ A์ ์ ๋ ฌ์ด ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก๋๋ฅผ ์ข์ฐ: O(eloge)
- e๋ ์ต๋ O(n2)์ด๋ฏ๋ก O(eloge)=O(elogn^2)=O(2elogn)=O(elogn)
๐ซ ํ๋ฆผ ์๊ณ ๋ฆฌ๋ฌ
@ U ์ค๊ฐ๊ณ ์ฌ ์ถ์ : ํ๋ฆผ ์๊ณ ๋ฆฌ๋ฌ ๊ณผ์ (์ต์์ ์ฅํธ๋ฆฌ, ๊ฐ์ค์น๊ฐ ์ค๋ณต๋๋๊ฒ ์๋ค๋ฉด ์ด๋ค ์๊ณ ๋ฆฌ๋ฌ์จ๋ ๊ฐ์ ๋ชจ์ ๊ฐ์ = ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ๋ฌ ๊ฒฐ๊ณผ์ ๋๊ฐ์)
์ต์ ์ ์ฅ ํธ๋ฆฌ์ ๊ตฌํ๋, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ๋ฌ์ ์ผ์ข
- ์๋ฌด ์ ์ ์์ ์์ ํธ๋ฆฌ ์ด๊ธฐํ
- ๋งค ๋จ๊ณ + (1 ๊ฐ์ , 1 ์ ์ ) ํ๋ฉฐ ํธ๋ฆฌ ์ ์ง
- MST๊ฐ ์๋ ๋ชจ๋ ์ ์ ๊ณผ ๊ฐ์ ์ ๋ํด, ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์ ํ
- ๋ชจ๋ ์ ์ ์ ํ (= n-1๊ฐ ๊ฐ์ ์ ํ) ์ ์ข ๋ฃ
ํ๋น์ฑ (์ฌ์ดํด ์กด์ฌ ์ฌ๋ถ) ์กฐ์ฌ X
MST ์๋ (์ ํ๋์ง ์์) ์ ์ ๋ง ์ ํํ๊ธฐ ๋๋ฌธ
ํ๋ ฌ or ์ธ์ /์ฐ๊ฒฐ ๋ฆฌ์คํธ, ๋ฐฐ์ด or ์ฐ์ ์์ ํ or ์ต์ ํ
- ์๊ณ ๋ฆฌ์ฆ ๊ฐ์
- ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ์ฒ๋ผ ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์ ํ
- ํฌ๋ฌ์ค์ปฌ์ ์๊ณ ๋ฆฌ์ฆ์ ํฌ๋ฆฌ์คํธ์์ ์ถ๋ฐํ์ฌ ํ๋์ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ๋ฉด ํ๋ฆผ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฒ์๋ถํฐ ๋๊น์ง ํธ๋ฆฌ๋ฅผ ์ ์ง
- ์๋ฌด ์ ์ ํ๋๋ฅผ ์ ํํ์ฌ ์์ ํธ๋ฆฌ๋ก ์ด๊ธฐํํ๊ณ ๋งค ๋จ๊ณ์์ ๊ฐ์ ํ๋์ ์ ์ ํ๋๋ฅผ ๋ถ์ฌ๋๊ฐ๋ฉด์ ํธ๋ฆฌ๋ฅผ ์ ์ง
- ๋ชจ๋ ์ ์ ์ ์ ํํ๋ฉด(n-1๊ฐ์ ๊ฐ์ ์ ์ ํํ๋ฉด) ์ข ๋ฃ
- ํ๋น์ฑ ์กฐ์ฌ(์ฌ์ดํด์ด ์กด์ฌํ๋์ง ๊ฒ์ฌ)๊ฐ ์์
- ๊ฐ์ (X, V)๋ฅผ ์ ํํ๋ ์๊ฐ, ์ ์ X, Y, V ๋ฅผ ํฌํจ ํ๋ ์ฌ์ดํด์ด ์์ฑ๋๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ ๋ค๋ฉด ์ ์ V๋ ์ด๋ฏธ MST์ ํฌํจ๋์ด ์์ด์ผ ํ๋ฉฐ ๊ฐ์ (X, V)๋ฅผ ์ ๋๋ก ์ ํํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฌ์ดํด์ ์์ฑํ์ง ์๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
// ๋จ์ํํ ํ๋ฆผ์ MST(์์ฌ์์ด ๋ฐฉ๋ฒ)
edge_set prim_MST_1(edge_set E, vertex s)
{
edge_set MST_E = { };
vertex_set MST_V = {s};
loop (n-1)
{ // n-1๋ฒ ๋ฐ๋ณต
(u, v) = E์ ์ต์ ๊ฐ์ค์น ๊ฐ์ , ๋จ u โ MST_V, v โ MST_V; MST_E = MST_E โช (u, v) ; // A
MST_V = MST_V โช v ;
}
return MST_E;
}
- ์ต์ ๊ฐ์ค์น ๊ฐ์ ์ ์ ํํ๋ ๋ฐฉ๋ฒ(A)
- ์ ์ ๋ณ๋ก ์ต์ ๊ฐ์ค์น๋ฅผ ๊ด๋ฆฌ(๊ฐ์ ์ ๊ฐ์ค์น ์ ๋ณด๋ฅผ ์ ์ ์ ๋ถ์ฌํ๊ณ ๊ฐ ๋จ๊ณ์์ ์ ์ ์ ์ ํ)
- MST์ ์์ง ํฌํจ๋์ง ์์ ๊ฐ ์ ์ v์ ๋ํด distance(v)์ nearest(v) ๊ฐ์ ์ง์
- distance(v): ์ด๋ฏธ MST์ ์ํ ์ ์ ๊ณผ v์ฌ์ด์ ๊ฐ์ ๊ฐ์ค์น ์ค ์ต์๊ฐ
- nearest(v): ๊ทธ ๋์ MST์ ์ํ ์ ์
- ์ ์ u๊ฐ ์ ํ๋ ๋๋ง๋ค u์ ์ธ์ ํ์ผ๋ ์์ง MST์ ํฌํจ๋์ง ์์ ๋ชจ๋ ์ ์ w์ ๋ํด ์ฌ๊ณ์ฐ
distance(w) = minimum {distance(w), weight(u, w)} ๋จ, weight(u, w) = ๊ฐ์ (u,w)์ ๊ฐ์ค์น nearest(w) = u if distance(w)๊ฐ ๋ณ๊ฒฝ
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
27
28
29
30
31
32
33
//ํ๋ฆผ์ MST(์์ฌ์์ด ๋ฐฉ๋ฒ)
// ๋ณต์ก๋: ฮ(n2) , select_min ๋น์ฉ ์ธ์ ํ๋ ฌ์ ๊ธฐ๋ฐ
void prim_MST_2(int graph[ ][MAX], int n, int s)
{
bool MST_V[MAX] ;
int distance[MAX], nearest[MAX], i, u, w;
for (i = 0; i ๏ผ n; i++)
{ // ์ด๊ธฐํ
MST_V[i] = false;
distance[i] = graph[s][i]; nearest[i] = s;
}
MST_V[s] = true;
loop (n-2)
{ // n-2๋ฒ ๋ฐ๋ณต
u = select_min(distance, n, MST_V); MST_V[u] = true;
for (w = 0; w ๏ผ n; w++)
if (MST_V[w] == false)
if (graph[u][w] ๏ผ distance[w])
{
distance[w] = graph[u][w];
nearest[w] = u;
}
}
}
int select_min(int distance[ ], int n, bool MST_V[ ])
{
int i, min = โ, min_index = 0;
for (i = 0; i ๏ผ n; i++)
if (distance[i] ๏ผ min && MST_V[i]==false)
min = distance[i]; min_index = i;
return min_index;
}
๊ทธ๋ํ: ์ธ์ ํ๋ ฌ์ ์ ์ฅ distance: 1์ฐจ์ ๋ฐฐ์ด (์ฆ, select_min ์ฐ์ฐ: ๋ฐฐ์ด ์์ฐจํ์) ฮ(n2)
๋์ฝ ์ฌ์ง
๊ทธ๋ํ: ์ธ์ ๋ฆฌ์คํธ์ ์ ์ฅ distance: ์ต์ ํํ (์ฆ, select_min ์ฐ์ฐ: ์ต์ํํ์ ์ญ์ ์ฐ์ฐ) ๏ช delete_min_heap ์ฐ์ฐ๊ณผ ๏ซ decrease_key ์ฐ์ฐ์ ์คํ ์๊ฐ์ด ์ ์ฒด ์คํ ์๊ฐ์ ์ข์ฐ ๏ช (์ค10) loop๋ n-2ํ ๋ฐ๋ณต. (์ค11)์ delete_min_heap ํจ์๋ O(logn)์ด๋ฏ๋ก delete_min_heap ํจ์์ ์ด ์คํ ์๊ฐ์ O(nlogn) ๏ซ loop๊ณผ for์ ๋ฌถ์ด์ ๋ถ์. for์ โu์ ์ธ์ ํ ๋ชจ๋ ์ ์ ์ ๋ํดโ๋ผ๋ ์๋ฏธ๋ก u์ ์ธ์ ํ ๊ฐ์ ์๋งํผ ๋ฐ๋ณต. ๋ฐ๋ผ์, for์ ์ด ๋ฐ๋ณต ํ์๋ O(e). (์ค16)์ decrease_key ํจ์๋ O(logn). ๋ฐ๋ผ์ decrease_key ํจ์์ ์ด ์คํ ์๊ฐ์ O(elogn) ๏ช+๏ซ=O((n+e)logn), ์ฐ๊ฒฐ ๊ทธ๋ํ์์๋ n-1โคe์ด๋ฏ๋ก O((n+e)logn)=O(elogn)
1
2
// ์ธ์ ๋ฆฌ์คํธ์ ์ด์ง ํํ๋ฅผ ์ฌ์ฉํ ํ๋ฆผ์ MST (์์ฌ์์ด ๋ฐฉ๋ฒ)
// ๋์ฝ ์ฌ์ง
๐ซ ์ต์ ์ ์ฅ ํธ๋ฆฌ ๋น๊ต
- ๋ ๋ฐฉ๋ฒ ๋ชจ๋ ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ์ ์ฐ์ ์ํ๋ ์ ๋ต์ ์ฌ์ฉ, but
- ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ: ํฌ๋ฆฌ์คํธ์์ ํธ๋ฆฌ๋ก ๋ณํ
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ: ํธ๋ฆฌ์ ๋ชจ์ต์ ๋๊น์ง ์ ์ง
- ๋ณต์ก๋
- ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ
- ๊ทธ๋ํ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์๊ณผ๋ ๊ด๊ณ์๋ ๋ณต์ก๋
- ๊ฐ์ ๋ค์ ์ ๋ ฌํ ๋ ์ฌ์ฉํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ: ๊ทธ๋ํ์ ์ ์ฅ ๋ฐฉ์๊ณผ ์ต์๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง
- ํฌ๋ฌ์ค์ปฌ ์๊ณ ๋ฆฌ์ฆ
๋์ฝ ์ฌ์ง ํ
๐ซ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ๋ฌ
๋จ์ผ ์์์ ์ต๋จ ๊ฒฝ๋ก
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ๋ฌ
@ U ์ค๊ฐ๊ณ ์ฌ ์ถ์ : ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ๋ฌ ์คํ๊ณผ์ (์ด๋ค ์ ์ ์ ์ ํํ๋์ง distance/)
ํํ๋ง ์ฝ๋ฉ
๋ฌด์์ค ์์ถ์ ์ฐ์ด๋ ์ํธ๋กํผ ๋ถํธํ ๋ฐฉ๋ฒ
@ U ์ค๊ฐ๊ณ ์ฌ ์ถ์ : ์ฃผ์ด์ง ์ฝ๋๋ฅผ ํํ๋ง ์ฝ๋ฉ์ ํตํด ์์ถํ์์ค.
TSP
NP-Complete ์์ ๋ฌธ์
~ ์๋ฌดํผ ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฌธ์
โ ํน๋ณํ ๊ฐ ์ ์ธํ๊ณ ์ฒ๋ฆฌ
โ ์ต์ ํด์ ๊ทผ์ฌํ ๊ฐ
@ Theory of Computation ๊ณ์ฐ ์ด๋ก ์์ ์ฃผ๋ก ํ๋ ์ด์ผ๊ธฐ
70~80๋
์
์ํ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊ฒ์ธ๊ฐ?
์ ํํ๋ ๋ฌธ์
ํ ์ ์๋ ๋ฌธ์ ์ ์๋ ๋ฌธ์
@ TM : Turing Machine
Tracktable
Intracktable ์๋ฌด๋ฆฌ ๋นจ๋ฆฌ ํ์ด๋
Polynomial Time ๋คํญ์ ์๊ฐ :
O(n^k) (์์, ๋ก๊ทธ, ์ง์ ํจ์๋ฅผ ํฌํจ)
n^3 ์ ๋๋ง ๋์ด๋ ๋ณต์กํ๊ธดํ๋ฐ, ์ด๋ก ์ ์ผ๋ก๋
P Class : ํ๊ธฐ ์ฌ์ด ๋ฌธ์ , ๋คํญ์ ์๊ฐ ๋ด์ ํ ์ ์๋ ๋ฌธ์
Polynomial Time Class
๊ฒฐ์ ์ TM ์ ์ด์ฉํด ๋คํญ์ ์๊ฐ ๋ด์ ํ ์ ์๋ ๋ฌธ์
NP Class :
NonPolynomial Time Class
๋น๊ฒฐ์ ์ TM ์ ์ด์ฉํด ๋คํญ์ ์๊ฐ ๋ด์ ํ ์ ์๋ ๋ฌธ์
๋ณ๋ ฌ์ฒ๋ฆฌ ํ ์ ์๋ ๋ฌธ์ , ์ปดํจํฐ ๋ง๋ค ๋ค๋ฅธ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ ๋ฌธ์
๋คํญ์ ์๊ฐ ๋ด์ ํด๋ต์ ๊ฒ์ฆํ ์ ์๋ ๋ฌธ์ (๋๊ตฐ๊ฐ ๋ธ ํด๋ต์ ๋ง๋ ์ง ์๋ ์ง ๊ฒ์ฆํ ์ ์๋)
P ์ด๋ฉด NP ์ผ๊ฒ์ด๋ผ๊ณ ๊ฐํ ์ถ์ธก
~ ์๊ฐ ๋ด์ ํ ์ ์์ผ๋ฉด, ~ ์๊ฐ ๋ ๊ฒ์ฆํ ์ ์์ ๊ฒ์ด๋ผ๋
P ๊ฐ NP ์ ๋ถ๋ถ์งํฉ
@ ์๋ ์ฌ๋ก๋ฅผ ์์ง ๋ฐ๊ฒฌํ ์ ์์ง๋ง, ์ํ์ ์ผ๋ก ์ฆ๋ช
๋์ง๋ ์์
NP ์ค์ P ๊ฐ ์๋ ์ ๋ค ์ค, NP-Complete ๋ผ๋ ๋ฌธ์ ๊ฐ ์์
NP-Complete ๋ฌธ์ ๋ค ์ค ์ด๋ ํ๋๋ผ๋ P ๋ก ํ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด,
๊ทธ ๋ฌธ์ ๋ ์ ๋ถ P ๋ก ํ๋ฆฌ๋ ๋ฌธ์ ์ธ ์ง๋จ
A ๋ฌธ์ โ B ๋ฌธ์ โ C ๋ฌธ์ โฆ Reduce
~ ์๊ฐ ๋ด์ ์ถ์ฝ(= ์นํ) ๋ ์ ์์
C ๋ฌธ์ ๊ฐ P ๋ก ํ๋ฆฐ๋ค๋ฉด, A, B ๋ฌธ์ ๋ P๋ก ํ๋ฆผ
~ ์๊ฐ * ์์ = ~ ์๊ฐ ๋ด์ ์ถ์ฝ(= ์นํ) ๋๊ธฐ์
TSP
Traveling Salesman Problem
์ฌํํ๋ ์ธํ์(์ธ์ผ์ฆ๋งจ) ๋ฌธ์
๋ชจ๋ ๋์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๊ณ ๋์์ค๋ ์ต๋จ ๊ฒฝ๋ก
TSP ์กฐ๊ฑด
- ๋์นญ์ฑ : ๋ ๋์ ์ฌ์ด ๊ฐ ๊ฑฐ๋ฆฌ ์๋ฐฉํฅ์ผ๋ก ๋์ผ โ ๋ฐฉํฅ์ฑ์ด ์๋ ๊ฐ์ค์น ๊ทธ๋ํ
- Triangle Inequality ์ผ๊ฐ ๋ถ๋ฑ์ ๋ง์กฑ : ์ผ๊ฐํ์ผ๋ก ์์นํ ์ธ ๋์๋ฅผ ์๋ ๋๋ก ๊ฐ์ด๋ฐ ๋ ๋๋ก์ ๊ธธ์ด์ ํฉ์ ๋ค๋ฅธ ํ ๋๋ก์ ๊ธธ์ด๋ณด๋ค ๊ฐ๊ฑฐ๋ ๊ธธ๋ค๋ ๊ฒ
- ์์ ๊ทธ๋ํ : ๋ชจ๋ ๋์๋ค ๊ฐ์ ๋ฐ๋์ ๋๋ก๊ฐ ์กด์ฌ
Brute Force => O(n!) ์ค ๊ฐ์ฅ ์์
๋์ ๊ณํ๋ฒ => O(n^2 * 2^n)
๊ทผ์ฌ ์๊ณ ๋ฆฌ๋ฌ
Nearest Neighbor Algorithm ์ต๊ทผ์ ์ด์ ์๊ณ ๋ฆฌ๋ฌ
์ ๊ฐ ๊ณณ ์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณณ ๋ถํฐ
๊ตฌํ ์ฌ์, ๋๋ฆ ์งง์ ๊ฒฝ๋ก๋ฅผ ์งง์ ์๊ฐ์
์์ ๊ทธ๋ํ๊ฐ ์๋๋ผ๋ฉด ๊ฒฝ๋ก๊ฐ ์กด์ฌํด๋ ๋ชป ์ฐพ๋ ๊ฒฝ์ฐ๊ฐ
๊ทผ์ฌ ์๊ณ ๋ฆฌ๋ฌ
MST ์ด์ฉ ์๊ณ ๋ฆฌ๋ฌ
๊ธฐ๋ณธ ์์ด๋์ด
MST๋ ์ฐ๊ฒฐ๋์ด ์์, ์๋์ ์ผ๋ก ๋ฎ์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ๋ค๋ก ๊ตฌ์ฑ
โ TSP์ ์ต์ ํด์ ๊ฐ๊น์ธ ์๋
But, MST๋ ์ ํ ๊ตฌ์กฐ๊ฐ ์๋๋ฏ๋ก, ์ฐจ๋ก๋ก ๋ฐฉ๋ฌธ ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ
โ SO, MST๋ก๋ถํฐ ์ ํ์์๋ฅผ ๋ง๋ฆ (DFS, ์ผ๊ฐ ๋ถ๋ฑ์ ์ด์ฉ)
โ โ 1213 ๋ฐฉ๋ฌธ์ด๋ผ๋ฉด, ์ ์ 2 1 3 ์ ์ผ๊ฐ ๋ถ๋ฑ์์ ๋ง์กฑํ๋ฏ๋ก ๋์๊ฐ ํ์ ์์ด ์ ์ 2์์ 3์ผ๋ก ๋ฐ๋ก ๋ฐฉ๋ฌธ
๋ฐฉ๋ฒ
MST ๊ตฌํ๊ณ
S ์ถ๋ฐ์ ์ผ๋ก ๋ถํฐ DFS ์คํ
๋ฐฉ๋ฌธ ์์์์ ๋ ๋ฒ ์ด์ ์ค๋ณต ๋ฐฉ๋ฌธ๋๋ ์ ์ ์ ๊ฑฐ (๋ง์ง๋ง ๋ฐฉ๋ฌธ ์ถ๋ฐ์ ์ ์ธ)
๊ทผ์ฌํด <= ~ < MST ๊ฐ์ค์น < ์ต์ ํด
MST ๊ฐ์ค์น + 1 ๊ฐ์ = Cycle (์ต์ ํด)