Open bugoverdose opened 2 years ago
이진 탐색 트리 & 균형 이진 트리
삽입 순서에 따라 선형적인 트리로 구성될 수 있다는 문제점을 해결하기 위해 스스로 균형을 잡는 이진트리
Adelson-Velsky and Landis tree
파이썬 dictionary에서 사용.
balance factor: 특정 노드(x)의 좌우 서브트리의 높이 차이
BF(x) = h(lSubtree(x)) - h(rSubtree(x))
AVL 트리의 모든 노드의 balance factor는 {-1, 0, 1}을 값으로 지님.
탐색/삽입/삭제의 성능은 worst case, 평균 시간복잡도 모두 O(log n)
O(log n)
트리 일부를 왼쪽/오른쪽으로 회전(rotate)시킴으로써 높이차 재조정
최악의 경우에도 삽입/삭제/검색의 시간복잡도는 O(log N)이 된다!
O(log N)
O(n)
균형을 엄격하게 잡기 때문에 검색 성능은 RB 트리에 비해 미세하게 더 빠르다
노드의 black height
삭제 후 대체된 위치에 nil 노드가 오는 경우, extra black을 배정하여 doubly black으로 만들어 재조정 작업을 거치기 위함.
extra black
doubly black
노드 x에서 임의의 자손 nil 노드까지 내려가는 경로에서의 black의 개수
자손 nil 노드까지 내려가는 경로
삽입/삭제시, RB 트리 위배 여부를 확인하고, RB 트리의 속성을 위반한 경우, 재조정 과정 진행.
구체적으로는 4번 성질 & 5번 성질에 위배되는 구조를 해결하기 위해 개별 노드의 색상 및 전체적인 구조를 변경하는 과정에서 트리의 균형을 어느 정도 잡을 수 있음.
핵심: 새롭게 삽입되는 노드는 언제나 red
삽입 후 red가 연속되어 4번 성질에 위배되더라도 무조건 좌우 균형이 깨진 것은 아님.
색상 변경만이 아니라, AVL 트리처럼 문제가 생긴 부분을 순차적으로 회전시켜서 해결.
부분적/전체적으로 회전시키는 과정에서 트리의 전체적인 depth, level을 줄여나갈 수 있음.
삭제 전 RB 트리 조건 충족하는 상태에서, 일반적인 BST 방식으로 삭제 후, RB 트리 위배 여부를 확인하여 재조정 과정 거침.
핵심: 실질적으로 삭제되는 색이 무엇인가에 따라 RB 트리의 성질 위배 여부 확인 가능.
삭제되는 색이 red라면 RB 트리의 조건에 위배되지 않음. (사라진 자리에 후임자가 대체되든, 부모와 자식 모두 black이든) red는 여전히 연속되지 않으며, black height는 불변.
삭제되는 색이 black인 경우 RB 트리 조건에 위배될 수도 있음. 즉, 루트노드(black)가 삭제되었거나, 특정 서브트리의 black height가 변경되거나, red끼리 연속될 수 있음.
2번 성질 위배시 재조정: 루트 노드가 삭제된 경우, 새로운 루트노드의 색상만 black으로 수정해주기만 하면 됨.
5번 성질 위배시 재조정: 삭제된 색의 위치를 대체한 노드에 extra black을 부여하고, 이로 인해 생겨난 doubly black 혹은 red-and-black의 extra black를 제거하는 방식으로 해결
red-and-black
검색 성능은 AVL 트리에 비해 약간 느리다. 균형이 덜 잡히기 때문.
AVL 트리
이진 탐색 트리 & 균형 이진 트리
삽입 순서에 따라 선형적인 트리로 구성될 수 있다는 문제점을 해결하기 위해 스스로 균형을 잡는 이진트리
Adelson-Velsky and Landis tree
파이썬 dictionary에서 사용.
노드의 balance factor
balance factor: 특정 노드(x)의 좌우 서브트리의 높이 차이
BF(x) = h(lSubtree(x)) - h(rSubtree(x))
핵심 특징
AVL 트리의 모든 노드의 balance factor는 {-1, 0, 1}을 값으로 지님.
탐색/삽입/삭제의 성능은 worst case, 평균 시간복잡도 모두
O(log n)
AVL 트리의 균형 잡기
트리 일부를 왼쪽/오른쪽으로 회전(rotate)시킴으로써 높이차 재조정
장점
최악의 경우에도 삽입/삭제/검색의 시간복잡도는
O(log N)
이 된다!O(n)
이 되지 않음.균형을 엄격하게 잡기 때문에 검색 성능은 RB 트리에 비해 미세하게 더 빠르다
단점
레드 블랙 트리 (RB 트리)
구조
핵심 성질
노드의 black height
nil 노드
삭제 후 대체된 위치에 nil 노드가 오는 경우,
extra black
을 배정하여doubly black
으로 만들어 재조정 작업을 거치기 위함.노드의 black height
노드 x에서 임의의
자손 nil 노드까지 내려가는 경로
에서의 black의 개수균형 재조정 원리
삽입/삭제시, RB 트리 위배 여부를 확인하고, RB 트리의 속성을 위반한 경우, 재조정 과정 진행.
구체적으로는 4번 성질 & 5번 성질에 위배되는 구조를 해결하기 위해 개별 노드의 색상 및 전체적인 구조를 변경하는 과정에서 트리의 균형을 어느 정도 잡을 수 있음.
삽입 과정
핵심: 새롭게 삽입되는 노드는 언제나 red
삽입 후 재조정
삽입 후 red가 연속되어 4번 성질에 위배되더라도 무조건 좌우 균형이 깨진 것은 아님.
색상 변경만이 아니라, AVL 트리처럼 문제가 생긴 부분을 순차적으로 회전시켜서 해결.
부분적/전체적으로 회전시키는 과정에서 트리의 전체적인 depth, level을 줄여나갈 수 있음.
삭제 과정
삭제 전 RB 트리 조건 충족하는 상태에서, 일반적인 BST 방식으로 삭제 후, RB 트리 위배 여부를 확인하여 재조정 과정 거침.
삭제 후 RB 트리 성질 위반 여부 확인
핵심: 실질적으로 삭제되는 색이 무엇인가에 따라 RB 트리의 성질 위배 여부 확인 가능.
삭제되는 색이 red라면 RB 트리의 조건에 위배되지 않음. (사라진 자리에 후임자가 대체되든, 부모와 자식 모두 black이든) red는 여전히 연속되지 않으며, black height는 불변.
삭제되는 색이 black인 경우 RB 트리 조건에 위배될 수도 있음. 즉, 루트노드(black)가 삭제되었거나, 특정 서브트리의 black height가 변경되거나, red끼리 연속될 수 있음.
삭제 후 재조정
2번 성질 위배시 재조정: 루트 노드가 삭제된 경우, 새로운 루트노드의 색상만 black으로 수정해주기만 하면 됨.
5번 성질 위배시 재조정: 삭제된 색의 위치를 대체한 노드에 extra black을 부여하고, 이로 인해 생겨난
doubly black
혹은red-and-black
의 extra black를 제거하는 방식으로 해결red-and-black
: extra black이 부여된 red 노드.doubly black
: extra black이 부여된 black 노드시간복잡도
O(log n)
장점
단점
검색 성능은 AVL 트리에 비해 약간 느리다. 균형이 덜 잡히기 때문.