종제로
종제로 Devlog
종제로
전체 방문자
오늘
어제
  • 분류 전체보기 (43)
    • C, C++ (22)
      • C, C++ (10)
      • Modern C++ (4)
      • 전문가를 위한 C++ (책) (8)
    • DirectX 자체엔진 개발 (8)
    • 자료구조 알고리즘 (10)
      • 공부 (9)
      • 문제풀이 (1)
    • 자기 계발 (1)
    • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 전문가를 위한 C++
  • DirectX11
  • directX
  • c++ 17
  • C
  • c++ 11
  • C++
  • 자료구조
  • 모두의C언어
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
종제로

종제로 Devlog

자료구조 알고리즘/공부

자료구조와 알고리즘 (2)

2022. 1. 3. 07:21

알고리즘의 성능 분석

- 수행시간 측정방법

가장 단순하지만 가장 확실한 방법은 알고리즘을 프로그래밍 언어로 작성하여 실제 컴퓨터상에서 실행시킨 다음, 그 수행시간을 측정하는 것이다. C언어에서 수행시간을 측정하는 방법에는 다음과 같이 2가지의 방법이 있다.

 

[방법 1]

#include <time.h>

start = clock();
...
stop = clock();

double duration = (double)(stop - start) / CLOCKS_PER_SEC;

clock() 함수는 호출 프로세스에 의하여 사용된 CPU 시간을 계산한다. clock() 함수는 호출되었을 때의 시스템 시각을 CLOCKS_PER_SEC 단위로 반환한다. 따라서 초단위의 시간을 측정하기 위하여 (stop - start)값을 CLOCKS_PER_SEC로 나누어 주면 된다.

 

[방법 2]

#include <time.h>

start = time(NULL);
...
stop = time(NULL);

double duration = (double)difftime(stop, start);

time() 함수는 초 단위로 측정된 시간을 반환한다. time(NULL) 형태로 호출하면 현재 시간이 넘어온다. 두 가지 시간을 difftime()으로 보내면 차이가 초단위로 반환된다.

 

- 빅오 표기법

f(n) = 5 -> O(1)
f(n) = 2n + 1 -> O(n)
f(n) = 3n² + 100 -> O(n²)
f(n) = 5·2ⁿ + 10n² + 100 -> O(2ⁿ)

 

빅오 표기법을 사용하면 시간 복잡도 함수의 증가에 별로 기여하지 못하는 항을 생략함으로써 시간복잡도를 간단하게 표시할 수 있다. 빅오 표기법을 얻는 간단한 방법은 기본연산의 횟수가 다항식으로 표현되었을 경우 다항식의 최고차항만을 남기고 다른 항들과 상수항을 버리는 것이다. 최고차항의 계수도 버리고 단지 최고차항의 차수만을 사용한다. 다만, logn은 없애버리면 안 된다. logn도 차수를 가지고 있기 때문이다.

f(n) = 8n²logn + 5n² + n -> O(n²logn)

 

O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(2ⁿ) < O(n!)

여기서 주의할 것은 상수항이나 계수가 굉장히 큰 경우에는 수행시간에 영향을 끼친다는 것이다. 예를 들어 두개의 알고리즘, A와 B가 있다고 하고 이들의 시간 복잡도 함수가 각각 T1(n) = 100n + 100이고 T2(n) = n²라고 하자. 알고리즘 T1을 빅오 표기법으로 표기하면 O(n)이 되고 T2는 O(n²)이 되지만 실제로 다음 표에서 보듯이 알고리즘 T1이 더 효율적이 되는 것은 n > 100인 경우이다. 따라서 n이 작을 때는 상수항이나 각항의 계수도 영향을 끼친다.

n T1(n) = 100n + 100, O(n) T2(n) = n², O(n²)
1 200 1
10 1100 100
50 5100 2500
100 10100 10000
1100 110100 1210000

 

n이 증가할 때 시간 복잡도 함수가 얼마나 증가하는지 도표로 살펴보자. 알고리즘이 지수형(2ⁿ)이나 팩토리얼형(n!)의 시간복잡도를 가지면 사실상 사용할 수 없는데 그 이유를 아래 표에서 알 수 있다. 알고리즘이 지수형이나 팩토리얼형의 시간복잡도를 가지고 있는 경우, 입력의 개수가 30을 넘으면 현재의 가장 강력한 슈퍼 컴퓨터를 동작시켜도 우주가 탄생되어 지금까지 흘러온 시간보다 더 많은 수행 시간을 요구할 수도 있다.

시간복잡도 n
1 2 4 8 16 32
1 1 1 1 1 1 1
logn 0 1 2 3 4 5
n 1 2 4 8 16 32
nlogn 0 2 8 24 64 160
n² 1 4 16 64 256 1024
n³ 1 8 64 512 4096 32768
2ⁿ 2 4 16 256 65536 4294967296
n! 1 2 24 40326 20922789888000 26313 X 10³³

 

참고

  • C언어로 쉽게 풀어쓴 자료구조 책

'자료구조 알고리즘 > 공부' 카테고리의 다른 글

[자료구조] 스택을 이용해 미로 탐색하기  (0) 2022.03.29
[자료구조] 스택  (0) 2022.03.18
[자료구조] 배열  (0) 2022.01.30
[자료구조 알고리즘] 순환(재귀)  (0) 2022.01.05
자료구조와 알고리즘 (1)  (0) 2021.12.28
    '자료구조 알고리즘/공부' 카테고리의 다른 글
    • [자료구조] 스택
    • [자료구조] 배열
    • [자료구조 알고리즘] 순환(재귀)
    • 자료구조와 알고리즘 (1)
    종제로
    종제로

    티스토리툴바