알고리즘

Download Report

Transcript 알고리즘

11장 알고리즘과 계산 복잡도
프로그램 설계 과정
설계
문제
분석
예
만족?
알고리즘
프로그램
아니오
재설계
2
학습목표
• 알고리즘 분석
– Computational Complexity(계산복잡도)
– 알고리즘을 분석하여 시간/공간 복잡도를 구함.
3
정의: 알고리즘(Algorithm)
• 문제에 대한 답을 찾기 위하여 계산하는
절차
• 단계별로 주의 깊게 설계된 계산과정
• 입력을 받아서 출력으로 전환시켜주는 일
련의 계산절차
4
알고리즘의 특성
• 입력(input)
• 출력(output)
• 명확성(precision)
– 단계들은 명확하게 진술되어야 한다.
– 따라서 각 단계들은 프로그램 언어로 표현할 수 있어야 한다.
• 결정성(determinism)
– 각 단계가 실행된 후의 결과는 입력과 바로 전 단계의 결과에 따라 유일
하게 결정된다.
• 유한성(infiniteness)
– 유한한 수의 명령이 실행된 후 종료되어야 한다.
• 정확성(correctness)
– 문제를 정확하게 해결한다.
• 일반성(generality)
2015-04-10
– 입력의
알고리즘
강의 슬라이드 1a 서막
집합에 동일하게
적용된다.
5
예
• 다음의 알고리즘은 앞의 특성을 만족하는
가?
a, b, c의 3개의 수 중에서 최대의 수를 찾는다.
1.large = a
2.If b > large, then large = b
3.If c > large, then large = c
2015-04-10
알고리즘 강의 슬라이드 1a 서막
6
문제의 표기 방법
• 문제:
– 답을 찾고자 던지는 질문
• 파라미터:
– 문제에서 특정값이 주어지지 않은 변수
• 문제의 사례 (입력):
– 파라미터에 특정 값을 지정한 것
• 사례에 대한 해답 (출력):
– 주어진 사례에 관한 질문에 대한 답
7
문제의 표기 방법 (예: 검색)
• 문제: n개의 수로 된 리스트 S 에 x 라는 수
가 있는지 알아내시오. x가 S 에 있으면 “예”,
없으면 “아니오”로 답하시오.
• 파라미터: S, n, x
• 입력의 예: S = [10,7,11,5,3,8], n = 6, x = 5
• 출력의 예: “예”
8
알고리즘의 표기
• 자연어: 한글 또는 영어
• 프로그래밍언어: C, C++, Java, ML 등
• 의사코드(Pseudo-code)
– 직접 실행할 수 있는 프로그래밍언어는 아니지만, 거의
실제 프로그램의 코드와 비슷하다. 실제 프로그램 언어
의 세세한 문법은 무시한다.
• 알고리즘은 보통 의사코드로 표현한다.
9
Pseudo-code의 예
문제: s1,s2,…,sn의 수열에서 가장 큰 수를 찾는다.
입력: S, n
출력: large(수열의 집합 S의 원소 중에서 가장 큰 값)
Max(S,n){
large = s1
for i=2 to n
if (si > large)
large =si
return large
}
2015-04-10
알고리즘 강의 슬라이드 1a 서막
10
알고리즘의 분석(Analysis)
• 어떤 알고리즘이 좋은 알고리즘인가?
– 판단 기준: 실행 시간과 요구되는 메모리
– 실행 시간을 결정하는 요인으로는 여러가지가 있다. 보
통 입력의 크기에 따라 실행 시간이 어떻게 변하는지
계산한다.
• 시간복잡도(Time Complexity) 분석
– 입력크기에 따라서 단위연산이 몇 번 수행되는지 결정
하는 절차
• 표현 척도
– 단위연산(basic operation)
– 입력크기(input size)
11
분석 방법의 종류
• 최선 경우 시간(best-case time)
– 입력크기가 n인 모든 입력에 대해 알고리즘을 실행하
는데 걸리는 최소 시간
• 최악 경우 시간(Worst-case time)
– 입력크기가 n인 모든 입력에 대해 알고리즘을 실행하
는데 걸리는 최대 시간
• 평균 경우 시간(average-case time)
– 입력크기가 n인 모든 입력에 대해 알고리즘을 실행하
는데 걸리는 평균 시간
12
입력크기에 따른 시간의 변화
• 알고리즘을 분석할 때 실행하는데 걸리는 정확
한 시간보다는 입력의 크기에 따라 시간이 어떻
게 변하는지에 관심이 있다.
예를 들면, 입력의 크기가 n일 때 알고리즘의 최악의 시간은
T(n)의 함수로 주어진다.
T(n) = 0.1n2+n+100
이때 T(n)의 증가 추세는 n2라고 할 수 있을까?
2
2
0.1n 과 0.1n +n+100의 T(n) 비교
0.1n2
n
0.1n2+n+100
10
10
120
20
40
160
50
250
400
100
1,000
1,200
1,000
100,000
101,100
14
대표적인 복잡도 카테고리
•
•
•
•
•
•
•
(log n)
(n) : 1차(linear)
(n log n)
(n2) : 2차(quadratic)
(n3) : 3차(cubic)
(2n) : 지수(exponential)
(n!)
15
한 단계를 실행하는데 10-6초가 걸리 경우
입력크기
단계수
3
50
1000
100000
1000000
1
10-6
10-6
10-6
10-6
10-6
Loglogn
10-6
2 X 10-6
3 X 10-6
4X10-6
4X10-6
logn
2 X 10-6
6 X 10-6
10-5
2X10-5
2X10-5
n
3 X 10-6
5 X 10-5
10-3
0.1
1
nlogn
5 X 10-6
3 X 10-4
10-2
2
20
n2
9 X 10-6
3 X 10-3
1
3시간
12일
n3
3 X 10-5
0.13
16.7분
32년
30,710년
2n
8X 10-6
36년
3X10287년
3X1030089년
3X10301016년
2015-04-10
알고리즘 강의 슬라이드 1a 서막
16
복잡도 함수의 증가율
17
큰(Big) 표기법
• 정의 : 점근적 상한(Asymptotic Upper Bound)
– f와 g를 정의역 {1,2,3,…}에서 정의된 함수라고
하자.
– n  N인 모든 정수 n에 대해서 |g(n)|  c |f(n)|이 성
립하는 실수 c  0와 음이 아닌 정수 N이 존재하
면, g(n) = O(f(n))이라고 한다.
• g(n) = (f(n)) 읽는 방법:
– g(n)은 f(n)의 큰 오(big )
– g(n)은 기껏해야 f(n)의 차수를 갖는다.
18
큰  표기법
19
큰  표기법
• 어떤 함수 g(n)이(n2)에 속한다는 말은
– 그 함수는 궁극에 가서는 (즉, 어떤 임의의 N값보다
큰 값에 대해서는) 어떤 2차 함수 cn2 보다는 작은 값
을 가지게 된다는 것을 뜻한다.
(그래프 상에서는 아래에 위치)
– 다시 말해서, 그 함수 g(n)은 어떤 2차 함수 cn2 보다
는 궁극적으로 좋다고 (기울기가 낮다고) 말할 수 있
다.
• 어떤 알고리즘의 시간복잡도가 (f(n))이라면
– 입력의 크기 n에 대해서 이 알고리즘의 수행시간은
아무리 늦어도 f(n)은 된다. (f(n)이 상한이다.)
– 다시 말하면, 이 알고리즘의 수행시간은 f(n)보다 절
대로 더 느릴 수는 없다는 말이다.
20
큰  표기법 : 예
• n2+10n = (n2) ?
(1) n  10인 모든 정수 n에 대해서 n2+10n  2n2 이
성립한다. 그러므로, c = 2와 N = 10을 선택하면,
“큰  ”의 정의에 의해서 n2+10n = (n2)이라고 결
론지을 수 있다.
(2) n  1인 모든 정수 n에 대해서 n2+10n  n2+10n2
= 11n2 이 성립한다. 그러므로, c = 11와 N = 1을 선
택하면, “큰  ”의 정의에 의해서 n2+10n = (n2)이
라고 결론지을 수 있다.
21
2n 과 n + 10n의 비교
2
2
22
큰  표기법 : 예 (계속)
• 5n2 = (n2) ?
c=5와 N=0을 선택하면, n  0인 모든 정수 n에 대해서 5n2  5n2
이 성립한다.
•
T (n) 
n ( n  1)
2
?
n ( n  1)

n  0인 모든 정수 n에 대해서
이 성립한다. 그러므로,
2
2
1
2
c 
2 와 N=0을 선택하면, T(n) (n )이라고 결론지을 수 있다.
n
2
• n2  (n2+10n) ?
n  0인 모든 정수 n에 대해서, n2  1 (n2+10n)이 성립한다. 그
러므로, c=1와 N=0을 선택하면, n2  (n2+10n)이라고 결론지
을 수 있다.
23
큰  표기법 : 예 (계속)
• n  (n2) ?
n  1인 모든 정수 n에 대해서, n  1n2 이 성립한다.
그러므로, c=1와 N=1을 선택하면, n (n2)이라고
결론지을 수 있다.
• n3  (n2) ?
n  N인 모든 n에 대해서 n3  cn2 이 성립하는 c와
N
값은 존재하지 않는다. 즉, 양변을 n2으로 나누면,
n  c 가 되는데 c를 아무리 크게 잡더라도 그 보다
더 큰 n이 존재한다.
24
 (n )
2
25
 표기법
• 정의 : 점근적 하한(Asymptotic Lower Bound)
– n  N인 모든 정수 n에 대해서 |g(n)|  c |f(n)|이 성립
하는 실수 c  0와 음이 아닌 정수 N이 존재하면,
g(n) = (f(n))이라고 한다.
• g(n)  (f(n)) 읽는 방법:
 g(n)은 f(n)의 오메가(omega)
26
 표기법
27
 표기법
• 어떤 함수 g(n)이 (n )에 속한다는 말은
2
– 그 함수는 궁극에 가서는 (즉, 어떤 임의의 N 값보다 큰 값
에 대해서는) 어떤 2차 함수cn2 의 값보다는 큰 값을 가지
게 된다는 것을 뜻한다.
(그래프 상에서는 위에 위치)
– 다시 말해서, 그 함수 g(n)은 어떤 2차 함수 cn2 보다는 궁
극적으로 나쁘다고 (기울기가 높다고)말할 수 있다.
• 어떤 알고리즘의 시간복잡도가 (f(n))이라면,
– 입력의 크기 n에 대해서 이 알고리즘의 수행시간은 아무
리 빨라도 f(n)밖에 되지 않는다. (f(n)이 하한이다.)
– 다시 말하면, 이 알고리즘의 수행시간은 f(n)보다 절대로
더 빠를 수는 없다는 말이다.
28
 표기법 : 예
• n2 +10n = (n2) ?
n  0인 모든 정수 n에 대해서 n2+10n  n2 이 성립한
다. 그러므로, c = 1와 N = 0을 선택하면, n2 +10n 
(n2)이라고 결론지을 수 있다.
• 5n2 = (n2) ?
n  0인 모든 정수 n에 대해서, 5n2  1n2 이 성립한
다. 그러므로, c=1와 N=0을 선택하면, 5n2  (n2)이
라고 결론지을 수 있다.
29
 표기법 : 예 (계속)
•
T (n) 
n ( n  1)
2
?
n  2인 모든 n에 대해서
2 이 성립한다. 그러므로,
n ( n  1) n n 1
n  2인 모든 n에 대해서 2  2  2  4 n 이 성립한다.
따라서 c  14 과 N = 2를 선택하면, T ( n )   n 2 이라고
결론지을 수 있다.
n 1 
n
2
•
 ?
n  n
3
2
n  1인 모든 정수 n에 대해서, n 3  1  n 2 이 성립한다.
그러므로, c = 1와 N = 1을 선택하면, n 3   n 2  이라
고 결론지을 수 있다.
30
 표기법 : 예 (계속)
• n  (n2) ?
모순유도에 의한 증명(Proof by contradiction):
2
n   n  이라고 가정. 그러면 n  N인 모든 정수 n
에 대해서, n  c  n 2이 성립하는 실수 c > 0, 그리고
음이 아닌 정수 N이 존재한다. 위의 부등식의 양변
1
을 cn으로 나누면 c  n 가 된다. 그러나 이 부등식은
절대로 성립할 수 없다. 따라서 위의 가정은 모순이
다.
31
(n )
2
32
 표기법
• 정의 : (Asymptotic Tight Bound)
– 복잡도 함수 f (n ) 에 대해서   f  n     f  n     f  n 
– 다시 말하면, g(n)=O(f(n))이고 g(n)= (f(n))이면 g(n)=
(f(n))이라고 한다.
– 또한 g(n)은 f(n)의 차수(order)라고 한다.
33
 표기법
34
(n )
2
35
문제1
• 다음의 알고리즘에서 x=x+1이 실행되는 횟수를
n에 대한 세타 표기법으로 표현하라.
1. for i=1 to n
2.
for j=1 to I
3.
x = x+1
문제2
• 다음의 알고리즘에서 x=x+1이 실행되는 횟수를
n에 대한 세타 표기법으로 표현하라.
1. j=n
2. while (j≥1) {
3.
for i=1 to j
4.
x = x+1
5.
j =  2j 
6. }
문제3
• 다음의 알고리즘을 실행하기 위한 최악 경우 시
간, 최선 경우 시간, 평균 경우 시간을 세터 표기
법으로 표시하라.
입력: S={s1,s2, …, sn}, n, key(찾는 값)
출력: key의 색인 혹은 0(찾지 못했을 때)
1. Linear search (S, n, key) {
2.
for i=1 to n
3.
if (key == s1)
4.
return i //성공적인 검색
5. return 0 //검색에 실패
6. }
정확도 분석
• 알고리즘이 의도한 대로 수행되는지를 증
명하는 절차
• 정확한 알고리즘이란?
– 어떠한 입력에 대해서도 답을 출력하면서 멈
추는 알고리즘
• 정확하지 않은 알고리즘이란?
– 어떤 입력에 대해서 멈추지 않거나, 또는
– 틀린 답을 출력하면서 멈추는 알고리즘
39
P, NP-Hard, NP-Complete
P(Polynomial) 문제
•
–
지수가 상수 형태로 표현되는 문제(예: n5+n3)
•
Polynomial 시간 내에 풀 수 있다.
NP(Nondeterministic) 문제
•
–
–
•
–
–
–
Polynomial 시간 내에 풀 수 있다고 판명되어 있지 않은 문제 (
예: 2n, en)
적당한 시간 내에 답을 찾을 수 없다.
NP-Hard 문제
모든 경우의 수를 다 확인해야 답을 찾을 수 있는 문제
Polynomial 시간 내에 풀 수 없다
최적해를 찾는 대신에 근사 알고리즘이나 Heuristic 알고리즘
을 사용한다.
NP-Compelete 문제
•
–
NP 문제이면서 NP-Hard인 문제