알고리즘
This presentation is the property of its rightful owner.
Sponsored Links
1 / 37

알고리즘 : 소개 PowerPoint PPT Presentation


  • 143 Views
  • Uploaded on
  • Presentation posted in: General

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

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


2941170

알고리즘: 소개


2941170

알고리즘


2941170

알고리즘

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

  • 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


Algorithm

알고리즘(algorithm)의 어원

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

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

Abu 'Abd Allah Muhammad ibn Musa al-Khwarizm


2941170

알고리즘

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

  • 생각하기

    • 문제해결능력

    • 설계, 분석, 정리

    • 논리적인 사고방식 훈련

    • 프리젠테이션 기술

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


2941170

알고리즘: 첫 번째 문제

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

  • 설계: 알고리즘

    • 순차 검색(sequential search)

    • 수정된 이분 검색(modified binary search)


2941170

알고리즘: 첫 번째 문제

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

  • 설계: 알고리즘

    • 순차 검색(sequential search)

    • 수정된 이분 검색(modified binary search)

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


2941170

알고리즘: 표기법

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

  • 파라메터: n, S, x

  • 사례(instance)

    • S = [10,7,11,5,3,8], n = 6, x = 5

    • 답: 예

어떻게 풀었는가?


2941170

알고리즘: 표기법

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

  • 파라메터: n, S, x

  • 사례(instance)

    • S = [10,7,11,5,3,8], n = 6, x = 5

    • 답: 예

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


2941170

알고리즘: 표기법

  • 자연어: 한글, 영어

  • 프로그래밍 언어: C, C++, C#, Basic, Java, Fortran, Pascal, Matlab,…

  • 의사 코드(Pseudo-code)

    • 직접 실행할 수 있는 프로그래밍 언어는 아니지만, 거의 실제 프로그램에 가깝게 계산 과정을 표현할 수 있는 언어

    • 복잡한 알고리즘을 간결하게 표현

    • 프로그램 작성 용이

    • C++ Pseudocode


2941170

C++ Vs. 의사코드

  • 배열 인덱스

    • C++: 0부터

    • 의사코드: 임의의 값

      • S[low..high]

  • 수학적 표현식

    • C++:

    • 의사코드:

  • 타입

    • index, number,…


2941170

의사코드

  • 제어 구조

    • repeat (n times) {…}

  • 함수(function) 와 프로시저(procedure)

    • returntype fname() {…return result;}

    • void pname() {…}

  • 프로시저의 결과값: 참조 파라메터 사용

    • 배열

    • 기타: & 사용

    • Cf) const


Sequential search

순차 검색(Sequential Search)

  • 문제: 크기가 n인 배열 S에 x가 있는가?

  • 입력(파라메터): 양수 n, 배열 S[1…n], 키 x

  • 출력: x가 있으면 위치를 출력, 없으면 0

  • 알고리즘:

    • x를 찾을 때까지 차례대로 검사

    • 찾으면위치를 출력, 찾지 못하면 0을 출력


2941170

순차 검색 (의사코드)

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;

}


2941170

토의

  • 키를 찾기 위해서 몇 개나 검색해야 하나?

    • 최악의 경우는?

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

  • 만약 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];}


Binary search

이분 검색 알고리즘(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;

}

}


2941170

토의

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

    • n = 16

  • 최악의 경우


2941170

퀴즈: 알고리즘 맞추기

  • 문제?

  • 입력?

  • 출력?

number Func(int n, number S[])

{

index i = 0;

number result = 0;

for(i = 0; i < n; i++)

result = result + S[i];

return result;

}


2941170

피보나찌 수열


2941170

피보나찌 수열 알고리즘

  • 문제: n번째 피보나찌 수를 구하라.

  • 입력: 양수 n

  • 출력: n번째 피보나찌 수

int fib (int n) {

if (n <= 1)

return n;

else

return fib(n-1) + fib(n-2);

}


Fib 5

int fib (int n) { if (n <= 1)return n;

else return fib(n-1) + fib(n-2);}

fib(5)

재귀(자기 호출) 트리


2941170

int fib (int n) { if (n <= 1)return n;

else return fib(n-1) + fib(n-2);}

토의

  • 깔끔하다.

  • 그러나 느리다.

  • 왜?

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


Fib n

fib(n)의 계산 횟수

  • T(n) : fib(n)을 계산하기 위해 fib()를 호출하는 횟수

    • 재귀 트리 상의 노드 수


2941170

증명

  • 정리:

  • 증명: 귀납법 이용

    • 귀납출발점

    • 귀납가정:

    • 귀납절차


2941170

int fib (int n) { if (n <= 1)return n;

else return fib(n-1) + fib(n-2);}

토의

  • 깔끔하다.

  • 그러나 느리다.

  • 왜?

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

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


2941170

피보나찌 수 – 반복적 방법

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

}


2941170

토의

  • 빠르기

    • 왜?

  • 배열 사용 안 하기?

    • 과제


Analysis

알고리즘의 분석(Analysis)

  • 어느 것이 가장 효율적인(efficient) 알고리즘이고 얼마나 효율적인가?

  • Cf) 문제 분석

    • 풀 수 있는 것, 못 푸는 것, P, NP, NP-Complete,…)

  • 시간 복잡도 분석(Time Complexity Analysis)

    • 실제 CPU 시간?

    • 명령어 수?

  • 기계, 언어, 프로그래머에 독립적인 기준 필요

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


2941170

입력 크기와 단위 연산

  • 입력 크기

    • 배열의 크기

    • 리스트의 길이

    • 행렬에서 행과 열의 크기

    • 트리에서 마디와 이음선의 수

    • 예) 순차검색, 이분검색

  • 단위 연산

    • 비교, 지정

    • 경험과 판단으로 결정(규칙은 없지만 어렵지 않다.)


2941170

분석 방법의 종류

  • 모든 경우 분석(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;

}


2941170

분석 방법의 종류

  • 모든 경우 분석(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];

}


2941170

분석 방법의 종류

  • 모든 경우 분석(Every-case analysis): T(n)

    • 알고리즘의 성능은 입력의크기에만 영향을 받음

  • 교환정렬

    • j-루프가 수행될 때마다 단위연산 1번 수행

    • 총 수행횟수

      • i = 1, j-루프 ? 번

      • i = 2, j-루프 ? 번

      • i = 3, j-루프 ? 번

      • i = n-1, j-루프 ? 번


2941170

분석 방법의 종류

  • 모든 경우 분석(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;

}


2941170

분석 방법의 종류

  • 모든 경우 분석(Every-case analysis): T(n)

    • 알고리즘의 성능은 입력의크기에만 영향을 받음

  • 최악의 경우 분석(Worst-case analysis): W(n)

    • 입력크기와 입력값 모두에 종속

    • 단위연산이 수행되는 횟수가 최대인 경우

  • 최선의 경우 분석(Best-case analysis): B(n)

  • 평균의 경우 분석(Average-case anlysis): A(n)

    • 입력크기와 입력값 모두에 종속

    • 모든 입력에 대해서 단위연산이 수행되는 기대치(평균)

    • 각 입력에 대해 확률 할당

    • 일반적으로 최악의 경우보다 계산이 복잡


2941170

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

  • 단위연산: S[location] != x

  • 입력크기: n

  • 분석:

    • 경우 1: x가 배열 S안에 있을 경우

      • 1≤k≤n, x가 배열의 k번째 있을 확률: ?

      • x가 k번째 있다면, 수행해야 할 단위 연산의 횟수: ?


2941170

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

  • 단위연산: S[location] != x

  • 입력크기: n

  • 분석:

    • 경우 2: x가 배열 S안에 없는경우도 고려하면

      • x가 배열 S안에 있을 확률을 p라 하면,

        • x가 k번째 있을 확률: ?

        • x가 배열에 없을 확률: ?


2941170

토의

  • 시간 복잡도 분석

    • 최악, 최선, 평균 어느 것이 유용할까?

  • cf) 공간 복잡도 분석?

  • cf) 정확성 분석?

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

    • 정확한 알고리즘

      • 어떠한 입력에 대해서도 답을 출력하면서 멈추는 알고리즘

    • 정확하지 않은 알고리즘

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


  • Login