🏛️ Data Structure
B-Tree
정의
BST를 일반화한 tree
특징
- 자녀 노드의 최대 개수를 늘리기 위해 부모 노드에 key를 하나 이상 저장한다.
- 노드 내 key들을 오름차순으로 정렬한다.
- 정렬된 순서에 따라 자녀 노드들의 key값의 범위가 결정된다.
- internal 노드의 key 수가 x개면, 자녀 노드의 수는 항상 x + 1개
- → 몇 차 B tree인지와 관계없이 internal 노드는 최소 두개의 자녀를 가진다.
- 모든 leaf 노드들은 같은 레벨에 있다.
- balanced tree
시간복잡도
𝑂(log𝑛)
파라미터
M = 각 노드의 최대 자녀 노드 수(M차 B tree)
M - 1 = 각 노드의 최대 key 수
ceil(M / 2) = 각 노드의 최소 자녀 노드 수(root node, leaf node 제외)
ceil(M / 2) - 1 = 각 노드의 최소 key 수(root node 제외)
사용
삽입
- 삽입은 항상 leaf 노드에 한다.
- 노드가 넘치면 가운데 key를 기준으로 좌우 key들은 분할하고 가운데 key는 승진한다.
삭제
- 삭제는 항상 leaf 노드에 한다.
- internal 노드에 있는 데이터를 삭제하려면 leaf 노드에 있는 데이터와 위치를 바꾼 후 삭제
- predecessor(선임자)나 successor(후임자)와 위치를 바꾼다.
- 삭제 후 최소 key 수보다 적어졌다면 재조정한다.
- key 수가 여유있는 형제의 지원을 받는다.
- a가 불가능하면 부모의 지원을 받고 형제와 합친다.
- b 이후 부모에 문제가 있다면 다시 재조정 한다.
예시
DB Index
B-tree 계열을 사용하는 이유
- Second Storage 접근 횟수 감소
- 데이터를 찾을 때, 탐색 범위를 빠르게 좁힐 수 있다.(자녀 노드수를 설정할 수 있으므로)
- 운영체제에서 데이터를 가져올 때 block 단위로 가져오는데, B-tree 계열은 서로 같이 있으므로 한번에 같이 가져올 가능성 증가(block 단위에 대한 저장 공간 활용도가 더 좋다.)
- M(각 노드의 최대 자녀 노드 수)를 정하면, 다른 모든 파라미터들이 결정됨
Hash Index 안쓰는 이유
범위 기반 검색이나 정렬에 사용할 수 없음