티스토리 뷰

Algorithm

부경대 IT융합응용공학과 권오흠 교수님의 영리한 프로그래밍을 위한 알고리즘 강좌와 '쉽게 배우는 알고리즘: 관계중심의 사고법 - 문병로'등을 통한 알고리즘 학습 강좌 링크

1. 알고리즘의 분석

  • 알고리즘의 자원(resource) 사용량을 분석

  • 자원이란 실행시간, 메모리, 저장장치, 통신 등

  • 여기서 실행시간의 분석에 대해서 다룸

시간복잡도

  • 실행시간은 실행환경에 따라 달라짐

    • 하드웨어, 운영체제, 언어, 컴파일러 등

  • 실행시간을 측정하는 대신 연산의 실행 횟수를 카운트

  • 연산의 실행 횟수는 입력 데이터의 크기에 관한 함수로 표현

  • 데이터의 크기가 같더라고 실제 데이터에 따라서 달라짐

    • 최악의 경우 시간복잡도(worst-case analysis)

    • 평균 시간복잡도(average-case analysis)

점근적(Asymptotic) 분석

점근적 표기법을 사용

  • 데이터의 개수 n → ∞ 일때 수행시간이 증가하는 growth rate로 시간복잡도를 표현하는 기법

  • Θ-표기, Ο-표기 등을 사용

유일한 분석법도 아니고 가장 좋은 분석법도 아님

  • 다만 (상대적으로) 가장 간단하며

  • 알고리즘의 실행환경에 비의존적임

  • 그래서 가장 광범위하게 사용됨

점근적 분석의 예: 상수 시간 복잡도

입력으로 n개의 데이터가 저장된 배열 data가 주어지고, 그 중 n/2번째 데이터를 반환한다.


int sample(int data[], int n) {
 int k = n / 2;
 return data[k];
}

n에 관계없이 상수 시간이 소요된다. 이 경우 알고리즘의 시간복잡도는 Ο(1)이다.

점근적 분석의 예: 선형 시간복잡도

입력으로 n개의 데이터가 저장된 배열 data가 주어지고, 그 합을 구하여 반환한다.


int sum(int data[], int n) {
 int sum = 0;
 for (int i = 0; i < n; i++)
   sum = sum + data[i];
 return sum;
}

선형 시간복잡도를 가진다고 말하고 Ο(n)이라고 표기한다.

  • sum = sum + data[i];

    • 이 알고리즘에서 가장 자주 실행되는 문장이며, 실행 횟수는 항상 n번이다. 가장 자주 실행되는 문장의 실행횟수가 n번이라면 모든 문장의 실행 횟수의 합은 n에 선형적으로 비례하며, 모든 연산들의 실행횟수의 합도 역시 n에 선형적으로 비례한다.

선형 시간복잡도: 순차탐색

배열 dat에 정수 target이 있는지 검색한다.


int search(int n, int data[], int target) {
 for (int i = 0; i < n; i++) {
   if (data[i] == target)
     return i;
}
 return -1;
}

최악의 경우 시간복잡도는 Ο(n)이다.

  • if (data[i] == target)

    • 이 알고리즘에서 가장 자주 실행되는 문장이며, 실행 횟수는 최악의 경우 n번이다.

Quadratic

배열 x에 중복된 원소가 있는지 검사하는 함수이다.


bool is_distinct(int n, int x[]) {
 for (int i = 0; i < n - 1; i++)
   for (int j = i + 1; j < n; j++)
     if (x[i] == x[j])
       return false;
 return true;
}

최악의 경우 배열에 저장된 모든 원소 쌍을 비교 하므로 비교 연산의 횟수는 n(n-1)/2이다. 최악의 경우 시간복잡도는 O(n²)으로 나타낸다.

  • 이 알고리즘에서 가장 자주 실행되는 문장이며, 최악의 경우 실행 횟수는 n(n-1)/2번이다.

점근적 표기법

  • 알고리즘에 포함된 연산들의 실행 횟수를 표기하는 하나의 기법

  • 최고차항의 차수만으로 표시

  • 따라서 가장 자주 실행되는 연산 혹은 문장의 실행횟수를 고려하는 것으로 충분

추가적인 내용은 학습 자료 링크로 대신한다. 링크

알고리즘의 본격적인 학습에 앞서 알고리즘 설계와 분석 기초에 관한 내용은 링크에 있는 PDF자료와 '쉽게 배우는 알고리즘 관계 중심의 사고법 - 문병로'를 통해 학습한다. 내용은 수행시간, 재귀와 귀납적 사고, 점근적 표기에 대한 이해, 점근적 표기법에 대한 이해 등이다.







댓글