틸다 근사 (Tilde approximations)
틸다 표기법
정의
∼f(N)∼f(N)는 임의의 함수 ff에 대하여 NN이 커질수록 ∼f(N)f(N)∼f(N)f(N)의 값이 11에 수렴하게 하는 함수를 말한다.
그리고 g(N)∼f(N)g(N)∼f(N)은 NN이 커질수록 g(N)f(N)g(N)f(N)의 값이 11에 수렴하는 경우를 말한다.1
알고리즘 [개정4판]. 1.4장. 181쪽. ↩
틸다 표기법의 특징은 다음과 같다.
- 수식에
~
를 사용하여 수식을 읽는 사람에게 틸다 근사가 적용되었음을 알린다. - 수식에서 영향력이 적은 낮은 자리수의 항을 제거하여 간단하게 만든다.
틸다 근사 f(N)∼g(N)f(N)∼g(N)의 정규적인 수학적 정의는
limN→∞f(N)g(N)=1limN→∞f(N)g(N)=1
- 틸다 근사는 점근 근사의 한 종류이다. big O 근사도 점근 근사에 해당한다.
틸다 근사의 예
틸다 근사를 쉽게 표현하자면 다음과 같다.
f(N)=g(N)+ 최고차항이 아닌 항들 f(N)=g(N)+ 최고차항이 아닌 항들함수 f(N)f(N) | 틸다 근사 g(N)g(N) | big O |
---|---|---|
5N6−3N2+N5N6−3N2+N | ∼5N6∼5N6 | O(N6)O(N6) |
N36−N22+N3N36−N22+N3 | ∼N36∼N36 | O(N3)O(N3) |
N22−N2N22−N2 | ∼N22∼N22 | O(N2)O(N2) |
lgN+1lgN+1 | ∼lgN∼lgN | O(lgN)O(lgN) |
33 | ∼3∼3 | O(1)O(1) |
N+1N+1 | ∼N∼N | O(N)O(N) |
예를 들어 3N2+5N3N2+5N 은 빅 오 표기법(Big O notation)으로는 O(N2)O(N2) 이지만, 틸다 표현법에서는 ∼3N2∼3N2 이다.
3
을 남겨두지 않으면 limN→∞3N2+5NN2limN→∞3N2+5NN2가 1
이 아니라 3
이 되기 때문이다.
big O 표기법에 대한 틸다 표기법의 장점
Q. (위 질문에 이어서) 점근적인 성능에 있어서 그 상한은 중요하지 않나?
중요하다. 하지만 구문의 실행 빈도 관점에서의 정확한 값이 반영된 비용모델을 더 선호한다. 왜냐하면 그것이 알고리즘의 성능에 대해 더 많은 정보를 주고, 이 책에서 다루는 알고리즘들은 정확한 실행 빈도를 구해낼 수 있는 수준이기 때문이다. 예를 들어 "ThreeSum은 ∼N3/2∼N3/2번의 배열 접근을 한다" 그리고 "ThreeSum에서
cnt++
가 수행되는 최악 조건 횟수는 ∼N3/6∼N3/6이다"라고 기술하면 다소 번거롭기는 하지만 "ThreeSum의 실행 시간은 O(N3)O(N3)이다"라고 하는 것보다 훨씬 더 풍부한 정보를 제공한다. 3알고리즘 [개정4판]. 1.4장. 206쪽. ↩
참고로 위의 인용에서 말하는 ThreeSum의 코드는 다음과 같다.
/**
* 합계가 0이 되는 트리플을 카운팅하여 리턴한다.
*
* @param numbers 입력 숫자 배열
* @return
*/
public static int count(int[] numbers) {
int N = numbers.length;
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
for (int k = j + 1; k < N; k++) {
// 이 if 구문은 정확히 N(N-1)(N-2)/6 회 실행된다.
if (numbers[i] + numbers[j] + numbers[k] == 0) {
cnt++;
}
}
}
}
return cnt;
}
함께 읽기
참고문헌
- 알고리즘 [개정4판] / 로버트 세지윅, 케빈 웨인 저/권오인 역 / 길벗 / 초판발행 2018년 12월 26일