You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**삼분 탐색(Ternary search)** 은 **이분법**이 매 반복마다 답의 후보 구간을 절반으로 잘라 각 위치에서 함수의 값을 계산하는 것과 비슷하게, **답의 후보 구간을 삼등분하는 두 위치에서 함수의 값을 계산하는 탐색 방식이다.**
22
-
- 삼분 탐색은 **볼록 함수(Convex function) 또는 오목 함수(Concave function)** 에서 **극값, 또는 최대/최소 값**을 찾을 때 유용하게 사용되는 기법이다.
23
-
- 삼분 탐색은 한 번 반복할 때마다 **후보 구간의 크기를 2/3**로 줄여나간다.
24
-
- 그래프를 갖는 함수의 최대점을 찾는 문제는 여러 가지 방법으로 풀 수 있다. 함수를 **직접 미분**하거나, **국소 탐색 알고리즘** 등으로 해결할 수 있다. 그러나 **삼분 탐색은 미분할 수 없는 함수에도 사용할 수 있으며, 국소 탐색에 비해 훨씬 빠르게 동작하고 수렴 판정이 용이**하기 때문에 더 자주 사용된다.
25
-
> **국소 탐색(Local search)** 은 임의의 답을 하나 만들어 놓고 이 값을 조금씩 갱신하면서 답이 더 좋아지는 쪽으로 움직이는 알고리즘이다.
`삼분 탐색(Ternary Search)` 알고리즘은 탐색 구간을 절반으로 나누는 이분 탐색과 유사하게, 탐색 구간을 두 부분이 아닌 <b>세 부분</b>으로 나누는 탐색 방식입니다. 주로 `볼록 함수(Convex function)` 또는 `오목 함수(Concave function)`에서 <b>극값 또는 최대/최소값</b>을 찾을 때 자주 사용됩니다.
<b>단봉 함수(Unimodal function)</b>: 어떤 점까지 증가하다고 그 이후로 감소하거나, 반대로 감소하다가 증가하는 형태의 함수</p></blockquote>
42
+
43
+
-`3등분`
44
+
45
+
이분 탐색이 탐색 구간을 절반으로 나누고 하나의 중간점을 사용한다면, 삼분 탐색은 탐색 구간을 3등분하고 두 개의 중간점을 사용합니다.
46
+
47
+
-`정수와 실수`
48
+
49
+
정수 뿐만 아니라 실수 구간에서도 삼분 탐색 알고리즘을 사용할 수 있습니다. 특히 실수 구간에서는 `오차 허용값(ε)`을 기준으로 반복합니다.
50
+
51
+
-`시간 복잡도(Time Complexity)`
52
+
53
+
탐색 구간을 3등분하여 매번 구간 길이를 2/3로 줄이므로 `O(log₃N)`의 시간 복잡도를 갖습니다.
54
+
55
+
### 활용
56
+
57
+
삼분 탐색 알고리즘은 다음과 같은 분야에서 활용됩니다.
58
+
59
+
-`극값 찾기`
60
+
61
+
볼록 함수 또는 오목 함수에서 극값을 찾는데 활용됩니다.
62
+
63
+
-`최대/최소값 찾기`
64
+
65
+
2차 함수, 3차 함수의 최대/최소값을 찾는데 활용됩니다.
66
+
67
+
### 구현
68
+
69
+
삼분 탐색 알고리즘을 구현하기 위해선 먼저 탐색 구간을 파악해야 합니다. 탐색 구간이 [lo, hi]일 때, 탐색 구간을 3등분하기 위해 설정하는 두 개의 중간점의 위치는 각각 `(2 * lo + hi) / 3`, `(lo * 2 + hi) / 3`입니다.
70
+
71
+
예를 들어 `y = -0.5x² + 2x + 12`라는 2차 함수에서 탐색 구간이 [-3, 6]일 때의 최댓값을 찾는 문제가 있을 경우, 탐색 구간을 3등분하기 위해 설정하는 두 개의 중간점은 `x = (2 * (-3) + 6) / 3 = 0`, `x = (-3 + 2 * 6) / 3 = 3`입니다.
위의 사진을 보면 알 수 있듯이 `x = 0`인 지점보다 `x = 3`인 지점의 함수값이 더 큰 것을 알 수 있습니다. 이를 통해 최댓값은 왼쪽 1/3 구간 [-3, 0]에는 없다는 점을 알 수 있습니다. 만약 구간 [-3, 0]에 최댓값이 있다면 왼쪽 중간점의 함수값이 오른쪽 중간점의 함수값보다 커야하기 때문입니다. 따라서 왼쪽 1/3 구간을 배제하고 나머지 2/3 구간을 탐색하는 식으로 진행됩니다.
삼분 탐색을 실수 구간에서 사용할 때, 실수는 무한히 많은 값을 가지기 때문에 left와 right 사이를 완전히 좁혀서 한 점으로 만드는 것을 불가능합니다. 따라서 무한 루프를 방지하기 위해 보통 충분히 작아진 구간에서 멈출 수 있도록 <b>오차 허용값(ε)</b>을 사용합니다.</p></blockquote>
0 commit comments