알고리즘 : 소개

37
알알알알 : 알알

description

알고리즘 : 소개. 알고리즘. 알고리즘. 주어진 문제의 해결을 위한 논리적 절차나 방법 Webster A procedure for solving a mathematical problem in a finite number of steps that frequently involves repetition of an operation Knuth An algorithm is a finite, definite, effective procedure, with some input and some output. - PowerPoint PPT Presentation

Transcript of 알고리즘 : 소개

Page 1: 알고리즘 :  소개

알고리즘 : 소개

Page 2: 알고리즘 :  소개

알고리즘

Page 3: 알고리즘 :  소개

알고리즘

주어진 문제의 해결을 위한 논리적 절차나 방법 Webster

A procedure for solving a mathematical problem in a finite number of steps that frequently involves repetition of an operation

Knuth An algorithm is a finite, definite, effective procedure, with

some input and some output

Great algorithms are the poetry of computation. Just like verse, they can be terse, allusive, dense, and even mysterious. But once unlocked, they cast a brilliant new light on some aspect of computing. - Francis Sullivan

Page 4: 알고리즘 :  소개

알고리즘 (algorithm) 의 어원

원래는 인도에서 아랍를 거쳐 유럽에 보급된 필산 ( 筆算 )을 뜻하며 , 아랍의 수학자인 알콰리즈미의 이름에서 유래한다 .

오해 : algiros [painful] + arithmos [number]

Abu 'Abd Allah Muhammad ibn Musa al-Khwarizm

Page 5: 알고리즘 :  소개

알고리즘

컴퓨터공학부에서 가장 중요한 과목

생각하기 문제해결능력 설계 , 분석 , 정리 논리적인 사고방식 훈련 프리젠테이션 기술

생각하는 방법을 터득한 것은 미래의 문제를 미리 해결한 것이다 .

Page 6: 알고리즘 :  소개

알고리즘 : 첫 번째 문제

문제 : 전화번호부에서 홍길동을 찾아라 .

설계 : 알고리즘 순차 검색 (sequential search) 수정된 이분 검색 (modified binary search)

Page 7: 알고리즘 :  소개

알고리즘 : 첫 번째 문제

문제 : 전화번호부에서 홍길동을 찾아라 .

설계 : 알고리즘 순차 검색 (sequential search) 수정된 이분 검색 (modified binary search)

분석 : 어느 것이 더 좋을까 ?

Page 8: 알고리즘 :  소개

알고리즘 : 표기법

문제 : n 개의 수로 된 리스트 S 에서 x 를 찾아서 , x 가 있으면 “ 예” , 없으면 “ 아니오”

파라메터 : n, S, x

사례 (instance) S = [10,7,11,5,3,8], n = 6, x = 5 답 : 예

어떻게 풀었는가 ?

Page 9: 알고리즘 :  소개

알고리즘 : 표기법

문제 : n 개의 수로 된 리스트 S 에서 x 를 찾아서 , x 가 있으면 “ 예” , 없으면 “ 아니오”

파라메터 : n, S, x

사례 (instance) S = [10,7,11,5,3,8], n = 6, x = 5 답 : 예

알고리즘 : S 의 첫번째 아이템에서부터 끝까지 도달할 때까지 x 와 비교

Page 10: 알고리즘 :  소개

알고리즘 : 표기법

자연어 : 한글 , 영어 프로그래밍 언어 : C, C++, C#, Basic, Java, Fortran,

Pascal, Matlab,…

의사 코드 (Pseudo-code) 직접 실행할 수 있는 프로그래밍 언어는 아니지만 , 거의 실제

프로그램에 가깝게 계산 과정을 표현할 수 있는 언어 복잡한 알고리즘을 간결하게 표현 프로그램 작성 용이 C++ Pseudocode

Page 11: 알고리즘 :  소개

C++ Vs. 의사코드

배열 인덱스 C++: 0 부터 의사코드 : 임의의 값

S[low..high] 수학적 표현식

C++: 의사코드 :

타입 index, number,…

highxxlow &&highxlow

Page 12: 알고리즘 :  소개

의사코드

제어 구조 repeat (n times) {…}

함수 (function) 와 프로시저 (procedure) returntype fname() {…return result;} void pname() {…}

프로시저의 결과값 : 참조 파라메터 사용 배열 기타 : & 사용 Cf) const

Page 13: 알고리즘 :  소개

순차 검색 (Sequential Search) 문제 : 크기가 n 인 배열 S 에 x 가 있는가 ? 입력 ( 파라메터 ): 양수 n, 배열 S[1…n], 키 x 출력 : x 가 있으면 위치를 출력 , 없으면 0 알고리즘 :

x 를 찾을 때까지 차례대로 검사 찾으면 위치를 출력 , 찾지 못하면 0 을 출력

Page 14: 알고리즘 :  소개

순차 검색 ( 의사코드 )void seqsearch(int n, // input const keytype S[ ], // input keytype x, // input index& location) { // output location = 1; while (location <= n && S[location] != x) location ++; if (location > n) location = 0;}

Page 15: 알고리즘 :  소개

토의

키를 찾기 위해서 몇 개나 검색해야 하나 ? 최악의 경우는 ?

좀 더 빨리 찾을 수 있는 방법 ?

만약 S 의 조건이 좀더 좋다면 ? 과제 : 비내림차순 정렬 알고리즘 - 교환 정렬의 이해 사례 : S = [13,2,5,8,9,10,11,7]

void exchangesort (int n, keytype S[]) { index i, j; for (i = 1; i <= n-1; i++) for (j = i+1; j <= n; j++) if (S[j] < S[i]) exchange S[i] and S[j];}

Page 16: 알고리즘 :  소개

이분 검색 알고리즘 (Binary Search) 문제 : 크기가 n 인 정렬된 배열 S 에 x 가 있는가 ?

void binsearch(int n, const keytype S[], keytype x, index& location) { index low, high, mid; low = 1; high = n; location = 0; while (low <= high && location == 0) { mid = (low + high) / 2; if (x == S[mid]) location = mid; else if (x < S[mid]) high = mid - 1; else low = mid + 1; }}

Page 17: 알고리즘 :  소개

토의

x 를 찾기 위해 S 에 있는 항목을 몇 개나 검색해야 하나 ? n = 16

최악의 경우

Page 18: 알고리즘 :  소개

퀴즈 : 알고리즘 맞추기

문제 ? 입력 ? 출력 ?

number Func(int n, number S[]){index i = 0;number result = 0;

for(i = 0; i < n; i++) result = result + S[i];

return result;}

Page 19: 알고리즘 :  소개

피보나찌 수열

210

21

1

0

nfffff

nnn

,...1597,987,610,377,233,144,89,55,34,21,13,8,5,3,2,1,1,0

Page 20: 알고리즘 :  소개

피보나찌 수열 알고리즘

문제 : n 번째 피보나찌 수를 구하라 . 입력 : 양수 n 출력 : n 번째 피보나찌 수

int fib (int n) { if (n <= 1) return n; else return fib(n-1) + fib(n-2);}

Page 21: 알고리즘 :  소개

fib(5)

재귀 ( 자기 호출 ) 트리

int fib (int n) { if (n <= 1)return n; else return fib(n-1) + fib(n-2);}

Page 22: 알고리즘 :  소개

토의

깔끔하다 . 그러나 느리다 . 왜 ?

같은 피보나찌 수를 중복 계산

int fib (int n) { if (n <= 1)return n; else return fib(n-1) + fib(n-2);}

Page 23: 알고리즘 :  소개

fib(n) 의 계산 횟수

T(n) : fib(n) 을 계산하기 위해 fib() 를 호출하는 횟수 재귀 트리 상의 노드 수

1)2()1()(1)1(1)0(

nTnTnTTT

2/2/

3

2

2)0(2

...)6(2

)4(2

)2(2

nn T

nT

nT

nT

Page 24: 알고리즘 :  소개

증명

정리 : 증명 : 귀납법 이용

귀납출발점

귀납가정 :

귀납절차

2for2)( 2/ nnT n

2/3

2/2

283.25)3(

23)2(

T

T

2/2)(, mmTnm

2/2/)2(2/)2(

2/)2(2/)1(

222

122

1)2()1()(

nnn

nn

nTnTnT

Page 25: 알고리즘 :  소개

토의

깔끔하다 . 그러나 느리다 . 왜 ?

같은 피보나찌 수를 중복 계산

int fib (int n) { if (n <= 1)return n; else return fib(n-1) + fib(n-2);}

더 좋은 알고리즘은 없을까 ?

Page 26: 알고리즘 :  소개

피보나찌 수 – 반복적 방법

int fib2 (int n) { index i; int f[0..n];

f[0] = 0; if (n > 0) { f[1] = 1; for (i = 2; i <= n; i++) f[i] = f[i-1] + f[i-2]; } return f[n];}

Page 27: 알고리즘 :  소개

토의

빠르기 왜 ?

배열 사용 안 하기 ? 과제

Page 28: 알고리즘 :  소개

알고리즘의 분석 (Analysis) 어느 것이 가장 효율적인 (efficient) 알고리즘이고 얼마나

효율적인가 ? Cf) 문제 분석

풀 수 있는 것 , 못 푸는 것 , P, NP, NP-Complete,…) 시간 복잡도 분석 (Time Complexity Analysis)

실제 CPU 시간 ? 명령어 수 ? 기계 , 언어 , 프로그래머에 독립적인 기준 필요

입력크기에 따라 단위연산이 몇 번 수행 되는지 결정하는 절차

Page 29: 알고리즘 :  소개

입력 크기와 단위 연산

입력 크기 배열의 크기 리스트의 길이 행렬에서 행과 열의 크기 트리에서 마디와 이음선의 수 예 ) 순차검색 , 이분검색

단위 연산 비교 , 지정 경험과 판단으로 결정 ( 규칙은 없지만 어렵지 않다 .)

Page 30: 알고리즘 :  소개

분석 방법의 종류

모든 경우 분석 (Every-case analysis): T(n) 알고리즘의 성능은 입력의 크기에만 영향을 받음

number Func(int n, number S[]) { index i = 0; number result = 0;

for(i = 0; i < n; i++) result = result + S[i];

return result;}

Page 31: 알고리즘 :  소개

분석 방법의 종류

모든 경우 분석 (Every-case analysis): T(n) 알고리즘의 성능은 입력의 크기에만 영향을 받음

void exchangesort (int n, keytype S[]) { index i, j; for (i = 1; i <= n-1; i++) for (j = i+1; j <= n; j++) if (S[j] < S[i]) exchange S[i] and S[j];}

Page 32: 알고리즘 :  소개

분석 방법의 종류

모든 경우 분석 (Every-case analysis): T(n) 알고리즘의 성능은 입력의 크기에만 영향을 받음

교환정렬 j- 루프가 수행될 때마다 단위연산 1 번 수행 총 수행횟수

i = 1, j- 루프 ? 번 i = 2, j- 루프 ? 번 i = 3, j- 루프 ? 번 i = n-1, j- 루프 ? 번

2)1(1...)2()1()(

nnnnnT

Page 33: 알고리즘 :  소개

분석 방법의 종류

모든 경우 분석 (Every-case analysis): T(n) 알고리즘의 성능은 입력의 크기에만 영향을 받음

최악의 경우 분석 (Worst-case analysis): W(n) 입력크기와 입력값 모두에 종속 단위연산이 수행되는 횟수가 최대인 경우

최선의 경우 분석 (Best-case analysis): B(n)void seqsearch(){location = 1; while (location <= n && S[location] != x) location ++; if (location > n) location = 0;}

Page 34: 알고리즘 :  소개

분석 방법의 종류

모든 경우 분석 (Every-case analysis): T(n) 알고리즘의 성능은 입력의 크기에만 영향을 받음

최악의 경우 분석 (Worst-case analysis): W(n) 입력크기와 입력값 모두에 종속 단위연산이 수행되는 횟수가 최대인 경우

최선의 경우 분석 (Best-case analysis): B(n) 평균의 경우 분석 (Average-case anlysis): A(n)

입력크기와 입력값 모두에 종속 모든 입력에 대해서 단위연산이 수행되는 기대치 ( 평균 ) 각 입력에 대해 확률 할당 일반적으로 최악의 경우보다 계산이 복잡

Page 35: 알고리즘 :  소개

순차검색의 평균 시간복잡도 분석

단위연산 : S[location] != x 입력크기 : n 분석 :

경우 1: x 가 배열 S 안에 있을 경우 1≤k≤n, x가 배열의 k 번째 있을 확률 : ? x 가 k 번째 있다면 , 수행해야 할 단위 연산의 횟수 : ?

21

2)1(111)(

11

nnnn

knn

knAn

k

n

k

Page 36: 알고리즘 :  소개

순차검색의 평균 시간복잡도 분석

단위연산 : S[location] != x 입력크기 : n 분석 :

경우 2: x 가 배열 S 안에 없는 경우도 고려하면 x가 배열 S 안에 있을 확률을 p 라 하면 ,

x 가 k 번째 있을 확률 : ? x 가 배열에 없을 확률 : ?

2)

21(

)1(2

)1(

)1()()(1

ppn

pnnnnp

pnnpknA

n

k

?2/1?1 pp

Page 37: 알고리즘 :  소개

토의

시간 복잡도 분석 최악 , 최선 , 평균 어느 것이 유용할까 ?

cf) 공간 복잡도 분석 ? cf) 정확성 분석 ?

알고리즘이 의도한 대로 수행되는지 분석 정확한 알고리즘

어떠한 입력에 대해서도 답을 출력하면서 멈추는 알고리즘 정확하지 않은 알고리즘

어떤 입력에 대해서 멈추지 않거나 , 또는 틀린 답을 출력하면서 멈추는 알고리즘

nvsn 1000.2