마스터 정리: 두 판 사이의 차이

IT 위키
(Created page with "'''마스터 정리'''(Master Theorem)는 분할 정복 알고리즘의 시간 복잡도를 분석하는 데 사용되는 수학적 정리이다. 주어진 재귀 관계식을 일반적인 형태로 변환하여 알고리즘의 실행 시간을 평가할 수 있도록 도와준다. ==개요== 마스터 정리는 특정 유형의 재귀 관계식을 해결하는 방법을 제공하며, 특히 분할 정복 알고리즘의 시간 복잡도를 분석하는 데 유용하다....")
 
편집 요약 없음
 
(같은 사용자의 중간 판 4개는 보이지 않습니다)
1번째 줄: 1번째 줄:
'''마스터 정리'''(Master Theorem)는 분할 정복 알고리즘의 시간 복잡도를 분석하는 사용되는 수학적 정리이다. 주어진 재귀 관계식을 일반적인 형태로 변환하여 알고리즘의 실행 시간을 평가할 있도록 도와준다.
'''마스터 정리'''(Master Theorem)는 분할 정복법(Divide and Conquer)을 사용한 알고리즘의 시간 복잡도를 계산하는 유용한 수학적 도구이다. 이 정리는 재귀적 알고리즘의 시간 복잡도를 분석하는 데 사용되며, 특히 재귀식이 다음과 같은 형태로 주어졌을 때 적용할 있다.
==개요==
==정의==
마스터 정리는 특정 유형의 재귀 관계식을 해결하는 방법을 제공하며, 특히 분할 정복 알고리즘의 시간 복잡도를 분석하는 데 유용하다. 이 정리는 다음과 같은 형태의 점화식을 해석하는 데 사용된다.
마스터 정리는 다음과 같은 형태의 재귀식을 분석하는 데 사용된다:
T(n) = aT(n / b) + f(n)
여기서,
*T(n): 문제 크기가 n일 때의 전체 시간 복잡도
*a: 문제를 분할하는 횟수 (즉, 자식 문제의 수)
*b: 각 자식 문제의 크기 비율 (b > 1)
*f(n): 분할된 문제의 결과를 합치거나 추가적으로 수행하는 작업의 복잡도
마스터 정리는 f(n)의 성장 속도와 <big>n<sup>log<sub>b</sub>a</sup></big>의 상대적인 크기에 따라 세 가지 경우로 나뉜다.
==마스터 정리의 세 가지 경우==
===경우 1 (분할이 지배적인 경우)===
*<big>'''f(n) = O(n<sup>c</sup>) 이고 c < log<sub>b</sub>a 인 경우'''</big>
**전체 시간 복잡도: <big>T(n) = Θ(n<sup>log<sub>b</sub>a</sup>)</big>
**이 경우는 f(n)이 n<sup>log<sub>b</sub>a</sup>보다 느리게 증가하므로, 전체 작업의 대부분은 재귀적으로 분할된 부분 문제에서 발생한다.
===경우 2 (균형적인 경우)===
*<big>'''f(n) = Θ(n<sup>log<sub>b</sub>a</sup>) 인 경우'''</big>
*전체 시간 복잡도: <big>T(n) = Θ(n<sup>log<sub>b</sub>a</sup> log n)</big>


<math> T(n) = aT(n/b) + f(n) </math>
* 이 경우는 분할과 추가 작업 비용이 같은 수준이므로, 로그 항이 하나 추가된다.


여기서
=== 경우 3 (추가 작업이 지배적인 경우) ===
*'''a''' : 하위 문제의 개수
*'''b''' : 입력 크기 축소 비율
*'''f(n)''' : 추가적인 작업(주어진 단계에서 수행하는 연산)
마스터 정리를 사용하면 위와 같은 점화식을 세 가지 경우로 나누어 시간 복잡도를 분석할 수 있다.
==마스터 정리의 세 가지 경우==
마스터 정리는 다음과 같은 세 가지 경우(case)로 나뉜다.
*'''Case 1: f(n) = O(n^c)''' 이고, c < log_b(a)
**대부분의 연산이 하위 문제에서 발생하며, 전체 시간 복잡도는 재귀 호출에 의해 결정된다.
**결과: <math> T(n) = O(n^{\log_b a}) </math>


*'''Case 2: f(n) = Θ(n^c)''' 이고, c = log_b(a)
* '''<big>f(n) = Ω(n<sup>c</sup>) 이고 c > log<sub>b</sub>a 인 경우</big>'''
**하위 문제와 추가 연산의 기여도가 비슷하며, 전체 시간 복잡도는 이 두 요소에 의해 균형을 이룬다.
* 그리고 다음 정규성 조건이 만족되어야 한다
**결과: <math> T(n) = O(n^c \log n) </math>
** <big>a·f(n/b) ≤ c·f(n)</big> (어떤 상수 c < 1에 대해, 충분히 큰 n에서 항상 성립)


*'''Case 3: f(n) = O(n^c)''' 이고, c > log_b(a)
*전체 시간 복잡도: <big>T(n) = Θ(f(n))</big>
**대부분의 연산이 재귀 호출 외부에서 발생하며, 추가 연산이 전체 시간 복잡도를 결정한다.
**결과: <math> T(n) = O(f(n)) = O(n^c) </math>
==예제==
다음은 마스터 정리를 사용하여 시간 복잡도를 분석하는 예제이다.
===예제 1: 병합 정렬===
병합 정렬(Merge Sort)의 시간 복잡도는 다음과 같은 재귀 관계식을 따른다.


<math> T(n) = 2T(n/2) + O(n) </math>
* 이 경우는 f(n)n<sup>log<sub>b</sub>a</sup>보다 빠르게 증가하고, 정규성 조건까지 만족할 경우 전체 작업량은 f(n)이 지배하게 된다.


이를 마스터 정리의 형태와 비교하면,
==예제==
*a = 2
===예제 1===
*b = 2
T(n) = 10T(n / 10) + log<sup>10</sup>n
*f(n) = O(n)
*a = 10, b = 10 → n<sup>log<sub>10</sub>10</sup> = n<sup>1</sup>
*log_b(a) = log_2(2) = 1
*f(n) = log<sup>10</sup>n = o(n<sup>1−ε</sup>) → 경우 1
여기서 f(n) = O(n)이고, log_b(a) = 1이므로 Case 2에 해당한다따라서 병합 정렬의 시간 복잡도는 다음과 같이 계산된다.
*정답: Θ(n)
 
=== 예제 2===
<math> T(n) = O(n \log n) </math>
T(n) = 100T(n / 10) + n<sup>10</sup>
===예제 2: 거듭 제곱(빠른 제곱법)===
* a = 100, b = 10 → n<sup>log<sub>10</sub>100</sup> = n<sup>2</sup>
거듭 제곱(Exponentiation by Squaring) 알고리즘의 시간 복잡도는 다음과 같다.
* f(n) = n<sup>10</sup> = ω(n<sup>2 + ε</sup>), 정규성 조건 만족 → 경우 3
*정답: Θ(n<sup>10</sup>)
===예제 3===
T(n) = 10T(n / 100) + (log n)<sup>log log n</sup>
*a = 10, b = 100 → n<sup>log<sub>100</sub>10</sup> = n<sup>0.5</sup>
*f(n) = (log n)<sup>log log n</sup> = o(n<sup>ε</sup>) for all ε > 0
*f(n) = o(n<sup>0.5</sup>) → 경우 1
* 정답: Θ(n<sup>0.5</sup>)
===예제 4===
T(n) = 16T(n / 4) + 4<sup>log n</sup> = 16T(n / 4) + n<sup>2</sup>*a = 16, b = 4 → n<sup>log<sub>4</sub>16</sup> = n<sup>2</sup>
*f(n) = n<sup>2</sup> = Θ(n<sup>2</sup>) → 경우 2
*정답: Θ(n<sup>2</sup> log n)
===예제 5===
T(n) = 3T(n / 8) + 1
*a = 3, b = 8, f(n) = 1 = Θ(1)
*n<sup>log<sub>8</sub>3</sup> ≈ n<sup>0.528</sup>
*f(n) = O(n<sup>log<sub>8</sub>3</sup> − ε) → 경우 1
*정답: Θ(n<sup>log<sub>8</sub>3</sup>)
===예제 6===
T(n) = 3T(n / 8) + √n · log n
*a = 3, b = 8, f(n) = n<sup>0.5</sup> log n
*n<sup>log<sub>8</sub>3</sup> ≈ n<sup>0.528</sup>
*f(n) = o(n<sup>log<sub>8</sub>3</sup>) → 경우 1
*정답: Θ(n<sup>log<sub>8</sub>3</sup>)
===예제 7===
T(n) = 18T(n / 3) + n<sup>3</sup>*a = 18, b = 3 → n<sup>log<sub>3</sub>18</sup> ≈ n<sup>2.63</sup>
*f(n) = ω(n<sup>2.63</sup>), 정규성 조건 만족 → 경우 3
*정답: Θ(n<sup>3</sup>)
===예제 8 ===
T(n) = 27T(n / 3) + n<sup>3</sup>
*a = 27, b = 3 → n<sup>log<sub>3</sub>27</sup> = n<sup>3</sup>
*f(n) = Θ(n<sup>3</sup>) → 경우 2
*정답: Θ(n<sup>3</sup> log n)
===예제 9===
T(n) = 18T(n / 3) + n<sup>2</sup> · log n
*a = 18, b = 3 → n<sup>log<sub>3</sub>18</sup> ≈ n<sup>2.63</sup>
*f(n) = o(n<sup>2.63</sup>) → 경우 1
*정답: Θ(n<sup>log<sub>3</sub>18</sup>)
===예제 10 ===
T₁(n) = 8T₁(n / 4) + n<sup>1.5</sup>
*a = 8, b = 4 → n<sup>log<sub>4</sub>8</sup> = n<sup>1.5</sup>
*f(n) = Θ(n<sup>1.5</sup>) → 경우 2
*정답: Θ(n<sup>1.5</sup> log n)
===예제 11 ===
T₂(n) = 6T₂(n / 3) + n<sup>2</sup>
*a = 6, b = 3 → n<sup>log<sub>3</sub>6</sup> ≈ n<sup>1.63</sup>
*f(n) = ω(n<sup>1.63</sup>), 정규성 조건 만족 → 경우 3
*정답: Θ(n<sup>2</sup>)
===예제 12===
  T(n) = 3T(n / 25) + log<sup>3</sup>n
* a = 3, b = 25 → n<sup>log<sub>25</sub>3</sup> ≈ n<sup>0.396</sup>
*f(n) = log<sup>3</sup>n = o(n<sup>0.396</sup>) → 경우 1
*정답: Θ(n<sup>log<sub>25</sub>3</sup>)
===예제 13===
T(n) = 8T(n / 2) + n<sup>3</sup> log<sup>3</sup>n
*a = 8, b = 2 → n<sup>log<sub>2</sub>8</sup> = n<sup>3</sup>
*f(n) = n<sup>3</sup> log<sup>3</sup>n = ω(n<sup>3</sup>), 정규성 조건 만족 → 경우 3
* 정답: Θ(n<sup>3</sup> log<sup>3</sup>n)
===예제 14===
T(n) = 25T(n / 3) + (n / log n)<sup>3</sup>
*a = 25, b = 3 → n<sup>log<sub>b</sub> a</sup> = n<sup>log<sub>3</sub> 25</sup> ≈ n<sup>2.929</sup>
*f(n) = (n/log n)<sup>3</sup> = Ω(n<sup>2.929 + ε</sup>) → 경우 3
*정답: Θ((n/log n)<sup>3</sup>)
===예제 15===
T(n) = 4T(n / 15) + √n*a = 4, b = 15 → n<sup>log<sub>15</sub>4</sup> ≈ n<sup>0.504</sup>
*f(n) = √n = n<sup>0.5</sup> = o(n<sup>0.504</sup>) → 경우 1
*정답: Θ(n<sup>log<sub>15</sub>4</sup>)
===예제 16===
T(n) = 15T(n / 4) + (n / log n)<sup>2</sup>
*a = 15, b = 4 → n<sup>log<sub>4</sub>15</sup> ≈ n<sup>1.953</sup>
*f(n) = (n / log n)<sup>2</sup> = ω(n<sup>1.953</sup>), 정규성 조건 만족 → 경우 3
*정답: Θ((n / log n)<sup>2</sup>)
== 응용 ==
마스터 정리는 다양한 알고리즘의 시간 복잡도를 분석하는 데 활용된다. 대표적인 예시는 다음과 같다.


<math> T(n) = T(n/2) + O(1) </math>
* '''합병 정렬(Merge Sort)'''
** 재귀식: T(n) = 2T(n / 2) + O(n)
** 시간 복잡도: O(n log n)
* '''퀵 정렬(Quick Sort)'''
** 평균 시간 복잡도: O(n log n)
** 최악 시간 복잡도: O(n<sup>2</sup>) (분할이 불균형할 때)
* '''행렬 곱셈(Matrix Multiplication)'''
** Strassen 알고리즘의 경우: T(n) = 7T(n / 2) + O(n^2)
** 시간 복잡도: O(n^log₇(7)) ≈ O(n<sup>2.81</sup>)


여기서
== 같이 보기 ==
*a = 1
* [[분할 정복법]]
*b = 2
* [[재귀 알고리즘]]
*f(n) = O(1)
* [[시간 복잡도]]
*log_b(a) = log_2(1) = 0
* [[퀵 정렬]]
f(n) = O(1)이고 log_b(a) = 0이므로 Case 1에 해당한다.  따라서 거듭 제곱 알고리즘의 시간 복잡도는 다음과 같다.
* [[합병 정렬]]
* [[반복 치환법]]


<math> T(n) = O(\log n) </math>
== 참고 문헌 ==
==마스터 정리의 적용 조건==
* Cormen, Thomas H., et al. "Introduction to Algorithms." MIT Press, 2009.
마스터 정리는 모든 재귀 관계식에 적용될 수 있는 것은 아니다. 다음과 같은 조건이 만족되어야 한다.
* Knuth, Donald. "The Art of Computer Programming, Volume 3: Sorting and Searching." Addison-Wesley, 1998.
*점화식이 <math> T(n) = aT(n/b) + f(n) </math> 형태를 가져야 한다.
[[Category:수학]]
*a ≥ 1, b > 1인 양의 정수여야 한다.
*f(n)이 다항 함수(Polynomial Function) 형태여야 한다.
이 조건을 만족하지 않는 경우, 반복적 점화 관계 풀이(Recursion Tree Method) 또는 점근적 주요 항 분석(Asymptotic Analysis) 등의 다른 방법을 사용해야 한다.
==같이 보기==
*[[분할 정복 알고리즘]]
*[[시간 복잡도]]
*[[재귀 관계식]]
*[[로그 시간 알고리즘]]
==참고 문헌==
*Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). ''Introduction to Algorithms''. MIT Press.
*Knuth, D. E. (1997). ''The Art of Computer Programming''. Addison-Wesley.

2025년 5월 12일 (월) 10:59 기준 최신판

마스터 정리(Master Theorem)는 분할 정복법(Divide and Conquer)을 사용한 알고리즘의 시간 복잡도를 계산하는 데 유용한 수학적 도구이다. 이 정리는 재귀적 알고리즘의 시간 복잡도를 분석하는 데 사용되며, 특히 재귀식이 다음과 같은 형태로 주어졌을 때 적용할 수 있다.

정의[편집 | 원본 편집]

마스터 정리는 다음과 같은 형태의 재귀식을 분석하는 데 사용된다:

T(n) = aT(n / b) + f(n)

여기서,

  • T(n): 문제 크기가 n일 때의 전체 시간 복잡도
  • a: 문제를 분할하는 횟수 (즉, 자식 문제의 수)
  • b: 각 자식 문제의 크기 비율 (b > 1)
  • f(n): 분할된 문제의 결과를 합치거나 추가적으로 수행하는 작업의 복잡도

마스터 정리는 f(n)의 성장 속도와 nlogba의 상대적인 크기에 따라 세 가지 경우로 나뉜다.

마스터 정리의 세 가지 경우[편집 | 원본 편집]

경우 1 (분할이 지배적인 경우)[편집 | 원본 편집]

  • f(n) = O(nc) 이고 c < logba 인 경우
    • 전체 시간 복잡도: T(n) = Θ(nlogba)
    • 이 경우는 f(n)이 nlogba보다 느리게 증가하므로, 전체 작업의 대부분은 재귀적으로 분할된 부분 문제에서 발생한다.

경우 2 (균형적인 경우)[편집 | 원본 편집]

  • f(n) = Θ(nlogba) 인 경우
  • 전체 시간 복잡도: T(n) = Θ(nlogba log n)
  • 이 경우는 분할과 추가 작업 비용이 같은 수준이므로, 로그 항이 하나 추가된다.

경우 3 (추가 작업이 지배적인 경우)[편집 | 원본 편집]

  • f(n) = Ω(nc) 이고 c > logba 인 경우
  • 그리고 다음 정규성 조건이 만족되어야 한다
    • a·f(n/b) ≤ c·f(n) (어떤 상수 c < 1에 대해, 충분히 큰 n에서 항상 성립)
  • 전체 시간 복잡도: T(n) = Θ(f(n))
  • 이 경우는 f(n)이 nlogba보다 빠르게 증가하고, 정규성 조건까지 만족할 경우 전체 작업량은 f(n)이 지배하게 된다.

예제[편집 | 원본 편집]

예제 1[편집 | 원본 편집]

T(n) = 10T(n / 10) + log10n
  • a = 10, b = 10 → nlog1010 = n1
  • f(n) = log10n = o(n1−ε) → 경우 1
  • 정답: Θ(n)

예제 2[편집 | 원본 편집]

T(n) = 100T(n / 10) + n10
  • a = 100, b = 10 → nlog10100 = n2
  • f(n) = n10 = ω(n2 + ε), 정규성 조건 만족 → 경우 3
  • 정답: Θ(n10)

예제 3[편집 | 원본 편집]

T(n) = 10T(n / 100) + (log n)log log n
  • a = 10, b = 100 → nlog10010 = n0.5
  • f(n) = (log n)log log n = o(nε) for all ε > 0
  • f(n) = o(n0.5) → 경우 1
  • 정답: Θ(n0.5)

예제 4[편집 | 원본 편집]

T(n) = 16T(n / 4) + 4log n = 16T(n / 4) + n2*a = 16, b = 4 → nlog416 = n2
  • f(n) = n2 = Θ(n2) → 경우 2
  • 정답: Θ(n2 log n)

예제 5[편집 | 원본 편집]

T(n) = 3T(n / 8) + 1
  • a = 3, b = 8, f(n) = 1 = Θ(1)
  • nlog83 ≈ n0.528
  • f(n) = O(nlog83 − ε) → 경우 1
  • 정답: Θ(nlog83)

예제 6[편집 | 원본 편집]

T(n) = 3T(n / 8) + √n · log n
  • a = 3, b = 8, f(n) = n0.5 log n
  • nlog83 ≈ n0.528
  • f(n) = o(nlog83) → 경우 1
  • 정답: Θ(nlog83)

예제 7[편집 | 원본 편집]

T(n) = 18T(n / 3) + n3*a = 18, b = 3 → nlog318 ≈ n2.63
  • f(n) = ω(n2.63), 정규성 조건 만족 → 경우 3
  • 정답: Θ(n3)

예제 8[편집 | 원본 편집]

T(n) = 27T(n / 3) + n3
  • a = 27, b = 3 → nlog327 = n3
  • f(n) = Θ(n3) → 경우 2
  • 정답: Θ(n3 log n)

예제 9[편집 | 원본 편집]

T(n) = 18T(n / 3) + n2 · log n
  • a = 18, b = 3 → nlog318 ≈ n2.63
  • f(n) = o(n2.63) → 경우 1
  • 정답: Θ(nlog318)

예제 10[편집 | 원본 편집]

T₁(n) = 8T₁(n / 4) + n1.5
  • a = 8, b = 4 → nlog48 = n1.5
  • f(n) = Θ(n1.5) → 경우 2
  • 정답: Θ(n1.5 log n)

예제 11[편집 | 원본 편집]

T₂(n) = 6T₂(n / 3) + n2
  • a = 6, b = 3 → nlog36 ≈ n1.63
  • f(n) = ω(n1.63), 정규성 조건 만족 → 경우 3
  • 정답: Θ(n2)

예제 12[편집 | 원본 편집]

T(n) = 3T(n / 25) + log3n
  • a = 3, b = 25 → nlog253 ≈ n0.396
  • f(n) = log3n = o(n0.396) → 경우 1
  • 정답: Θ(nlog253)

예제 13[편집 | 원본 편집]

T(n) = 8T(n / 2) + n3 log3n
  • a = 8, b = 2 → nlog28 = n3
  • f(n) = n3 log3n = ω(n3), 정규성 조건 만족 → 경우 3
  • 정답: Θ(n3 log3n)

예제 14[편집 | 원본 편집]

T(n) = 25T(n / 3) + (n / log n)3
  • a = 25, b = 3 → nlogb a = nlog3 25 ≈ n2.929
  • f(n) = (n/log n)3 = Ω(n2.929 + ε) → 경우 3
  • 정답: Θ((n/log n)3)

예제 15[편집 | 원본 편집]

T(n) = 4T(n / 15) + √n*a = 4, b = 15 → nlog154 ≈ n0.504
  • f(n) = √n = n0.5 = o(n0.504) → 경우 1
  • 정답: Θ(nlog154)

예제 16[편집 | 원본 편집]

T(n) = 15T(n / 4) + (n / log n)2
  • a = 15, b = 4 → nlog415 ≈ n1.953
  • f(n) = (n / log n)2 = ω(n1.953), 정규성 조건 만족 → 경우 3
  • 정답: Θ((n / log n)2)

응용[편집 | 원본 편집]

마스터 정리는 다양한 알고리즘의 시간 복잡도를 분석하는 데 활용된다. 대표적인 예시는 다음과 같다.

  • 합병 정렬(Merge Sort)
    • 재귀식: T(n) = 2T(n / 2) + O(n)
    • 시간 복잡도: O(n log n)
  • 퀵 정렬(Quick Sort)
    • 평균 시간 복잡도: O(n log n)
    • 최악 시간 복잡도: O(n2) (분할이 불균형할 때)
  • 행렬 곱셈(Matrix Multiplication)
    • Strassen 알고리즘의 경우: T(n) = 7T(n / 2) + O(n^2)
    • 시간 복잡도: O(n^log₇(7)) ≈ O(n2.81)

같이 보기[편집 | 원본 편집]

참고 문헌[편집 | 원본 편집]

  • Cormen, Thomas H., et al. "Introduction to Algorithms." MIT Press, 2009.
  • Knuth, Donald. "The Art of Computer Programming, Volume 3: Sorting and Searching." Addison-Wesley, 1998.