인공지능 오목 프로그램을 개발하다가 어떤 알고리즘 글을 읽게 되었다.
읽다보니
이 알고리즘에 사용된 map은 내부적으로 레드 블랙 트리로 구현되었기 때문에 삽입,삭제,검색의 시간복잡도가 모두 O(log N)이다.
라는 글을 읽게 되었다. 군대가기전에 들었던 자료구조 수업에서 이진탐색트리를 배운적이 있다. 이진탐색트리는 삽입,삭제,검색의 시간 복잡도가 O(log N)인 자료구조다. 레드 블랙 트리가 대체 뭐길래 내가 열심히 배운 이진탐색트리를 대체하여 사용되는 것인지 공부해보았다.
레드 블랙트리는 기존 이진탐색트리의 단점인 최악의 경우 삽입,삭제,검색의 시간 복잡도가 O(log N) 이 아닌 O(N)이 되는 문제를 개선한 자가 균형 이진 트리(self balancing binary tree)이다.
레드블랙트리는 이진탐색트리와 비교했을때 각각의 노드가 black,red색상값을 가진다.
그리고 다음과 같은 룰을 항상 만족시켜야 한다.
- 노드는 레드 혹은 블랙 중의 하나이다.
- 루트 노드는 블랙이다.
- 모든 리프 노드들(NIL)은 블랙이다.
- 레드 노드의 자식노드 양쪽은 언제나 모두 블랙이다. (즉, 레드 노드는 연달아 나타날 수 없 으며, 블랙 노드만이 레드 노드의 부모 노드가 될 수 있다)
- 어떤 노드로부터 시작되어 그에 속한 하위 리프 노드에 도달하는 모든 경로에는 리프 노드를 제외하면 모두 같은 개수의 블랙 노드가 있다.
레드블랙트리는 기존 이진탐색트리의 검색방법과 동일한 방법을 사용한다. 왼쪽 자식노드가 부모노드의 key값보다 작고 오른쪽 자식노드가 부모노드의 key값보다 크다는 이진탐색트리의 기본 조건을 만족하기 때문이다.
레드블랙트리에 노드를 삽입하기 위해서는 기존 이진탐색트리에 노드를 삽입하는 과정에 +추가과정이 필요하다. 바로 노드를 추가하고 해당 노드의 색상속성을 레드로 설정후 레드블랙트리의 특성 5가지에 위배되지 않도록 트리를 조정하는 것이다.
다음은 20->30->40->50->60->70순으로 노드를 삽입하는 과정이다.
이 자료는 이진탐색트리에 20->30->40->50->60->70을 차례로 삽입한 시뮬레이션 자료이다. 레드블랙트리에 비해 트리의 좌우가 불균형한 모습을 확인할 수 있다.
레드 블랙트리는 이진탐색트리와 같이 삽입 시간복잡도가 O(log N)이다. 하지만 차이점은 이진탐색트리는 최악의 경우 시간복잡도가 O(N)이 될수 있다. 하지만 레드블랙 트리는 루트 노드부터 가장 먼 잎노드 경로까지의 거리가, 가장 가까운 잎노드 경로까지의 거리의 두 배 보다 항상 작다. 이런 특성에 의해 트리의 좌우가 비교적 균형을 이루게 되어 최악의 경우에도 시간복잡도 O(logN)이 보장이 된다. 이런 장점이 있기에 이진탐색트리를 대체하여 많이 사용된다.
(요약: 이진 탐색 트리의 삭제과정을 밟고 레드블랙트리의 특성에 위배되지 않도록 트리모양을 조정해준다.시간 복잡도는 O(logN))
경우의 수가 너무 많으니 다음에 생각날때 정리하기로 한다.