티스토리 뷰
시간 복잡도(Time Complexity)와 공간 복잡도(Space Complexity)
성능 분석 방법이 필요한 이유는 우리가 자료를 처리할 때 단순이 잘 돌아만 가는 것을 원하는게 아니라 어떠한 상황에서도 우월한 성능을 내기를 원하기 때문이다.
▶알고리즘을 평가하는 두 가지 요소
시간 복잡도(Time Complexity) : 얼마나 빠른가
공간 복잡도(Space complexity) : 얼마나 메모리를 적게 사용하는가
사실 메모리를 적게 쓰고 속도도 빠른 알고리즘이 최적의 알고리즘이다. 하지만 대개 알고지즘을 평가할 때는 메모리 사용량보다 속도에 초점을 둔다.
▶성능을 평가하는 방법
성능은 어떻게 평가할까?
위의 표를 보면 2개의 알고리즘 A,B가 있다. 이 두개의 A,B를 비교해 보자
위의 표만 보면 기준을 두 가지로 나눌 수 있다. 즉 데이터가 n보다 작을때와 클 때의 두 가지로 나눌 수 있을 것이다. 자, 그럼 어떤 알고리즘이 더 좋은 알고리즘일까?
정답은 A 알고리즘이다.
이유는 데이터의 수가 적은 둘 간의 속도 차이가 얼마나 나겠는가? 중요한 것은 데이터의 수가 많아짐에 따른 연산횟수의 증가 정도에 있다.
하지만 A 알고리즘이 더 좋다고 해서 B 알고리즘이 없어도 된다는 말은 하면 안 된다.
A알고리즘의 경우 B 알고리즘보다 구현이 더 어렵기 때문에 데이터가 적은 경우에는 B를 선택해도 되기 때문이다.
결국, 하고 싶은 말은 상황에 맞게 답을 내려 쓰자는 것이다. (여기서 A가 맞는 이유는 자료구조는 적은 데이터에서 보다 많은 데이터에서 최상의 효율을 내는 알고리즘을 필요로 하기 때문)
순차 탐색(Linear Search) 알고리즘과 시간 복잡도 분석의 핵심요소
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<stdio.h> int LSearch(int ar[], int len, int target) { for (int i = 0; i < len; i ++ ) { if (ar[i] == target) return i; //찾은 대상의 인덱스 값 반환 } return -1; //찾지 못했음을 의미하는 값 반환 } int main() { int arr[] = { 3,5,2,4,9 }; int idx; idx = LSearch(arr, sizeof(arr) / sizeof(int), 4); if (idx == -1) print("탐색 실패\n"); else print("타켓 저장 인덱스 :%d\n", idx); return 0; } | cs |
실행 결과는
타켓 저장 인덱스 : 3
위 예제는 C언어를 공부하면서 한 번 정도는 구현해 봤을법한 순차 탐색 알고리즘이다. 이제 이 알고리즘을 실제로 구현하는 코드만 봐 보자.
이제 위의 코드를 토대로 시간 복잡도를 분석해 데이터의 수 n에 대한 연산횟수의 함수 T(n)을 구해보자.
위 알고리즘에서 연산자는 <, ++, == 총 3개이이다. 여기서 가장 핵심 연산자는 뭘까?
바로 == 연산자이다. == 연산자를 적게 사용하면 < 연산자와 ++ 연산자를 적게 사용하고, ==연산자를 많이 사용하면 < 연산자와 ++ 연산자를 많이 사용하게 된다.
이렇듯 알고리즘의 핵심 연산이 무엇인지 잘 판단해야 한다. 그리고 그 연산자 중심으로 시간 복잡도를 계산해야 한다.
최선의 경우, 최악의 경우, 평균적인 경우
최악의 경우의 시간 복잡도 계산
우리가 이 파트에서 다룰 내용은 알고리즘의 성는 분석이였다.
"와우, 그럼 알고리즘의 성능은 T(n)으로 표연하는구나" 하고 넘어갈 수 있다.
하지만 그래서는 안된다.
좀 김 빠질 수 있지만 이제 진짜 성능을 나타내는 방법을 이야기할 것이다.
빅 - 오 표기법(Big oh Notation)
위의 과정을 보면 가장 최고차항이 높은 식을 가리켜 빅오의 값으로 얻고 있다. 왜 나머지는 버리는 것일까?
다음 표를 보면서 이해해보자
표에서 보이듯이 데이터의 수(n)이 증가할수록 최고차항이 차지하는 비율은 절대적이다. 따라서 성능을 평가 할 때에는 항상 가장 높은 차항의 값을 데이터화 하여 개선 방안을 찾아 내어야 한다.
빅 - 오 표기법의 종류와 성능
빅-오 표기법의 종류
● O(1) - (상수) Constant
- 입력되는 데이터의 양과 상관없이 일정한 실행 시간을 가지낟.
- 알고리즘이 문제를 해결하는데 오직 한 단계만 거친다.
성능비교
'자료구조' 카테고리의 다른 글
단순 연결 리스트(1/2) (0) | 2018.11.10 |
---|---|
하노이타워(재귀적 구현) (0) | 2018.10.03 |
재귀의 활용 (0) | 2018.05.21 |
함수의 재귀적 호출의 이해 (0) | 2018.05.17 |
자료구조에 대한 기본적인 이해 (0) | 2018.05.10 |