HeadingBST의 깊이가 일반적으로 O(lg(n))인 이유
Introduction to Algorithms 라는 책이 사용한 증명 내용에 추가적인 설명들을 더한 내용입니다.
일단 먼저 수학적인 분석을 위해서 트리의 높이를 수학적으로 정의하겠습니다.
트리의 높이를 htree라고 정의했을 때,
h는 이렇게 정의할 수 있습니다.
htree=1+max(hleft−subtree,hright−subtree)
트리의 왼쪽 부분 트리와 오른쪽 부분 트리의 중 큰 높이에 1을 더한 값이죠.
이 부분은 직관적으로 이해할 수 있죠?
이 부분을 조금 다르게 표현해 보겠습니다.
총 n 개의 노드를 갖는 트리의 높이를 hn이라고 할게요
이진 트리에서는 root 노드 하나가 있고,
왼쪽에는 root 노드보다 작은 데이터들이,
그리고 오른쪽에는 root 노드보다 큰 데이터들이 저장됩니다.
root 노드에 저장된 데이터가 임의로 정해졌다고 가정하고
모든 노드에서 i번째로 큰 데이터라고 할게요
그럼 왼쪽 부분 트리에는 노드가 i−1개,
그리고 오른쪽 부분 트리에는 n−i가 있을텐데요.
위에 있는 수학식을 조금 바꿔서 이렇게 나타낼 수 있겠죠?
hn=1+max(hi−1,hn−i)
왼쪽 항 hi−1은 root 노드의 왼쪽 부분 트리의 높이,
그리고 오른쪽 항 hn−i 은 root 노드의 오른쪽 부분 트리의 높이를 나타냅니다.
다음은 증명을 위해서 두 항에 지수 함수를 취해줍니다.
Yn=2hn=21+max(hi−1,hn−i)
이 값을 편하게 Yn , 지수 높이(exponential height)라고 부를게요.
지수 함수에서 차수의 덧셈은 일반 항에서 곱셈으로 나타낼 수 있는데요.
가장 오른쪽 식을 조금 정리하면 이렇게 나타낼 수 있습니다.
Yn=2×max(2hi−1,2hn−i)=2×max(Yi−1,Yn−i)
Yn 을 또 다른, 더 작은 Y 를 사용해서 나타냈습니다.
이제 이 지수 높이 Yn 의 기댓값을 계산할게요.
기댓값은 대문자 알파벳 E를 써서 나타냅니다.
각 항을 E로 둘러싸고 기댓값을 구해볼게요.
E[Yn]=E[2×max(Yi−1,Yn−i)]
여기서 오른쪽 항의 기댓값을 계산하면 됩니다.
여기서 i 는 이진 트리 안에 있는 데이터 중
root 노드에 있는 노드가 i 번째로 큰 노드라는 뜻이잖아요?
i 를 임의로 골랐기 때문에
n 개의 노드에서 임의로 하나의 노드를 고를 확률은 n1 입니다.
그 다음에는 이렇게 식을 바꿔줄 수 있습니다.
E[Yn]=i=1∑nn1E[2×max(Yi−1,Yn−i)]=n2i=1∑nE[max(Yi−1,Yn−i)]
뭘 했는지 설명드릴게요.
기댓값을 구하기 위해서는 특정 일이 일어날 확률(i=n1) 곱하기
그 일이 일어났을 때의 높이의 기댓값의 합을 계산해야 합니다.
(E[2×max(Yi−1,Yn−i))
i 가 1 부터 n까지 돌면서 나올 수 있는 모든 값들을 더해줍니다.
그리고 기댓값 안에서 하는 상수 곱셈은 기댓값 밖으로 뺄 수 있기 때문에
중간 식에서 오른쪽 식으로 바꿔줄 수 있습니다.
다음에는 기댓값에서 max 를 지워주고 조금 더 계산하기 편한식으로 바꿔줄게요.
== 대신 부등호를 쓸 건데요.
E[Yn]=n2i=1∑nE[max(Yi−1,Yn−i)]≤n2i=1∑n(E[Yi−1]+E[Yn−i])
이렇게 표현할 수 있습니다.
이게 뭘 한 건지 예시를 통해 설명 드릴게요.
max(10,15)이 식은 10과 15중 둘 중 더 큰 값을 선택하겠다는 의미인데요.
두 값 중 큰 값을 선택한 것은 항상, 두 값을 더한 값보다 작을 수 밖에 없잖아요?
식으로 나타내면
max(10,15)≤10+15
이렇게 되는데요.
이 간단한 개념을 좀 더 어려운 수학식에 적용한 겁니다.
중간 식에서 어떻게 오른쪽 식으로 바꿨는지 보이시죠?
그냥 max(10,15)≤10+15이거랑 똑같은 걸 해준 겁니다.
n2i=1∑n(E[Yi−1]+E[Yn−i])
이 식에 대해서 생각해봅시다.
이 식은 i를 1부터 n까지 돌면서 모든 값을 더해주는 건데요.
괄호 안에 들어가는 내용을 살펴볼게요.
i=1일 때: E[Y0]+E[Yn−1]
i=2일 때: E[Y1]+E[Yn−2]
i=3일 때: E[Y2]+E[Yn−3]
⋮
$ i = n − 1$ 일 때: E[Yn−2]+E[Y1]
i=n 일 때: E[Yn−1]+E[Y0]
이렇게 표현할 수 있습니다.
정확히는 E[Y0]부터 E[Yn−1] 까지 더하는데
이게 왼쪽 항, 그리고 오른쪽 항 이렇게 두번 반복 되잖아요?
그렇기 때문에 이렇게 표현할 수 있습니다.
n2i=1∑n(E[Yi−1]+E[Yn−i])=n2i=0∑n−12E[Yi]=n4i=0∑n−1E[Yi]
그리고 이걸 원래 식에 대입하면 이렇게 되죠.
E[Yn]≤n4i=0∑n−1E[Yi]
여기까지 오는데도 좀 벅찬데요.
여기서 좀 뜬금 없이 들릴 수 있는 내용을 증명할게요.
이게 어떻게 저희 증명에 맞는지 이해가 안 되실 수 있는데요 일단 한 번 보세요.
바로 이 식을 증명할 건데요.
i=0∑n−1(3i+3)=(4n+3)
여기서 괄호는 조합(Combination)을 나타내는 식입니다.
C를 사용해서 나타낼 때도 있는데요.
위에 있는 경우의 수에서 아래 있는 숫자 만큼의 항목을 선택할 수 있는 경우의 수입니다.
그러니까
(24) 이건 4 개 중 순서에 상관없이 2개를 선택할 수 있는 경우의 수입니다.
계산은 2×14×3 이렇게 해서 6이 되죠.
오른쪽 식에 대해서 먼저 생각해볼게요.
오른쪽 식은 총 n+3개의 요소에서 순서에 상관 없이 4 개를 선택하는 경우의 수입니다.
이때, 선택한 4개의 요소 중 가장 큰 요소가
모든 요소 중 i+4번째로 가장 큰 요소라고 할게요.
총 요소가 n+3개가 있으니까
i 는 0에서 n−1까지가 될 수 있겠죠?
i=0 이면, 선택한 가장 큰 요소가 모든 요소 중 4 번째로 가장 크고,
i=n−1 이면, 선택한 요소가n+3 번째로 가장 큰 요소 (모든 요소중 가장 큰 요소)가 됩니다.
선택한 가장 큰 요소가 i+4 라는 건
나머지 요소들을 i+3개 중에서 세 개를 선택해야된다는 말입니다.
i 를 0부터 n−1까지 돌면서 i+3개의 요소들에서 세 개를 선택한 값을 더해주면
n+3 개의 요소 중에서 4개의 요소를 선택하는 경우의 수를 구할 수 있는 거죠.
이걸 수학식으로 나타낸 게
바로 ∑i=0n−1(3i+3)=(4n+3) 고요.
방금 증명한 식을 가지고 이번에는
n4∑i=0n−1E[Yi]≤41(4n+3)n4 를 귀납적으로 증명하겠습니다.
먼저 위 식이 n=0_n=1_일 때 성립한다는 것을 보여주겠습니다.
Y0=0=E[Y0]≤41(33)=41
Y1=1=E[Y1]≤41(34)=1두 경우 성립합니다
다음으로는 0에서 n−1까지 명제가 성립한다는 가정하에,
n 일 경우도 명제가 성립한다는 걸 보여주겠습니다.
E[Yn]≤n4∑i=0n−1E[Yi]
≤n4∑i=0n−141(4i+3) (귀납적으로 명제가 성립한다고 가정한다)
=n1∑i=0n−1(3i+3)( 41 를 밖으로 빼냄)
=n1(4n+3) (∑i=0n−1(3i+3)=(4n+3) 이기 때문에)
= n1×4!(n−1)!(n+3)!
= 41×3!n!(n+3)!
=41(3n+3) (n의 경우에도 명제가 성립한다는 걸 증명했습니다)
이제
E[Yn]에 대한 부등식을 구했는데요.
41(3n+3)보다 항상 작거나 같다는 결론이 나오죠?
Yn는 우리가 처음에 지수 높이 함수라고 불렀는데요.
2hn로 정의했었죠?
함수 2x는 아래로 볼록한 함수 (convex function)이기 때문에 옌센 부등식(Jensen’s inequality)을 적용할 수 있습니다.
그럼 E[Yn]에 대해서 다음과 같은 식을 세울 수 있죠.
2E[hn]≤E[2hn]=E[Yn]
이제 이걸 가지고:
2E[hn]≤E[Yn]≤41(3n+3)이렇게 할 수 있고,
오른쪽 식을 정리하면
2E[hn]≤41×6(n+3)(n+2)(n+1)=24n3+6n2+11n+6이 됩니다.
각 항에 로그 함수를 취하면 다시 이렇게 할 수 있습니다.
log22E[hn]=E[hn]≤log2(24n3+6n2+11n+6)
오른쪽 식 로그 안에 있는 항 중 차수가 가장 큰 항이 n3인데요.
이것의 로그를 취하면 3lg(n)이잖아요?
그렇기 때문에 n개의 노드를 갖는 이진 탐색 트리의
높이 hn의 기댓값 E[hn] 은 _O(lg(n))_이라고 할 수 있습니다.