알고리즘 개론_06.19

Download Report

Transcript 알고리즘 개론_06.19

알고리즘 개론
2014.6.19.
15:15 시작
장준영
1
상/중/하
• 상
– 나는 알고리즘을 매우 잘 알고, 좀 더 어려운
난이도의 문제들을 보고 싶다.
• 중
– 어느정도 알고리즘을 구현해본 적이 있다.
• 하
– 알고리즘의 A조차 모른다.
2
다룰 내용
3
이 발표의 목적
• 알고리즘 수업에 도움이 된다.
• 다양한 레벨의 알고리즘을 경험
–
–
–
–
필수적으로 알아야 하는 것
약간 난이도가 있는 문제들
매우 어려운 문제들(수업에서 일부를 다룸)
알고리즘 대회
4
알고리즘이 뭔가요?
5
알고리즘
• 어떠한 문제를 해결하기 위한 여러 동작들의 유한한 모임
– (from 위키백과)
• 문제 해결 절차를 체계적으로 기술한 것
– (from 문병로 교수님 ppt – 이하 강의자료)
6
알고리즘을 왜 공부해야 하는가?
알고리즘의 필요성
7
알고리즘의 필요성?
• 특정한 문제를 위한 알고리즘의 습득
• 체계적으로 생각하는 훈련
• 지적 추상화의 레벨 상승
– Intellectual abstraction
– 연구나 개발에 있어 정신적 여유를 유지하기 위해 매우 중요한
요소
• (from 강의자료)
8
알고리즘의 필요성!
• (1) 바보는 되지 말자.
– >아주 기본적인 알고리즘은 필수!
9
알고리즘의 필요성!
• Big Integer
– 자료구조 과제 1
– 큰 두 수의 덧셈, 뺄셈, 곱셈을 만든다.
10
알고리즘의 필요성!
• 곱셈을 덧셈으로 구현한다면?
– 끝나지 않는다.
• 123918762 * 1927311 =
123918762 + 123918762 + 123918762 + …
11
알고리즘의 필요성!
• (2)알고리즘을 알면 할 수 있는 것들이 있다.
– SNS를 통한 분석
– 동접자가 100만이 넘는 온라인게임 관리
– 등등 많은 양의 데이터를 관리하는 경우
12
알고리즘의 속도
점근적 복잡도(시간복잡도)
13
점근적 복잡도
• 흔히 말하는
• O(n), O(n^2), O(log n) 등등
14
점근적 복잡도
• 이 알고리즘이 얼마나 빠른거죠?
15
점근적 복잡도
• 이 알고리즘이 얼마나 빠른거죠?
– >빠르다의 정의는?
16
점근적 복잡도
• 10개의 숫자를 정렬하세요.
• n개의
100개의
숫자를
숫자를
정렬하세요.
정렬하세요.
• 1000000개의 숫자를 정렬하세요.
17
점근적 복잡도
• 문제 크기 n에 대해 어떤 함수에 비례하는
시간이 걸리는지 결정!
18
점근적 복잡도
(from 강의자료)
19
점근적 복잡도
(from 강의자료)
20
점근적 복잡도
• 몇 배 차이는 중요하지 않다!
– (같은 점근적 복잡도를 가지는 경우 몇 십 배
이상 차이 나지 않는다.)
21
점근적 복잡도
• 가장 큰 것 이외엔 중요하지 않다!
– n이 큰 경우만 점근적 복잡도가 의미가 있다.
– 수행시간 = n^3 + 3n^2 + 2n + 4
• O(n^3)
22
점근적 복잡도
• g(n)에 비례하는 함수를 나타내기 위한 기
호
– O(g(n)), Θ(g(n), Ω(g(n)), o(g(n)) 등
– 대략 g(n)보다 작거나 같다, g(n)과 같다 등등
으로 해석 가능.
– 편의를 위해 O만 사용.
23
점근적 복잡도
• O(g(n))에서, g(n)이 1억~10억이다?
– 초 단위의 시간이 걸릴 것을 예상할 수 있다.
24
점근적 복잡도(실제 수행 시간)
• Big Integer 곱셈을 덧셈으로 구현
– >O(dn) (n은 숫자, d는 n의 자릿수)
n <= 10^100
10^90년 이상이 걸리지 않을까?
25
점근적 복잡도(실제 수행 시간)
• Big Integer 곱셈을 의도한 방법으로 구현
– >O(n^2) (n은 자릿수)
n <= 100
0.0…01초쯤 걸린다.
26
점근적 복잡도
• n을 뭐로 잡느냐에 따라 함수도 달라진다.
• g(n)이 아니라 g(n,m), g(a,b,c,d) 등등일 수
도 있다.
27
점근적 복잡도
• 구하는 방법
– 점화식을 구한다.
– g(n) = g(n-1) + 1
– g(n) = g(n-1) + n
– g(n) = g(n/2) + 1
28
점근적 복잡도
g(n) = g(n-1) + 1
= g(n-2) + 1 + 1
= g(n-3) + 1 + 1 + 1
…
= g(0) + 1 + 1 + … + 1
=n
29
점근적 복잡도
g(n) = g(n-1) + n
= g(n-2) + (n-1) + n
…
= g(0) + 1 + 2 + … + n
= ½ n(n+1) = O(n^2)
30
점근적 복잡도
g(n) = g(n-1) + n
= g(n-2) + (n-1) + n
…
= g(0) + 1 + 2 + … + n
= 0.5 * n^2 + 0.5 * n
31
점근적 복잡도
g(n) = g(n/2) + 1
= g(n/4) + 1 + 1
= g(n/8) + 1 + 1 + 1
… (대략 log n번 하면)
= g(1) + 1 + 1 + … + 1
= log n
32
점근적 복잡도
• O(g(n))에서, g(n)이 1억~10억이다?
– 초 단위의 시간이 걸릴 것을 예상할 수 있다.
33
기본적인 알고리즘 예시
정렬(SORTING)
34
정렬
• 문제
– n개의 숫자를 오름차순으로 배열한다.
35
거품 정렬(bubble sort)
36
거품 정렬(bubble sort)
37
거품 정렬(bubble sort)
for (int i = n - 1; i > 0; i++)
for (int j = 0; j < i; j++)
if ( list[ j ] > list[ j+1 ] )
swap( list[ j ], list[ j+1 ] );
(n-1) + (n-2) + … + 1 = n(n-1)/2 = 0.5n^2-0.5n
// O(n^2)
38
정렬
• 비슷한 정렬
– 삽입정렬, 선택정렬이 있고 모두 O(n^2)
– 이 중에선 삽입정렬이 제일 좋다.
• 거의 다 정렬되어 있는 경우 빠르다.
39
Mergesort
(from 강의자료)
정렬할 배열이 주어짐
32
3
65
73
8
11
20
29
48
15
73
8
11
20
29
48
15
1
32
65
73
11
15
20
29
48
2
11
15
20
29
32
48
65
73
4
배열을 반반으로 나눈다
32
3
65
각각 독립적으로 정렬한다
3
8
3
병합한다 (정렬완료)
3
8
40
합병정렬(mergesort)
• 크게 두 파트로 나누어져 있다.
– 반으로 나누어 각각을 정렬한다.
– 정렬된 두 리스트를 합친다.
41
q
p
3
8
r
32 65 73 11 15 20 29 48
Merge의 작동 예
(from 강의자료)
j
i
t
8
32 65 73 11 15 20 29 48
j
i
3
t
31 65 73 11 15 20 29 48
i
3
j
8
t
42
3
8
32 65 73
15 20 29 48
i
j
11
t
32 65 73
20 29 48
i
3
8
j
11 15
t
3
8
32 65 73
29 48
i
j
11 15 20
t
43
3
8
32 65 73
48
i
j
11 15 20 29
t
65 73
48
j
i
3
8
11 15 20 29 32
t
65 73
j
i
3
8
11 15 20 29 32 48
t
44
i
3
8
j
11 15 20 29 32 48 65 73
t
45
합병정렬(mergesort)
• 수행 시간을 g(n)이라고 하면
– 반으로 나누어 각각을 정렬한다.
• 2 * g(n/2)
– 정렬된 두 리스트를 합친다.
• O(n)
46
합병정렬(mergesort)
• g(n) = 2*g(n / 2) + O(n)
– 대충 계산해보면
g(n) = 2*g(n / 2) + n
= 4*g(n / 4) + n + n
…
= n log (n)
– O(n log n)
47
합병정렬(mergesort)
• 마스터 정리를 사용하면 바로 알 수 있다.
– 수업 시간에 배웁니다.
• 하지만 직관적으로 답을 알아내는 것도 좋
다.
48
약간 어려운 알고리즘 예시
DYNAMIC PROGRAMMING
(동적 계획법)
49
Dynamic Programming
• 큰 문제를 풀기 위해 먼저 작은 문제를 푼
다.
• 재귀적 해법->반대로 한다면?
50
피보나치
• 1, 1, 2, 3, 5, 8, 13, 21, 34, …
• f(n) = f(n-1) + f(n-2)
51
피보나치
int f (int n)
{
if(n == 0 || n == 1) return 1;
return f (n-1) + f (n-2);
}
// 끝나지 않는다??
52
피보나치
f(10) = f(9) + f(8)
= f(8) + f(7) + f(7) + f(6)
= f(7) + f(6) + f(6) + f(5) + f(6) + f(5) + f(5)
+ f(4)
…
53
피보나치
• f(0)=1, f(1)=1 이다.
• f(2) = f(1) + f(0) = 2
• f(3) = f(2) + f(1) = 3
• …
54
피보나치
• 직전 두 개의 값 둘을 기억하고, 다음 값을
구한다.
• O(n)
55
최단경로 찾기
S
E
56
최단경로 찾기
1
1
1
1
2
3
1
1
1
1
1
1
1
1
1
1
57
최단경로 찾기
1
1
1
1
2
3
1
1
3
6
1
1
4
10
1
1
1
1
10
10
11
10
20
31
31
62
1
1
1
11
1
2
3
14
1
3
6
20
62
26
88
58
최단경로 찾기
• f(x, y) = f(x-1, y) + f(x, y-1)
59
최단경로 찾기
int f (int x, int y)
{
if(x == 0 || y == 0) return 1;
return f (x - 1, y) + f (x, y - 1);
}
60
더 어려운 알고리즘들
61
• 여기까진 공통으로 알아두면 좋다.
62
더 어려운 문제들
• 수업, 연구실에서 연구
P=NP
현재까지 안 풀린 문제를 연구
• 알고리즘 대회
– 풀린 문제만 사용
63
더 어려운 문제들
• 수업, 연구실에서 연구
P=NP
현재까지 안 풀린 문제를 연구
• 알고리즘 대회
– 풀린 문제만 사용
64
연구분야
NP-COMPLETE
65
문제의 종류
• 풀 수 없다
– 정지문제(halting problem)
• 풀 수 있다
– (a) sorting, 최단거리
– (b) TSP, 3-sat 등등
66
문제의 종류
• 풀 수 있다의 (b)는 (아직까지는) 현실적인
시간에 풀 수 없다.
O(2^n), O(n!), O(n^n) 등등…
• 그 중에 NP-complete라는 이론이 있다.
67
NP-Complete
• NP-Complete에 해당하는 문제들이 많이
있다.
– 이들 중 하나만 다항시간 안에 계산된다면, 다
른 모든 것들도 풀린다.
68
NP-Complete
• 모든 문제를 Yes, No로 바꾸어 해석한다.
• NP-Complete는
– NP이고
– NP-Hard인 모든 문제를 말한다.
69
NP-Complete
• P
– 다항시간 안에 해를 구할 수 있다.
• NP
– Yes가 나오는 해를 제공하면, 이것이 Yes라는
것을 다항시간 안에 확인할 수 있다.
– No의 경우는 모름.
70
NP-Complete
• NP-Hard
– 모든 NP문제를 L로 다항시간 안에 변환할 수
있으면, L은 NP-Hard이다.
– 즉, L의 난이도는 NP의 가장 어려운 문제 이상
이다.
71
NP-Complete(예시)
• 최단거리는 어떤 모양이어도 다항시간 안
에 풀리지만
• 최장거리 구하기(Longest Path Problem)
은 NP-Complete이다.
72
NP-Complete(예시)
• Traveling Salesman Problem
– 모든 도시를 돌고 처음으로 돌아오는 최단경
로?
73
P=NP?
P=NP
NP
P
(a)
(b)
• 백만불의 상금이 걸려있는 문제.
74
비유(from 강의자료)
상사가 아주 어려운 문제를 해결하라고 지시했다
1. 나는 답을 구할 수가 없습니다. 아마 나는 멍청한 모양입니다.
75
2. 나는 답을 구할 수가 없습니다. 왜냐하면 이 문제는 답이 없어요.
76
NP-Complete 이론의 상황을 비유적으로 보여줌
3. 나는 답을 구할 수가 없습니다. 그렇지만 저렇게 수많은 천재들도
이 문제를 해결할 수 없습니다.
77
근사 알고리즘
• 완전한 해는 못 구해도, 최적해와 가까운 해는 다항
식 안에 구할 수 있는 경우가 있다.(Heuristic)
• Traveling Salesman Problem
– 다항식 시간에 최적해의 k배 이내의 해를 구할 수
있는 경우가 있음
78
근사 알고리즘
• NP-Hard 문제임이 증명되면 Heuristic을
생각하자!
79
알고리즘 대회
80
알고리즘 대회
• 많은 대회들이 있다.
– google code jam
– IPSC
– ACM-ICPC
– 등등
81
82
83
문제 예시
• N개의 수로 이루어진 배열 A가 있을 때,
인접한 두 수의 교환만으로 up and down
sequence를 만들려 한다. 최소의 교환 횟
수를 구하시오.
• (Google Code Jam 2014 Round 2)
84
문제 예시
• Up and down sequence
– A1 < A2 < ... < Am > Am+1 > ... > AN
– 1, 4, 10, 14, 9, 7, 3, 2
85
문제 예시(풀이)
6
5
1
4
2
3
86
문제 예시(풀이)
• (1) 최솟값을 찾는다.
6
5
1
4
2
3
87
문제 예시(풀이)
• (2) 왼쪽 끝이 가까운지 오른쪽 끝이 가까
운지 찾는다.
6
5
2
1
4
2
3
3
88
문제 예시(풀이)
• (3) 더 가까운 쪽으로 옮긴다.
6
5
1
4
2
3
6
1
5
4
2
3
1
6
5
4
2
3
89
문제 예시(풀이)
• (4) 나머지 숫자에 대해 이 과정을 반복한
다.
1
6
5
4
2
3
90
문제 예시(풀이)
• (1) 최솟값을 찾는다 : O(n)
• (2) 왼쪽 끝이 가까운지 오른쪽 끝이 가까운지 찾는다 :
O(n)
• (3) 더 가까운 쪽으로 옮긴다 : O(n)
• (4) 나머지 숫자에 대해 이 과정을 반복한다 : O(g(n-1))
• O(g(n)) = O(g(n-1)) + O(n) + O(n) = O(g(n-1)) + O(n)
• O(g(n)) = O(n^2)
91
문제 예시(풀이)
• n <= 1000이므로 ok.
92
문제 예시(풀이)
• 시간이 남는다면 왜 이게 맞는지 생각해보
는 것도 좋다.
• 하지만 대회는 시간이 생명!
93
문제 예시(풀이)
• Up and down sequence에서는 최솟값이
맨 왼쪽 또는 오른쪽에 있어야 한다.
• 인접한 두 값만 바꿀 수 있고, 맨 왼쪽 또
는 오른쪽에 있는 값은 더 이상 변하지 않
는다.
94
기타
• Greedy 알고리즘
– 현재 상황에서 최선의 전략을 찾는다.
• 전체적으로는 최선이 아닐 수 있다.
95
End
Q&A
96