Algorithm

[Algorithm] 시간복잡도

콩스프 2022. 11. 15. 04:24

알고리즘이란?

어떤 문제를 해결하기 위한 일련의 절차를 공식화한 형태로 표현한 것.

  • 집에서 학교로 가는 길 찾기
  • 샌드위치 만드는 방법
  • 매점에 가서 물건 구매하기

 

프로그래밍에서의 알고리즘

input 값을 통해 output 값을 얻기 위한 계산 과정을 의미

이러한 문제를 해결할 때, 정확하고 효율적으로 결과값을 얻기 위해 알고리즘이 필요

 

알고리즘의 조건

  •  입력  : 외부에서 제공되는 자료가 0개 이상 존재
  •  출력  : 적어도 2개 이상의 서로 다른 결과를 내어야 함. 즉 모든 입력에 하나의 출력이 나오면 X
  •  명확성  : 수행 과정은 명확하고 모호하지 않은 명령어로 구성되어야 함
  •  유한성  : 유한 번의 명령어를 수행 후 유한 시간 내종료
  •  효율성  : 모든 과정은 명백하게 실행 가능(검증 가능)한 것이어야 함

 

 

알고리즘의 효율성 표현

  • 빠른 알고리즘을 만들기 위해 가장 먼저해야 할 일 ➡ 알고리즘의 속도를 어떻게 측정할지 정하는 것

 

Q) 두 알고리즘의 속도를 비교하는 가장 좋은 방법이 뭘까?

A) 같은 입력에 대해 두 프로그램의 수행 시간을 측정해보자
부적합

 

WHY?

1) 프로그램의 수행 시간은 사용한 프로그래밍 언어, 운영체제, 컴파일러 등 수많은 요소에 의해 바뀔 수 있음

2) 외적인 요인을 전부 통일해도 사용한 문자열 구현, 함수 인자를 어떻게 넘겼는지 등에 따라 크게 달라짐

3) 프로그램의 실제 수행 시간이 다양한 입력에 대한 실행 시간을 반영하지 못함

 

수행시간을 측정할 다른 기준이 필요

 

 

시간 복잡도

시간복잡도 (time complexity) : 알고리즘이 실행되는 동안 수행하는 기본적인 연산의 수입력의 크기에 대한 함수료 표현
  • 가장 널리 사용되는 알고리즘의 수행 시간 기준

 

  • 최악 경우 분석 (worst case analysis)
    : 어떤 입력이 주어지더라도 얼마 이상을 넘지 않는다
  • 평균 경우 분석 (average case analysis)
    : 입력의 확률 분포를 가정하여 분석
    : 대부분 균등 분포 (uniform distribution)을 가정 = 입력이 무작위로 주어진다고 가정
  • 최선 경우 분석(best case analysis)
    : 거의 사용되지 않지만 최적(optimal) 알고리즘을 고안하는 데 참고 자료로서 활용됨

 

일반적으로 최악 경우 분석으로 알고리즘의 복잡도를 나타냄

대부분의 알고리즘이 입력에 따라 수행 시간이 다를 수 있기 때문

 

 

분석 방법 EX)

  • 최선 경우 : 집을 나와서 6분 후 지하철 역에 도착하고 운이 좋게 바로 열차를 탄 경우 (6 + 20 + 10 = 36분)
  • 최악 경우 : 역에 도착 후 승차하려는 순간 문이 닫혀서 다음 열차를 기다려야 하는 경우 (36 + 4 (기다리는 시간) =  40분)
  • 평균 경우 : 최악과 최선의 중간이라 가정 (36 + 2 = 38분)

 

"늦어도 40분이면 간다"최악 경우를 뜻함

 

 

 

복잡도의 점근적 표기

  • 시간복잡도 → 입력 크기에 대한 함수로 표기 → 여러 개의 항을 가지는 다항식
  • 단순한 함수로 표현하기 위해 점근적 표기 (asymptotic notation)을 사용
  • 입력 크기 n이 무한대로 커질 때의 복잡도를 간단히 표현하기 위해 사용하는 표기법
    EX) 3n3 - 15n2 + 10n - 18    ➡    n3

 

  • 상한, 하한, 동일한 증가율의 개념을 적용하여 점근적 표기를 사용함
    • O (Big - Oh) 표기
      : 복잡도의 점근적 상한
    • Ω (Big - Omega) 표기
      : 복잡도의 점근적 하한
    • θ (Theta) 표기
      : 복잡도의 상한과 하한이 동시에 적용되는 경우

 

 

O (Big - Oh) 표기법

  • 함수의 점근적 상한을 나타냄
  • 간단히 말하면 주어진 함수에서 가장 빨리 증가하는 항만을 남긴 채 나머지를 다 버리는 표기법

 

N 에 대한 함수f (N)이 주어질 때, f(N) = O(g(N))

아주 큰 N0C (N0 , C > 0)를 적절히 선택하면 N ≤ N인 모든 N에 대해 |f(N)| ≤ C × |g(N)|이 참이 되도록 할 수 있다

 

EX) N2 + 100 × N + 1 = O(N2)

N2 N2 + 100 × N + 1 보다 작지만, 이 중 가장 빠르게 증가하는 항

N 이 엄청나게 커지게 되면  N2 N2 + 100 × N + 1 사이에는 큰 차이가 없게 됨

 

적절한 상수 C 를 선택해 N2 에 곱해주면 항상 N2이 더 크다고 할 수 있음

 -  N0 = 1000, C = 2 라고 하면 위 조건이 항상 성립

 

 

   

O (Big - Oh) 표기법 성능비교

 

O(1) 상수 시간 (constant time) 짝수 인지 홀수인지 결정
O(logN) 로그(대수) 시간 (logarithmic time) 이진 탐색
O(N) 선형 시간 (linear time) 선형 탐색
O(NlongN) 로그 선형 시간 (log-linear time) 합병 정렬
O(N2) 이차 시간 (quandratic time) 버블 정렬
O(2N) 지수 시간 (exponential time) 피보나치 수열 (재귀함수)

 

  • 상수시간 O(1)입력 크기 n에 대하여 변하지 않는 일정한 시간이 걸린다는 뜻
  • 일반적으로 k가 상수일 때, O(Nk) 다항식 시간 (polynomial time)이라고 말함

 

참고문헌

1) 양성봉, 알기 쉬운 알고리즘, 생능출판 (2013)

2) 구종만, 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략, 인사이트 (2012)

3) [위키백과] Big O notation