알고리즘

알고리즘 소개

haong_ 2025. 3. 2. 21:43

1. 알고리즘 분석

정확성 분석 

  • 유효한 입력에 대해 일정 시간내에 정확한 결과의 생성 여부 

효율성 분석 

  • 알고리즘 수행에 필요한 컴퓨터 자원의 양을 측정/평가
  • 공간 복잡도 (space complexity): 메모리의 양 = 정적 공간 + 동적 공간
  • 시간 복잡도: 수행시간 = 알고리즘의 실행에서부터 완료까지 걸리는 시간 

시간 복잡도

알고리즘 수행시간 = Σ{각 연산이 수행되는 횟수}

수행 시간에 영향을 미치는 요인 

입력크기 (리스트 원소의 개수, 행렬의 크기 등)

  • 입력크기 n이 커질수록 수행시간 증가 > 입력크기 n의 함수 f(n)으로 표현 

입력 데이터의 상태 

 : 크기 n인 입력들의 집합 
P(i) : 입력 i가 발생할 확률
T(i) : 입력 i 에 대한 알고리즘의 수행시간
  • 평균 수행시간 
  • $$ A(n) = \sum_{i=1}^{n} P(i) \cdot T(i) $$
  • 최선 수행시간

$$ B(n) = \min_{i \in S(n)} T(i) $$

  • 최악 수행시간 -> "아무리 오래 걸려도 이 시간안에는 수행된다" 알고리즘 간 우열을 가리기 좋음

$$ W(n) = \max_{i \in S(n)} T(i) $$

2. 점근 성능

점근성능이란

  • 입력 크기 n이 무한히 커짐에 따라 결정되는 성능 
  • 수행시간의 정확한 값이 아닌 어림값으로 수행시간의 증가 추세 파악이 쉬움 
  • 수행시간의 다항식 함수에서 최고차항만을 계수 없이 취해서 표현 

점근성능의 표기법 

빅오(Big-O)

  • 최악 수행 시간의 상한을 나타냄.
  • 입력 크기 n이 증가할 때, 수행 시간이 "최대" 얼마나 걸릴 수 있는지를 분석.
  • 어떤 입력에서도 이보다 느리진 않다는 보장을 함.
  • 최대 f(n)만큼 시간이 걸린다 

빅오메가(Big-Ω)

  • 최선(Best-case) 수행 시간의 하한을 나타냄.
  • 어떤 입력에서 최소한 이만큼의 시간이 걸린다.
  • 최소 f(n)의 시간이 걸린다

빅쎄타(Big-Θ)

  • 시간 복잡도의 상한과 하한이 일치하는 경우.
  • 수행 시간이 항상 f(n)과 비슷하게 걸린다는 의미.
  • 최악과 최선이 f(n)으로 수렴한다 

시간 복잡도 순서 

표기법 이름 예시 특징
O(1) 상수 시간 해시 테이블 조회, 배열 인덱싱 입력 크기와 관계없이 항상 일정한 시간
O(log n) 로그 시간 이진 탐색 입력 크기가 커져도 상대적으로 증가 속도가 느림
O(n) 선형 시간 단순 반복문 (배열 순회) 입력 크기에 비례하여 실행 시간 증가
O(n log n) 선형로그 시간 퀵 정렬, 병합 정렬 거의 모든 효율적인 정렬 알고리즘
O(n²) 이차 시간 버블 정렬, 선택 정렬, 삽입 정렬 중첩된 반복문 (이중 for문)
O(2ⁿ) 지수 시간 피보나치 (재귀), 부분집합 생성 입력 크기가 조금만 커져도 매우 느려짐
O(n!) 팩토리얼 시간 외판원 문제(완전 탐색) 가장 비효율적, 거의 사용 불가능

빅오 함수에 따른 연산 시간의 증가추세 

n logn nlogn 2ⁿ
1 0 0 1 1 2
2 1 2 4 8 4
4 2 8 16 64 16
8 3 24 64 512 256
16 4 64 256 4096 65536
32 5 160 1024 32768 4294967296

3. 순환 알고리즘 (재귀)

  • 알고리즘의 수행 과정에서 자기 자신의 알고리즘을 다시 호출하여 수행하는 형태의 알고리즘
  • 재귀적인 알고리즘에서는 현재 문제를 더 작은 문제로 나누어 해결하는데 이 과정에서 수행시간을 점화식으로 표현할 수 있음

점화식 

  • 이전 단계의 값을 이용해 다음 값을 계산하는 형태의 수식 
  • 예를 들어 이진탐색은 문제를 절반으로 줄여서 풀기 때문에 수행시간은 다음과 같음 

$$ T(n) = T(n/2) + O(1) $$ 

  • T(n/2) : 문제를 반으로 줄여서 해결할때의 수행 시간
  • O(1) : 현재 단계에서 수행하는 추가 작업의 시간 
  • 즉 현재 크기 n의 문제를 크기 n/2로 줄이고 그 과정에서 추가적인 일정한 작업(이진 탐색에서는 가운데 원소 비교와 방향 결정 과정)을 수행

점화식의 폐쇄형 

  • 위와 같은 점화식은 재귀적인 형태라 실제 계산이 어려움. 이를 일반적인 수식으로 변환한 것이 폐쇄형 표현
  • 반복적인 관계를 없애고 한번에 계산할 수 있도록 만든 것 

위의 이진 탐색의 점화식을 폐쇄형으로 풀면 

1. 첫번째 호출:

$$ 
T(n) = T(n/2) + O(1) 
$$

2. 두번째 호출:

$$ 
T(n/2) = T(n/4) + O(1) 
$$ 

$$ 
T(n) = (T(n/4) + O(1)) + O(1) = T(n/4) + 2O(1) 
$$ 

3. 세번째 호출:

$$ 
T(n/4) = T(n/8) + O(1) 
$$

$$ 
T(n) =  (T(n/8) + O(1)) + 2O(1) = T(n/8) + 3O(1) 
$$ 

이렇게 반복하다 보면 

$$ 
T(n) = T(n/2^k) + kO(1)
$$

점화식은 입력 크기가 1이 될 때 끝나므로,

$$ 
n/2^k = 1
$$

이 되는 k를 찾으면  

$$ 
n = 2^k 
$$

양변에 로그를 취하면,

$$ 
k = \log_2 n 
$$ 

처음 점화식에서 \( T(1) \) 은 \( O(1) \) 이 되고, k는 \( \log_2 n \) 이 되므로 

$$ 
T(n) = O(1) + O(\log n) = O(\log n) 
$$

따라서 최종적으로 

$$ 
T(n) = O(\log n) 
$$

이렇게 식이 나오게 된다. 

실제 알고리즘들의 점화식과 폐쇄형 정리

알고리즘 점화식 폐쇄형
이진 탐색 T(n) = T(n/2) + O(1) O(log n)
퀵 정렬 (최악) T(n) = T(n-1) + O(n) O(n²)
퀵 정렬 (최선, 평균) T(n) = 2T(n/2) + O(n) O(n log n)
병합 정렬 T(n) = 2T(n/2) + O(n) O(n log n)