본문 바로가기

ETC

시간 복잡도란?

728x90
반응형

시간 복잡도(Time Complexity)는 알고리즘이 실행되는 데 걸리는 시간의 증가율을 나타내는 척도이다.

시간 복잡도를 분석함으로써 알고리즘이 입력 크기에 따라 얼마나 빠르게 실행되는지 평가할 수 있다.

시간 복잡도는 보통 빅 오 표기법(Big-O Notation)으로 표현되며, 입력 크기 n이 증가할 때 알고리즘의 실행 시간이 어떻게 증가하는지를 나타낸다.

 

오늘 포스팅에서는 일반적인 시간 복잡도 유형과 그 의미에 대해 알아보자.


O(1) - 상수 시간(Constant Time)

  • 알고리즘이 입력 크기에 관계없이 일정한 시간 내에 실행된다.
  • 예: 배열의 첫 번째 원소에 접근하기
public class ConstantTime {
    public static int getFirstElement(int[] arr) {
        return arr[0];
    }
}

 

O(log n) - 로그 시간(Logarithmic Time)

  • 입력 크기가 커질수록 실행 시간이 로그 함수처럼 느리게 증가한다.
  • 주로 이진 탐색(Binary Search)과 같은 알고리즘이 해당된다.
public class LogarithmicTime {
    public static int binarySearch(int[] arr, int target) {
        int left = 0, right = arr.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (arr[mid] == target) {
                return mid;
            } else if (arr[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }
}

 

O(n) - 선형 시간(Linear Time)

  • 입력 크기 n에 비례하여 실행 시간이 선형적으로 증가한다.
  • 배열의 모든 요소를 하나씩 살펴보는 알고리즘이 대표적이다.
public class LinearTime {
    public static int linearSearch(int[] arr, int target) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == target) {
                return i;
            }
        }
        return -1;
    }
}

 

O(n log n) - 로그 선형 시간(Log-Linear Time)

  • 합병 정렬(Merge Sort)과 퀵 정렬(Quick Sort)과 같은 효율적인 정렬 알고리즘이 이 시간 복잡도를 가진다.
  • 입력 크기가 증가함에 따라 에 비례하여 실행 시간이 증가한다.
  • 예시 : 합병 정렬
import java.util.Arrays;

public class LogLinearTime {
    public static int[] mergeSort(int[] arr) {
        if (arr.length <= 1) {
            return arr;
        }
        int mid = arr.length / 2;
        int[] left = mergeSort(Arrays.copyOfRange(arr, 0, mid));
        int[] right = mergeSort(Arrays.copyOfRange(arr, mid, arr.length));
        return merge(left, right);
    }

    private static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        int i = 0, j = 0, k = 0;

        while (i < left.length && j < right.length) {
            if (left[i] < right[j]) {
                result[k++] = left[i++];
            } else {
                result[k++] = right[j++];
            }
        }
        while (i < left.length) {
            result[k++] = left[i++];
        }
        while (j < right.length) {
            result[k++] = right[j++];
        }
        return result;
    }
}

 

O(n²) - 이차 시간(Quadratic Time)

  • 이중 반복문을 사용하는 알고리즘이 이차 시간 복잡도를 가진다.
  • 삽입 정렬(Insertion Sort), 선택 정렬(Selection Sort) 등의 정렬 알고리즘이 여기에 해당된다.
  • 예시 : 버블 정렬
public class QuadraticTime {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

 

O(2ⁿ) - 지수 시간(Exponential Time)

  • 피보나치 수열을 재귀적으로 계산하는 알고리즘처럼 입력이 증가할수록 실행 시간이 매우 빠르게 증가한다.
  • 예시 : 재귀 피보나치
public class ExponentialTime {
    public static int fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

 

O(n!) - 팩토리얼 시간(Factorial Time)

  • 매우 비효율적인 알고리즘으로, 순열이나 조합을 생성할 때 발생한다.
  • 입력 크기가 작아도 실행 시간이 빠르게 증가하여 실용적이지 않다.
728x90
반응형

'ETC' 카테고리의 다른 글

NoSql이란?  (2) 2024.10.11
동기 / 비동기  (0) 2024.10.10
jQuery란?  (1) 2024.10.06
데이터 분리보관 및 DB 마스킹  (0) 2024.10.03
크로스 사이트 스크립트(XSS)란?  (0) 2024.10.02