1 / 37

알고리즘 : 소개

알고리즘 : 소개. 알고리즘. 알고리즘. 주어진 문제의 해결을 위한 논리적 절차나 방법 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.

bryony
Download Presentation

알고리즘 : 소개

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 알고리즘: 소개

  2. 알고리즘

  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

  4. 알고리즘(algorithm)의 어원 • 원래는 인도에서 아랍를 거쳐 유럽에 보급된 필산(筆算)을 뜻하며, 아랍의 수학자인 알콰리즈미의 이름에서 유래한다. • 오해: algiros [painful] + arithmos [number] Abu 'Abd Allah Muhammad ibn Musa al-Khwarizm

  5. 알고리즘 • 컴퓨터공학부에서 가장 중요한 과목 • 생각하기 • 문제해결능력 • 설계, 분석, 정리 • 논리적인 사고방식 훈련 • 프리젠테이션 기술 생각하는 방법을 터득한 것은 미래의 문제를 미리 해결한 것이다.

  6. 알고리즘: 첫 번째 문제 • 문제: 전화번호부에서 홍길동을 찾아라. • 설계: 알고리즘 • 순차 검색(sequential search) • 수정된 이분 검색(modified binary search)

  7. 알고리즘: 첫 번째 문제 • 문제: 전화번호부에서 홍길동을 찾아라. • 설계: 알고리즘 • 순차 검색(sequential search) • 수정된 이분 검색(modified binary search) • 분석: 어느 것이 더 좋을까?

  8. 알고리즘: 표기법 • 문제: n개의 수로 된 리스트 S에서 x를 찾아서, x가 있으면 “예”, 없으면 “아니오” • 파라메터: n, S, x • 사례(instance) • S = [10,7,11,5,3,8], n = 6, x = 5 • 답: 예 어떻게 풀었는가?

  9. 알고리즘: 표기법 • 문제: n개의 수로 된 리스트 S에서 x를 찾아서, x가 있으면 “예”, 없으면 “아니오” • 파라메터: n, S, x • 사례(instance) • S = [10,7,11,5,3,8], n = 6, x = 5 • 답: 예 • 알고리즘: S의 첫번째 아이템에서부터 끝까지 도달할 때까지 x와 비교

  10. 알고리즘: 표기법 • 자연어: 한글, 영어 • 프로그래밍 언어: C, C++, C#, Basic, Java, Fortran, Pascal, Matlab,… • 의사 코드(Pseudo-code) • 직접 실행할 수 있는 프로그래밍 언어는 아니지만, 거의 실제 프로그램에 가깝게 계산 과정을 표현할 수 있는 언어 • 복잡한 알고리즘을 간결하게 표현 • 프로그램 작성 용이 • C++ Pseudocode

  11. C++ Vs. 의사코드 • 배열 인덱스 • C++: 0부터 • 의사코드: 임의의 값 • S[low..high] • 수학적 표현식 • C++: • 의사코드: • 타입 • index, number,…

  12. 의사코드 • 제어 구조 • repeat (n times) {…} • 함수(function) 와 프로시저(procedure) • returntype fname() {…return result;} • void pname() {…} • 프로시저의 결과값: 참조 파라메터 사용 • 배열 • 기타: & 사용 • Cf) const

  13. 순차 검색(Sequential Search) • 문제: 크기가 n인 배열 S에 x가 있는가? • 입력(파라메터): 양수 n, 배열 S[1…n], 키 x • 출력: x가 있으면 위치를 출력, 없으면 0 • 알고리즘: • x를 찾을 때까지 차례대로 검사 • 찾으면위치를 출력, 찾지 못하면 0을 출력

  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; }

  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];}

  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; } }

  17. 토의 • x를 찾기 위해 S에 있는 항목을 몇 개나 검색해야 하나? • n = 16 • 최악의 경우

  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; }

  19. 피보나찌 수열

  20. 피보나찌 수열 알고리즘 • 문제: n번째 피보나찌 수를 구하라. • 입력: 양수 n • 출력: n번째 피보나찌 수 int fib (int n) { if (n <= 1) return n; else return fib(n-1) + fib(n-2); }

  21. int fib (int n) { if (n <= 1)return n; else return fib(n-1) + fib(n-2);} fib(5) 재귀(자기 호출) 트리

  22. int fib (int n) { if (n <= 1)return n; else return fib(n-1) + fib(n-2);} 토의 • 깔끔하다. • 그러나 느리다. • 왜? • 같은 피보나찌 수를 중복 계산

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

  24. 증명 • 정리: • 증명: 귀납법 이용 • 귀납출발점 • 귀납가정: • 귀납절차

  25. int fib (int n) { if (n <= 1)return n; else return fib(n-1) + fib(n-2);} 토의 • 깔끔하다. • 그러나 느리다. • 왜? • 같은 피보나찌 수를 중복 계산 더 좋은 알고리즘은 없을까?

  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]; }

  27. 토의 • 빠르기 • 왜? • 배열 사용 안 하기? • 과제

  28. 알고리즘의 분석(Analysis) • 어느 것이 가장 효율적인(efficient) 알고리즘이고 얼마나 효율적인가? • Cf) 문제 분석 • 풀 수 있는 것, 못 푸는 것, P, NP, NP-Complete,…) • 시간 복잡도 분석(Time Complexity Analysis) • 실제 CPU 시간? • 명령어 수? • 기계, 언어, 프로그래머에 독립적인 기준 필요 입력크기에 따라 단위연산이 몇 번 수행 되는지 결정하는 절차

  29. 입력 크기와 단위 연산 • 입력 크기 • 배열의 크기 • 리스트의 길이 • 행렬에서 행과 열의 크기 • 트리에서 마디와 이음선의 수 • 예) 순차검색, 이분검색 • 단위 연산 • 비교, 지정 • 경험과 판단으로 결정(규칙은 없지만 어렵지 않다.)

  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; }

  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]; }

  32. 분석 방법의 종류 • 모든 경우 분석(Every-case analysis): T(n) • 알고리즘의 성능은 입력의크기에만 영향을 받음 • 교환정렬 • j-루프가 수행될 때마다 단위연산 1번 수행 • 총 수행횟수 • i = 1, j-루프 ? 번 • i = 2, j-루프 ? 번 • i = 3, j-루프 ? 번 • i = n-1, j-루프 ? 번

  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; }

  34. 분석 방법의 종류 • 모든 경우 분석(Every-case analysis): T(n) • 알고리즘의 성능은 입력의크기에만 영향을 받음 • 최악의 경우 분석(Worst-case analysis): W(n) • 입력크기와 입력값 모두에 종속 • 단위연산이 수행되는 횟수가 최대인 경우 • 최선의 경우 분석(Best-case analysis): B(n) • 평균의 경우 분석(Average-case anlysis): A(n) • 입력크기와 입력값 모두에 종속 • 모든 입력에 대해서 단위연산이 수행되는 기대치(평균) • 각 입력에 대해 확률 할당 • 일반적으로 최악의 경우보다 계산이 복잡

  35. 순차검색의 평균 시간복잡도 분석 • 단위연산: S[location] != x • 입력크기: n • 분석: • 경우 1: x가 배열 S안에 있을 경우 • 1≤k≤n, x가 배열의 k번째 있을 확률: ? • x가 k번째 있다면, 수행해야 할 단위 연산의 횟수: ?

  36. 순차검색의 평균 시간복잡도 분석 • 단위연산: S[location] != x • 입력크기: n • 분석: • 경우 2: x가 배열 S안에 없는경우도 고려하면 • x가 배열 S안에 있을 확률을 p라 하면, • x가 k번째 있을 확률: ? • x가 배열에 없을 확률: ?

  37. 토의 • 시간 복잡도 분석 • 최악, 최선, 평균 어느 것이 유용할까? • cf) 공간 복잡도 분석? • cf) 정확성 분석? • 알고리즘이 의도한 대로 수행되는지 분석 • 정확한 알고리즘 • 어떠한 입력에 대해서도 답을 출력하면서 멈추는 알고리즘 • 정확하지 않은 알고리즘 • 어떤 입력에 대해서 멈추지 않거나, 또는 틀린 답을 출력하면서 멈추는 알고리즘

More Related