시간 복잡도 개요

시간 복잡도 개요

시간 복잡도Time Complexity는 알고리즘의 효율성을 평가하는 척도로, 입력 크기(데이터의 양)가 증가할 때 알고리즘이 수행하는 연산의 횟수가 어떻게 변하는지를 나타냅니다. 이를 통해 알고리즘이 얼마나 빠르게 실행될 수 있는지 예측할 수 있으며, 효율적인 코드 작성에 중요한 역할을 합니다.

시간 복잡도의 필요성

  • 성능 평가: 알고리즘의 실행 시간을 정량적으로 비교하기 위해 필요합니다. 두 가지 알고리즘이 동일한 문제를 해결할 수 있을 때, 시간 복잡도를 비교함으로써 더 효율적인 알고리즘을 선택할 수 있습니다.
  • 확장성 평가: 입력 크기가 커질수록 알고리즘의 실행 시간이 어떻게 변하는지 알 수 있어, 프로그램이 실제 환경에서 문제없이 작동할 수 있는지를 예측할 수 있습니다.

시간 복잡도 표기법

빅오 표기법

빅오 표기법O-notation은 알고리즘의 최악의 경우를 표현합니다. 입력 크기가 무한히 커질 때, 수행 시간의 증가율을 나타냅니다.

O(1): 상수 시간

입력 크기에 관계없이 일정한 시간이 소요됩니다.

int GetFirstElement(int[] array) 
{
   return array[0];
}
  • 배열의 첫 번째 요소를 반환하는 함수로, 입력 크기에 상관없이 일정한 시간이 소요됩니다.

O(n): 선형 시간

입력 크기에 비례해 시간이 증가합니다.

int Sum(int[] array) 
{
int total = 0;
foreach (int num in array) {
    total += num;
}
return total;
}
  • 배열의 모든 요소를 더하는 함수로, 입력 크기만큼 반복 작업이 필요합니다.

O(log n): 로그 시간

입력 크기가 증가해도 시간 증가율은 매우 느립니다.


int BinarySearch(int[] sortedArray, int target) {
   int left = 0;
   int right = sortedArray.Length - 1;
   while (left <= right) {
	   int mid = (left + right) / 2;
	   if (sortedArray[mid] == target) {
		   return mid;
	   } else if (sortedArray[mid] < target) {
		   left = mid + 1;
	   } else {
		   right = mid - 1;
	   }
   }
   return -1; // 찾지 못한 경우
}
  • 정렬된 배열에서 이진 탐색을 수행하는 함수로, 검색 범위를 절반씩 줄여나가므로 로그 시간 복잡도를 가집니다.

O(n^2): 이차 시간

중첩된 반복문에서 자주 나타나며, 입력 크기가 커질수록 실행 시간이 크게 증가합니다.


void PrintPairs(int[] array) {
   for (int i = 0; i < array.Length; i++) {
	   for (int j = 0; j < array.Length; j++) {
		   Console.WriteLine(array[i] + ", " + array[j]);
	   }
   }
}
  • 중첩된 반복문이 존재하여, 입력 크기가 증가할수록 수행 시간이 제곱으로 증가합니다.

빅세타 표기법

빅세타 표기법Θ-notation은 알고리즘의 평균적인 수행 시간을 표현하며, 최선과 최악의 경우의 중간 정도로 예상되는 실행 시간을 나타냅니다.

빅오메가 표기법

빅오메가 표기법Ω-notation은 알고리즘의 최선의 경우를 표현하여, 최소한 어느 정도의 시간이 소요될지 예측할 수 있습니다.

시간 복잡도의 중요성

  • 알고리즘 선택: 문제를 해결하기 위해 여러 알고리즘을 선택할 수 있을 때, 시간 복잡도를 기준으로 가장 효율적인 알고리즘을 선택할 수 있습니다.
  • 확장성과 성능: 프로그램이 대용량 데이터에서도 적절한 성능을 보일 수 있도록 확장성을 고려하는 데 도움을 줍니다.

일반적인 시간 복잡도 계층 구조

  • O(1) < O(log n) < O(n) < O(n log n) < O(n^2) < O(2^n) < O(n!)
  • 상수 시간과 로그 시간은 매우 효율적인 알고리즘의 시간 복잡도이고, 이차 시간 이상의 복잡도는 입력 크기가 커질수록 비효율적일 수 있습니다.

맺음말

시간 복잡도는 알고리즘의 효율성을 평가하는 중요한 기준으로, 프로그램의 성능을 최적화하고 확장성을 고려하는 데 필수적인 개념입니다. 빅오 표기법을 통해 다양한 알고리즘의 효율성을 이해하고, 실제 문제 해결에 적합한 알고리즘을 선택하는 데 활용할 수 있습니다.