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

IT 위키
편집 요약 없음
편집 요약 없음
1번째 줄: 1번째 줄:
'''마스터 정리'''(Master Theorem)는 분할 정복법(Divide and Conquer)을 사용한 알고리즘의 시간 복잡도를 계산하는 데 유용한 수학적 도구이다. 이 정리는 재귀적 알고리즘의 시간 복잡도를 분석하는 데 사용되며, 특히 재귀식이 다음과 같은 형태로 주어졌을 때 적용할 수 있다.
'''마스터 정리'''(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>


* T(n) = aT(n / b) + O(n<sup>d</sup>)
* 이 경우는 분할과 추가 작업 비용이 같은 수준이므로, 로그 항이 하나 추가된다.
 
여기서:
* T(n)은 문제 크기가 n일 때의 시간 복잡도.
* a는 문제를 분할하는 횟수 (즉, 자식 문제의 수).
* b는 각 자식 문제의 크기 비율.
* d는 각 분할된 문제에 대해 수행하는 작업의 복잡도.
 
마스터 정리는 이 재귀식의 해결 방법을 세 가지 경우로 나눈다.
 
== 마스터 정리의 세 가지 경우 ==
마스터 정리의 핵심은 주어진 문제의 재귀식을 분석하여, 아래의 세 가지 경우에 맞는 결과를 도출하는 것이다.
 
=== 경우 1 (a > b<sup>d</sup>) ===
* 만약 a > b<sup>d</sup>이면, 전체 시간 복잡도는 T(n) = O(n<sup>log(b)a</sup>)이다.
* 즉, 재귀 문제의 분할이 더 큰 비율로 발생하며, 이때의 시간 복잡도는 자식 문제의 크기가 감소하는 것보다 주어진 작업에서의 시간 복잡도가 더 중요하다.
 
=== 경우 2 (a = b<sup>d</sup>) ===
* 만약 a = b<sup>d</sup>이면, 전체 시간 복잡도는 T(n) = O(n<sup>d log n</sup>)이다.
* 이 경우는 자식 문제의 크기 감소와 주어진 작업에서의 복잡도가 동일하게 영향을 미친다. 이때의 복잡도는 log n을 추가하여 계산된다.
 
=== 경우 3 (a < b<sup>d</sup>) ===
* 만약 a < b<sup>d</sup>이면, 전체 시간 복잡도는 T(n) = O(n<sup>d</sup>)이다.
* 이 경우는 자식 문제의 크기 감소가 주어진 작업에서의 복잡도보다 더 중요하므로, 문제를 더 작은 크기로 분할하는 것이 중요하다.
 
== 예제 ==
다음은 마스터 정리를 적용한 몇 가지 예제이다.
 
=== 예제 1 ===
T(n) = 2T(n / 2) + O(n)
 
여기서 a = 2, b = 2, d = 1 이다. 따라서 a = b<sup>d</sup>이므로, 경우 2가 적용되고 시간 복잡도는:
 
* T(n) = O(n log n)
 
=== 예제 2 ===
T(n) = 3T(n / 4) + O(n)
 
여기서 a = 3, b = 4, d = 1 이다. a < b<sup>d</sup>이므로, 경우 3이 적용되고 시간 복잡도는:
 
* T(n) = O(n)


=== 예제 3 ===
=== 경우 3 (추가 작업이 지배적인 경우)===*'''<big>f(n) = Ω(n<sup>c</sup>) 이고 c > log<sub>b</sub>a 인 경우</big>'''
T(n) = 4T(n / 2) + O(n<sup>2</sup>)
* 그리고 다음 정규성 조건이 만족되어야 한다
** <big>a·f(n/b) ≤ c·f(n)</big> (어떤 상수 c < 1에 대해, 충분히 큰 n에서 항상 성립)


여기서 a = 4, b = 2, d = 2 이다. a = b<sup>d</sup>이므로, 경우 2가 적용되고 시간 복잡도는:
*전체 시간 복잡도: <big>T(n) = Θ(f(n))</big>


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


==예제==
===예제 1===
T(n) = 10T(n / 10) + log<sup>10</sup>n
*a = 10, b = 10 → n<sup>log<sub>10</sub>10</sup> = n<sup>1</sup>
*f(n) = log<sup>10</sup>n = o(n<sup>1−ε</sup>) → 경우 1
*정답: Θ(n)
=== 예제 2===
T(n) = 100T(n / 10) + n<sup>10</sup>
* a = 100, b = 10 → n<sup>log<sub>10</sub>100</sup> = n<sup>2</sup>
* 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>)
== 응용 ==
== 응용 ==
마스터 정리는 다양한 알고리즘의 시간 복잡도를 분석하는 데 활용된다. 대표적인 예시는 다음과 같다.
마스터 정리는 다양한 알고리즘의 시간 복잡도를 분석하는 데 활용된다. 대표적인 예시는 다음과 같다.

2025년 5월 12일 (월) 10:58 판

마스터 정리(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.