b-tree는 다음의 3가지 키워드를 가진다.
균형잡힌
, 다진트리
, 외장검색트리
균형잡힌
이진 탐색트리의 경우 균형이 한쪽으로 쏠리는 경우 최악의 탐색복잡도인 O(logN)을 가지게 된다. b-tree는 왼쪽 서브트리와 오른쪽 서브트리의 균형을 유지하도록 하여 적정 깊이를 유지한다.
다진트리
이진트리와 다르게 b-tree는 하나의 노드에 여러 key를 담을 수 있다. 이러한 구조는 적은 depth를 가질 수 있도록 하며, 참조포인터를 거치는 횟수를 줄여준다. 최종적으로 디스크 접근 횟수를 줄이게 된다.
아래 그림에서 k진 분류시 depth는 이다.
depth는 곧 검색 복잡도이므로, k진 분류의 검색 복잡도도 이다.
그런데, b-tree의 최소분지수, 즉 최소 자식수는 (k-1)/2+1 이다.
따라서 최악의 검색복잡도는 즉 복잡도를 가지게 된다.
삽입 위치를 찾는데에 O(logN), 삽입시 오버플로우 발생시 최악의 경우 재분배가 루트노드까지 이뤄질 수 있기 때문에 O(logN) 대략 2*O(logN)는 O(logN)로 판단
삭제 위치를 찾는데에 O(logN), 삭제시 언더플로우 발생시 최악의 경우 재분배가 루트노드까지 이뤄질 수 있기 때문에 O(logN) 대략 2*O(logN)는 O(logN)로 판단
루트노드에서부터 아래로 찾으려는 key를 찾는다.
- 루트노드의 key를 순서대로 탐색
- 맞는 위치의 자식노드로 내려가기
- key를 순서대로 탐색
- 자식노드로 내려가기
3, 4를 재귀적으로 반복하며 검색
삽입해도 최대 key개수를 넘지않아 그냥 위치만 잘 찾아 삽입하면 된다.
삽입하면 최대 key개수를 넘어 분할이 필요한 경우
재분배
*재분배
란 key값을 바로 옆 노드로 보낼 수 없으니까 옮길 노드를 부모노드로 올리고 부모노드를 sibling node로 보내는 것
위 과정을 재귀적으로 반복한다.
아래 예시는 13을 삽입하는 것이다.
13을 sibling node로 넘기기 위해 재분배 과정을 거치고 있다.
아래 예시는 중앙값을 부모노드로 올리는 예시이다.
두 가지 케이스가 있다. 세부 케이스는 아래에서 다루겠다.
12를 그냥 삭제하면 된다.
sibling노드 위로 올리고 부모노드 삭제한 자리로 이동하는 재분배
과정을 실행한다.
부모노드 아래로 내리기
2개의 예시를 통해 살펴보자
위 예시는 predecessor를 삭제한 자리에 대체하고
predecessor가 있던 자리에 predecessor의 부모노드를 내려오게 하는 과정이다.
위 예시는 predecessor로 대체 후,
predecessor를 삭제하는 과정이다.
다른 예시
17 삭제