*B-Tree를 이해하려면 Binary트리에 대해서도 알아야한다.
이진탐색트리 BST
B-Tree소개
BST에서 응용된 버전인 B-tree 특징과 배경
이걸 차원을 확장시켜서 생각해보면 아래와 같다.
결론
이걸 B트리라고 한다.
장점
그래서
b트리의 4개의 파라미터들
출처 : https://www.youtube.com/watch?v=bqkcoSm_rCs
btree
b트리의 데이터 삽입
예 : 3차 비 트리 데이터 삽입
1. 1추가 : 루트노드됨, 3차비트리이므로 최대 키 값은 2개이다.
2. 15추가 : 추가느느 항상 리프노드에다. 루트노트 키 값으로 15를 넣음
3. 2추가 : 추가는 항상 리프노트에 한다. 아직 루트논드노 리프이므로 추가, 키값은 정렬되어야한다. (1, 2, 15)
그러나 노드가 가질 수 있는 최대 키 값은 2개인데 3개이다... 노드가 넘쳤다... 분할한다.
왼(1, x) 오(15, x), 루트(2, x)로 분할한다. 이떄 (2, x)인 노드를 승진시켜서 루트노드로 만들어야 한다. (중간값이므로)
4. 5추가 : 리프노드에 넣어야 한다. 이때 비트리에서 리프노트를 탐색해야한다. 이때 탐색은 루트에서 시작한다. 2 < 5 이므로
오른쪽 자녀노드(15, x) 에 들어간다. 그리고 키는 오름차순정렬이 룰이므로 (5, 15)가 되어야 한다.
5. 30추가 : 위 단게와 똑같이 진행한다. (5, 15, 30)이 된다. 노드가 넘쳤다... 중간값을 기준으로 좌우 자녀노드로 분할한다.
먼저 30을 떼어내 (30, x)을 오른쪽에 둔다. 15를 부모노드로 승진시킨다.근데 부모노드에 키 값 자리가 있다. 거기로 넣는다. 5는 그대로 둔다.
6. 90추가 : 리프노드를 탐색한다. 루트(2, 15)에서 15보다 크다. 오른쪽 서브트리 탐색한다. (30, x)는 리프노드이므로 에 넣는다. (30, 90)으로 되고 오름차순정렬이므로 냅둔다.
7. 20추가 : 20과 2를 비교, 20과 15를 비교(루트가 (2, 15))했는데 큼 (30, 90)에 넣고 오름차순 정렬(20, 30, 90)...근데 노드가 넘친다... 가운데 값은 승진하고 나머지는 좌우로 분할한다. (20, x), (90, x)로 분할된다. 이때 가운데값은 30이 되어 부모노드로 승진시킨다.
근데 (2, 15)로 보냈더니 (2, 15, 30)이 되어버려..노드가 넘친다...또 중간값을 부모노드로 승격시키고 좌우자녀노드로 분할한다.
분할스텝은 먼저 우측 자녀부터이다. (2, 15, 30)에서 (30, x)으로 분할하여 자녀노드로 만들고
그다음 스템은 중간값 15를 부모노드로 승격시켜야하는데 이는 루트노드이므로 앞으로 루트노드가 될 새로운 노드를 생성한다. (15, x)가 새로운 루트노드가 되고 (2, x)는 냅둔다.
8. 7추가 : 15>7이므로 7는 좌측서브트리 탐색, 2 < 7이므로 우측서브트리로 (5, x)에 7을 넣는다.(5, 7)
9. 9추가 : 15 > 9이므로 9는 좌측서브트리 타맷ㄱ, 2 <9 이므로 우측서브트리로 (5, 7)에 9를 넣는다. (5, 7, 9)
근데 노드가 넘친다. 가운데를 부모로 하고 좌우로 분할한다.
우측부터 (9, x)하고 7은 가운데값이므로 부모로 승격한다. 부모노드(2, x)가 있으므로 여기에 넣는다. (2, 7)이되고 좌측 서브트리는 냅둔다.
10. 8추가 : 15 > 8이므로 좌측서브트리탐색한다. (2, 7)에서 2<8, 7<8이므로 우측 서브트리탐색한다. (9, x)가 있다. (9, x)에 8을 넣는다. 오름차순정렬하여 (8, 9)가 된다.
11. 10추가 : 15> 10이므로 좌측서브트리탐색, (2, 7)에서 2<10, 7<10이므로 우측 서브트리탐색한다. (8, 9)가 리프노트이므로 여기 넣는다. (8, 9, 10)이 되어.... 노드가 넘친다... 중간값을 승격하고 나머지는 좌우로 분할하낟.
이때 스텝대로 우측(10, x)로 우측 자녀노드를 생성한다.(8, 9) 9는 승격시켜야한다. 근대 (2, 7, 9)로 또 노드가 넘친다.
또 분할한다. (2, 7, 9) -> (2, 7)하고 (9, x)를 하위 자녀노드로 만든다. 그리고 (2, 7)에서 7을 승격시킨다. 근데 위 부모노드에 자리가 남는다. (15, 7)에 넣고 오름차순정렬(7, 15)가 된다.
결국 (2, x), (7, 15), (9, x)가 된다.
12. 50추가 : 탐색진행(7, 15)가 루트노드이므로 비교 <50이므로 우측서브트리탐색한다.
(30, x) 에서 30보다 크다. 우측 서브트리로 탐색한다. (90, x)이 리프노드이므로 넣고 오름차순으로 정렬한다.
(50, 90)이 된다.
13. 70추가 : 12번과 같다. (50, 90)가 리프노드인데 추가 (50, 70, 90)이 되어....넘친다. 분할
먼저 우측90을 분할(90, x)가 되고, 70을 승진하여 위 노드가 비어있으므로 (30, 70)된다.
14: 60추가 : (7, 15) <60이다. (30, 70)에서는 30<60<70이므로 중간에 있는 리프노트(50,x)에 넣고 오름차순정렬한다.
결국에 (50, 60)이 된댜.
결론
B-tree 데이터삭제
식제도 항상 리프노드에서 발생한다.
삭제후 최소 key수보다 적어졌다면 재조정한다.
1. key수가 여유있는 형제의 지원을 받는다.
2. 1번이 불가능하면 부모의 지원을 받고 형제와 합치낟.
3. 2번후 부모에 문제가 있다면 거기서 다시 재조정한다.
삭제 후 최소 키수보다 적다면?
1. key수가 여우있는 형제의 지원을 받는다.
1.1좌측 형제 노드에서 도움을먼저 받는다.
동생이 여유가 있으면
-> 동생의 가장 큰 key를 부모노드의 나와 동생 사이에 둔다
-> 원래 자리에 있던 key는 나의 가장 왼쪽에 둔다.
1.2 동생이 여유가 없고 형(우측형제)가 여유가 있다면
-> 형의 가장 작은 key를 부모 노드의 나와 형 사이에 둔다.
-> 원래 그 자리에 있던 key는 나의 가장 오른쪽에 둔다.
2.2 동생이 없므면 형과 나 사이의 key를 부모로부터 받는다.
-> 그 key와 형의 Key를 차례대로 나에게 합친다.
-> 형의 노드를 삭제한다.
(합칠때는 왼쪽으로 합친다)
3.2 부모가 루트노드이고 비어있다면
-> 부모 노드를 삭제한다.
-> 직전에 합쳐진 노드가 루트노드가 된다.









Internal 노드 데이터삭제하기
*삭제는 항상 leaf노드에서

b-tree, b+tree 차이점 알고있기