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