최장 높이 경로에서 각각의 서브 루트에 매달린 완전 이진 트리의 높이에 유의하라. 해당 서브 루트부터 리브까지의 블랙 노드 개수는 모두 같아야 하기 때문에 위의 높이를 보인다.
높이가 하나 증가할 때마다 포화 이진트리가 하나와 루트 노드 하나가 증가되니 높이에 따른 최소 노드 개수는 다음과 같이 구할 수 있다.
\[N(h) = N(h-1) + 2^{((h-1)/2)}\]파이썬으로 구현한 Red-Black 트리의 높이에 따른 최소 노드 개수를 출력하는 코드
각 높이에 따른 최소 노드 개수를 비교해보았다.
높이 | AVL Tree | Red-Black Tree |
---|---|---|
1 | 1 | 1 |
2 | 2 | 2 |
3 | 4 | 4 |
4 | 7 | 6 |
5 | 12 | 10 |
6 | 20 | 14 |
7 | 33 | 22 |
8 | 54 | 30 |
9 | 88 | 46 |
10 | 143 | 62 |
입력이 편향되었을 때, AVL트리가 같은 높이에서 레드블랙 트리보다 더 많은 노드를 담을 수 있다. 즉, 같은 노드를 더 작은 높이에서 담을 수 있다는 뜻이며 이는 AVL트리가 더 짧은 탐색시간을 가진다는 것이다. 같은 개수의 노드가 존재할 때 AVL트리에서의 탐색이 더 빠를 것이다.
하지만 실제로 구현하여 운영해보면 알겠지만 AVL트리는 레드블랙 트리보다 많은 노드 재배치를 실행한다. 레드블랙 트리는 레드 노드가 연속해서 존재할 경우에만 노드 재배치를 실행하며 레드 노드의 네 가지 중복 경우 중 두 가지는 더 이상 루트를 향해 올라가지 않아도 된다. 반대로 AVL 트리는 단 2의 높이 차도 허락하지 않으며 비교적 빈번한 현재 노드 재배치와 부모로 올라가는 재배치를 요구한다. 이는 AVL트리가 레드블랙 트리보다 삽입과 삭제에 더 많은 시간을 소모하게 만든다.
조금 쓸데없이 깊이 들어간 감이 없지않아 있지만, 간단하게 다음과 같이 결론 내릴 수 있다.
그렇다면 어떤 트리를 언제 쓰는 것이 더 유리할까?
교과서적으로 접근하면 답은 간단하다. 삽입, 삭제가 적지만 탐색이 많을 경우 AVL트리를, 반대의 경우 레드블랙 트리를 선택하면 된다. 하지만 궁금하다. 그 차이가 어느 정도일까?
높이 40에서 두 트리가 가장 불균형할 때 존재하는 모든 노드의 개수를 구하여 보았다. 재귀적으로 구현한 함수라 시간이 좀 걸렸지만 결과는 다음과 같다.
\[AVL_N(40) = 267914295\] \[REDBLACK_N(40) = 2097150\]가장 불균형한 경우이기 때문에 두 트리의 노드 수가 극단적으로 차이나는 것을 볼 수 있다. 높이 40의 불균형한 레드블랙 트리의 노드 개수는 높이 30의 불균형한 AVL트리의 노드 개수와 거의 동일했다(2178308).
만약 아주 많은 데이터를 아주 많이 탐색해야 하는 경우, 그리고 대부분의 데이터가 미리 저장되고 그 이후에 탐색을 하는 경우 AVL트리는 레드블랙 트리에 비해 훨씬 더 좋은 성능을 보장할 것이다. 데이터의 삽입과 삭제가 최소화되면 될 수록 사용자가 경험하는 분할상환시간이 적어질 것이다.
반대로 데이터가 언제 들어올지 예측 불가능하고 그 수가 그렇게 극단적으로 많지 않은 경우 레드블랙 트리가 더 유리할 것이다. 만약 어떤 학원에서 원생들의 정보를 트리에 저장하려고 한다고 상상해보자. 입소문이 나거나 광고를 하기 전까지 원생은 크게 늘어나지 않을 가능성이 높다. 반대로 학생들이나 엄마들 사이에 소문이 돌거나 대대적인 광고를 한 이후에는 원생들이 갑자기 많이 들어올지 모른다. 즉, 언제 얼마나 데이터가 입력될지 알 수 없다. 하지만 한 가지는 확실하다. 2억 명이 학원에 등록하려고 오지는 않을 것이라는 사실이다. 학원의 크기에 따라 다르겠지만 정말 많아봐야 몇 백명, 전국구에 있는 학원이라봐야 몇 천명 일 것이다. 게다가 학생들의 정보를 자주 열람할 이유도 없다. 오히려 학생들이 등록하고 해지하는 과정에서 정보의 삽입과 삭제가 더 빈번히 일어날 것이다. 이런 경우 많은 연산이 필요한 AVL트리를 사용할 이유가 없다.
내가 봤던 책에서는 위에서 두 트리를 비교하며 언급했던 간단한 결론만 내리고는 했다. 하지만 구체적으로 데이터가 얼마나 많아야 AVL트리를 선택할 만큼 시간적 복잡도를 차이나게 하는지, 어느 정도의 데이터가 탐색시간의 차이를 감수하고라도 레드블랙 트리를 선택하게 하는지 알 수 없었다.
기말고사가 끝난 이번 기회에 두 트리에 대한 더 깊은 이해를 할 수 있었다. 다음에는 B-트리나 B+트리도 한 번 다루어보고 싶다.