ํฌ์ŠคํŠธ

๐ŸŒ“ Greedy ๊ทธ๋ฆฌ๋””

@ 6~N์ฐจ์‹œ
@ Chapter 2

๐Ÿ’ซ Greedy ๊ทธ๋ฆฌ๋”” (์š•์‹ฌ์Ÿ์ด)


์ตœ์ ํ•ด, ์ตœ๊ณ  ์ข‹์€ ํ•ด๋‹ต

๋ถ€๋ฌธ์ œ
์›๋ž˜์˜ ๋ฌธ์ œ์™€ ๋˜‘๊ฐ™์€ ์„ฑ์งˆ์„ ๊ฐ€์ง€๋ฉด์„œ ๋‹จ์ง€ ํฌ๊ธฐ๋งŒ ์ž‘์€ ๋ฌธ์ œ

  • ์š•์‹ฌ์Ÿ์ด ๋ฐฉ๋ฒ•์˜ ๊ฐœ์š”
    • ์ผ๋ จ์˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ (์ตœ์ )ํ•ด๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ์š”์†Œ๋“ค์„ ๋ชจ์Œ
    • ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ์ „์ฒด์ ์œผ๋กœ ์ตœ์ ์ธ์ง€๋Š” ํŒ๋‹จํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ์ตœ์ ์ด๋ผ๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒฐ์ •์„ ํ•จ. ์ฆ‰ ๊ณผ๊ฑฐ๋‚˜ ๋ฏธ๋ž˜๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ , ์˜ค์ง ํ˜„์žฌ์˜ ์ตœ๋Œ€ ๋งŒ์กฑ๋งŒ์„ ์ถ”๊ตฌ(่ฟ‘่ฆ–็œผ)
    • ์ „์ฒด๋ฅผ ๊ณ ๋ ค์น˜ ์•Š๊ณ  ํ˜„์žฌ๋งŒ์„ ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋น„๊ต์  ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„
    • ํ•œ๋ฒˆ ๋‚ด๋ฆฐ ๊ฒฐ์ •์€ ์ทจ์†Œโ€ข๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๋‹ค๋ฅธ ์ตœ์ ํ™” ๋ฌธ์ œ ํ•ด๊ฒฐ๊ธฐ๋ฒ•๋ณด๋‹ค ๋น ๋ฆ„
    • ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ์š•์‹ฌ์Ÿ์ด ๋ฐฉ๋ฒ•์— ๊ธฐ๋ฐ˜ํ•œ ๊ทผ์‚ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ ๋ ค ๊ฐ€๋Šฅ

Greedy
์ง€๊ธˆ ์ตœ์ ํ•ด ์„ ํƒ
์ง€๊ธˆ๋งŒ์„ ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋น„๊ต์  ๊ตฌํ˜„ ์‰ฌ์›€
์ทจ์†Œ/๋ณ€๊ฒฝ X โ†’ ๋น„๊ต์  ๋น ๋ฆ„
์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ๊ทผ์‚ฌ ์•Œ๊ณ ๋ฆฌ๋“ฌ

  • ์š•์‹ฌ์Ÿ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด
    • ์ตœ์ ํ™” ๋ฌธ์ œ โˆง์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ โˆง ์ตœ์  ์„ ํƒ
    • ์ตœ์ ํ™” ๋ฌธ์ œ(optimization problem)
      • ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋Œ€์•ˆ ์ค‘์—์„œ ๊ฐ€์žฅ ์ข‹์€ ํ•ด๋‹ต(์ตœ์ ํ•ด)์„ ๊ณ ๋ฅด๋Š” ๋ฌธ์ œ
      • ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ธธ์„ ์ฐพ์•„๋ผ, ์ตœ์†Œ ๋น„์šฉ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ผ, โ€ฆ
    • ์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ(optimal substructure)
      • ๋ฌธ์ œ(problem)์˜ ์ตœ์ ํ•ด๊ฐ€ ๋ถ€๋ฌธ์ œ(subproblem)๋“ค์˜ ์ตœ์ ํ•ด๋กœ๋ถ€ํ„ฐ ํšจ์œจ์ ์œผ๋กœ ์ƒ์„ฑ
      • ๋ถ€๋ฌธ์ œ๋Š” ์›๋ž˜์˜ ๋ฌธ์ œ์™€ ๋˜‘๊ฐ™์€ ์„ฑ์งˆ์„ ๊ฐ€์ง€๋ฉด์„œ ๋‹จ์ง€ ํฌ๊ธฐ๋งŒ ์ž‘์€ ๋ฌธ์ œ
    • ์ตœ์  ์„ ํƒ
      • ๊ฐ ๋‹จ๊ณ„์—์„œ ๋‚ด๋ฆฌ๋Š” ์„ ํƒ์ด ์ตœ์ ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ˆ˜ํ•™์  ๊ท€๋‚ฉ๋ฒ•์œผ๋กœ ์ฆ๋ช…
  • ์กฐ๊ฑด (1 && 2 && 3)
    • ์ตœ์ ํ™” ๋ฌธ์ œ Optimization Problem
      • ์ตœ์ ํ•ด ๋ฌธ์ œ (๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ธธ, ์ตœ์†Œ ๋น„์šฉ ์‹ ์žฅ ํŠธ๋ฆฌ, โ€ฆ)
    • ์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ Optimal Substructure
      • ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด, ๋ถ€๋ฌธ์ œ๋“ค์˜ ์ตœ์ ํ•ด๋ณด๋ฃจํ„ฐ ํšจ์œจ์ ์œผ๋กœ ์ƒ์„ฑ
    • ์ตœ์  ์„ ํƒ
      • ๊ฐ ๋‹จ๊ณ„ ์„ ํƒ์ด ์ตœ์ ์ž„์„ ์ˆ˜ํ•™์  ๊ท€๋‚ฉ๋ฒ•์œผ๋กœ ์ฆ๋ช…

๊ทธ๋ฆฌ๋””์˜ ๊ตฌ์„ฑ

  1. ์„ ํƒ ์ž‘์—…
    • ํ˜„ ์ƒํƒœ์—์„œ ์ตœ์ ํ•ด์— ํฌํ•จ์‹œํ‚ฌ ๋Œ€์•ˆ์„ ์„ ํƒ
  2. ํƒ€๋‹น์„ฑ ์กฐ์‚ฌ
    • ์„ ํƒ๋œ ํ•ด๊ฐ€ ์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€์‚ฌ
  3. ํ•ด๋‹ต ์กฐ์‚ฌ
    • ์›๋ž˜์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌ
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. ์„ ํƒ ์ž‘์—…, ๊ฐ ๋‹จ๊ณ„์—์„œ ๊ฐ€์ค‘์น˜๊ฐ€ ์ตœ์†Œ์ธ ๊ฐ„์„ ์„ ์„ ํƒ
    • ๋ฐฉ๋ฒ• 1. ์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ (x)
    • ๋ฐฉ๋ฒ• 2. ๋ฏธ๋ฆฌ ๋ชจ๋“  ๊ฐ„์„ ์„ ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ ์ •๋ ฌ
      • i.e. a-b 1, a-d 2, b-d 2, b-c 3, c-d 4
  2. ํƒ€๋‹น์„ฑ ์กฐ์‚ฌ, ์„ ํƒํ•œ ๊ฐ„์„  ๋•Œ๋ฌธ์— ์‚ฌ์ดํด์ด ๋งŒ๋“ค์–ด์ง„๋‹ค๋ฉด ์„ ํƒํ•œ ๊ฐ„์„ ์„ ๋ฒ„๋ฆผ
    • ๋ฐฉ๋ฒ• 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 ์กฐ๊ฑด

  1. ๋Œ€์นญ์„ฑ : ๋‘ ๋„์‹œ ์‚ฌ์ด ๊ฐ„ ๊ฑฐ๋ฆฌ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋™์ผ โ†’ ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ๊ฐ€์ค‘์น˜ ๊ทธ๋ž˜ํ”„
  2. Triangle Inequality ์‚ผ๊ฐ ๋ถ€๋“ฑ์‹ ๋งŒ์กฑ : ์‚ผ๊ฐํ˜•์œผ๋กœ ์œ„์น˜ํ•œ ์„ธ ๋„์‹œ๋ฅผ ์ž‡๋Š” ๋„๋กœ ๊ฐ€์šด๋ฐ ๋‘ ๋„๋กœ์˜ ๊ธธ์ด์˜ ํ•ฉ์€ ๋‹ค๋ฅธ ํ•œ ๋„๋กœ์˜ ๊ธธ์ด๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๊ธธ๋‹ค๋Š” ๊ฒƒ
  3. ์™„์ „ ๊ทธ๋ž˜ํ”„ : ๋ชจ๋“  ๋„์‹œ๋“ค ๊ฐ„์— ๋ฐ˜๋“œ์‹œ ๋„๋กœ๊ฐ€ ์กด์žฌ

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 (์ตœ์ ํ•ด)

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.