Data structure
CS 자료구조 B-Tree와 B+Tree
차가운개발
2024. 10. 10. 01:35
B-트리는 균형이진탐색트리에서 파생된 자료구조다. 데이터베이스와 파일 시스템에서 대용량 데이터를 효율적으로 관리하는데 사용된다. B-트리는 2개 이상의 더 많은 자식 노드를 가질 수 있으며, 디스크 I/O를 최소화하도록 설계되었다.
ㅇ B-Tree의 특징
B-트리는 이진트리와 다르게 하나의 노드에 많은 수의 정보를 가지고 있을 수 있다. 최대 M개의 자식을 가질 수 있는 B트리를 M차 B트리라고 하며 다음과 같은 특징을 갖는다.
규칙
- 노드는 최대 M개부터 M/2개의 자식을 가질 수 있다.
- 노드에는 최대 M - 1부터 M/2 -1개의 키가 포함될 수 있다.
- 노드의 키가 n개라면 자식의 수는 n + 1이다.
- 최소차수는 자식의 하한값을 의미하며 최소차수가 t라면 M = 2t - 1을 만족한다.
(최소차수 t가 2라면 3차 B트리이며, 키의 하한은 1이다.)
특징
- 모든 노드가 정렬된 키를 포함
각 노드에는 키들이 오름차순으로 정렬되어있다. 이 키들은 하위 트리로 가는 경로를 결정하는데 사용된다. - 자식 노드 개수가 여러 개일 수 있다
이진 탐색 트리와 달리 B-트리의 노드는 여러 개의 자식을 가질 수 있다. M차 B-트리 - 균형성
B-트리는 항상 균형 트리다. 모든 리프노드가 같은 깊이에 있다. 이로 인해 탐색, 삽입, 삭제 작업이 일정한 시간복잡도를 갖는다. - 노드가 꽉 차면 분할
노드에 저장할 수 있는 키의 최대 개수를 초과하면 해당 노드를 분할하여 두 개의 노드로 나누고 중간 값을 부모 노드로 올린다. 이 과정을 통해 항상 균형을 유지한다. - 디스크 I/O 최적화
B-트리는 대용량 데이터를 관리할 때 효율적이다. 한 노드에 여러 키와 자식 노드를 저장할 수 있기 때문에, 한 번의 디스크 접근으로 많은 데이터를 읽어올 수 있다. 데이터베이스나 파일 시스템처럼 대용량 데이터를 다룰 때 매우 효율적이다.
ㅇ B-트리의 연산
- 탐색
키를 찾기 위해, 루트 노드부터 시작해 각 노드의 키를 순차적으로 비교하며 내려간다. 각 노드에서 키를 찾거나 해당 키가 있는 하위 트리로 이동한다. 높이가 낮기 때문에 O(log n)의 시간복잡도를 가진다. - 삽입
새로운 키를 삽입할 때는 키가 들어갈 위치를 탐색 후 해당 위치에 키를 삽입한다. 노드가 가득 차 있다면 분할을 수행하여 노드를 두 개로 나누고 중간 값을 부모 노드로 올린다. - 삭제
삭제할 키를 찾은 후 리프 노드에서 삭제하거나, 내부 노드에서 삭제할 경우 자식 노드에서 대체할 키를 찾아 치환한다. 삭제 후 너무 적은 키가 남으면, 이웃한 노드와 병합하거나 키를 빌려오는 과정을 통해 트리의 균형을 유지한다.
ㅇ B-트리의 장점
- 디스크 I/O 최소화
B-트리는 한 노드에 많은 키와 자식 노드를 저장할 수 있기 때문에, 한 번의 디스크 접근으로 많은 데이터를 읽을 수 있다. 데이터베이스와 파일 시스템에서 매우 유리하다. - 균형 유지
모든 리프 노드가 동일한 깊이에 있으므로, 항상 균형을 유지한다. 이로 인해 삽입, 삭제, 탐색 연산의 시간이 일정하게 유지된다. - 대규모 데이터 처리에 효율적
B-트리는 자식 노드를 많이 가질 수 있어 트리의 높이가 낮고, 대규모 데이터를 빠르게 처리할 수 있다.
ㅇ B-트리의 응용
- 데이터베이스 인덱스
데이터베이스의 인덱스 구조로 자주 사용된다. B-트리를 변형한 B+트리를 사용하여 효율적인 검색, 삽입, 삭제 작업을 지원한다. - 파일 시스템
B+Tree
B+트리는 B-트리의 변형된 형태로 B-트리의 모든 특성을 가지면서도 몇가지 중요한 개선을 통해 더 빠르고 효율적인 검색과 순차 탐색을 지원한다.
ㅇ B+트리 특징
- 데이터는 리프 노드에만 저장
B+트리에서는 실제 데이터를 포함하는 키 값은 리프 노드에만 저장한다. 내부 노드는 탐색을 위한 경로 정보만 담고있고, 데이터를 저장하지 않는다. B-트리와 가장 큰 차이점 중 하나다. - 리프 노드간 연결
B+트리의 리프 노드들은 연결 리스트 형태로 되어있다. 이로 인해 순차적 탐색이 매우 효율적이다. 리프 노드 사이를 왼쪽에서 오른쪽으로 순차적으로 이동하며 데이터를 쉽게 찾을 수 있다. - 균형 트리 유지
항상 균형을 유지하며 모든 리프 노드가 같은 깊이에 있다. 삽입, 삭제, 탐색 연산이 일정한 시간안에 이루어진다.
ㅇ B+트리의 연산
- 탐색
루트 노드에서 시작하여 리프노드에 도달할 때까지 이루어진다. 내부 노드는 경로만 제공하기 때문에 데이터를 찾기 위해선 리프 노드까지 내려가야한다. 리프 노드들은 연결 리스트로 연결되어 있어 순차 검색도 쉽게 가능하다. - 삽입
새로운 키를 삽입할 위치를 찾고, 리프 노드에 도달한 후 데이터를 삽입한다. 리프가 가득차면 분할을 수행하여 중간값을 부모로 올린다(균형유지). - 삭제
삭제할 데이터를 리프 노드에서 찾고 삭제 후 키의 개수가 너무 적으면 병합 또는 재분배 작업을 통해 균형을 유지한다.
ㅇ B+트리의 장점
- 효율적인 순차 검색
리프 노드들이 연결 리스트로 연결되어 있어 순차적으로 데이터를 탐색하거나 범위 검색에 매우 효율적이다. - 더 많은 키 저장 가능
내부 노드에 데이터를 저장하지 않고 탐색을 위한 경로 정보만 저장하기 때문에, 한 노드에 더 많은 키를 저장할 수 있다. 트리의 높이를 낮게 유지하는데 도움이 되어 연산이 더 빠르게 수행된다. - 디스크 I/O 효율성
B+트리 한번의 디스크 접근으로 많은 데이터를 처리할 수 있는 구조를 가지며 대규모 데이터 저장소에서 매우 유리하다. 데이터는 리프 노드에 집중적으로 저장되므로, 내부 노드를 거치지 않고 빠르게 순차적으로 접근할 수 있다.
(최초는 루트에서 리프까지 내부를 거치지만 연결리스트 때문에 리프에서 리프로 갈때 내부를 거치지 않는다.)
ㅇ B+트리와 B-트리의 비교
- 데이터 저장 위치:
- B-트리: 데이터는 내부 노드와 리프 노드에 모두 저장
- B+트리: 데이터는 리프 노드에만 저장
- 리프 노드 간 연결:
- B-트리: 리프 노드 간에 특별한 연결 X
- B+트리: 리프 노드들이 연결 리스트로 연결되어 있어, 순차 검색이 더 빠르다.
- 순차 검색:
- B-트리: 순차적으로 데이터를 검색하려면 트리 탐색을 반복해야한다.
- B+트리: 리프 노드 간 연결 리스트 덕분에 한 번의 탐색 후 순차적으로 데이터를 쉽게 검색할 수 있다.