•B-트리는 다진검색트리가 균형을 유지하도록 하여 최악의 경우 디스크 접근 횟수를 줄인 것이다
B-tree는 균형잡힌 다진검색트리로 다음 성질을 만족한다.
- 루트는 1~k개의 키를 갖는다
- 루트를 제외한 모든 노드는 floor(k/2) ~ k개의 키를 갖는다.
- 모든 리프 노드는 같은 깊이를 갖는다.
- 키가 하나도 없는 트리로 B-tree이다.
B-tree 노드 삽입 알고리즘
# t : 트리의 루트 노드
# x : 삽입하고자 하는 키
BTreeInsert(t, x) {
x를 삽입할 리프 노드 r을 찾는다;
x를 r에 삽입한다;
if (r에 오버플로우 발생) then clearOverflow(r);
}
clearOverflow(r)
{
if (r의 형제 노드 중 여유가 있는 노드가 있음) then {r의 남는 키를 넘긴다};
else {
r을 둘로 분할하고 가운데 키(ceil(k/2)+1)를 부모 노드로 넘긴다;
if (부모 노드 p에 오버플로우 발생) then clearOverflow(p);
}
}
# t : 트리의 루트 노드
# x : 삭제하고자 하는 키
# v : x를 갖고 있는 노드
BTreeDelete(t, x, v)
{
if (v가 리프 노드 아님) then {
x의 직후원소 y를 가진 리프 노드를 찾는다;
x와 y를 맞바꾼다;
}
리프 노드에서 x를 제거하고 이 리프 노드를 r이라 한다;
if (r에서 언더플로우 발생) then clearUnderflow(r);
}
clearUnderflow(r)
{
if ( r의 형제 노드 중 키를 하나 내놓을 수 있는 여분을 가진 노드가 있음)
then { r이 키를 넘겨받는다;}
else {
r의 형제 노드와 r을 합병한다;
if (부모 노드 p에 언더플로우 발생) then clearUnderflow(p);
}
}
[예제] 다음 B-tree (k=3) 에서 다음 키들을 차례로 삭제 하는 과정을 적으시오. 6, 19, 4, 10, 16, 25