1. 사전 기본 개념
1-1. 자료구조란

자료구조 |--- 단순 자료구조
| |--- 직접 접근
|--- 복합 자료구조 --자료접근방법--|
| |--- 순서 접근
|
|--데이터 나열 방식-----|---- 선형 구조
|
|---- 비선형 구조
- 단순 자료구조 : 정수, 실수, 문자와 같이 프로그래밍 언어에서 기본적으로 제공하는 데이터 타입
- 복합 자료구조 : 단순 자료구조를 기반으로 만들어낸 배열, 스택, 트리와 같은 자료 구조
- 직접 접근 : 한 번만에 접근
- 순서 접근(순차 접근) : 시작 노드부터 순차적으로 접근
- 선형 구조 : 데이터가 순차적으로 나열 {배열, 연결 리스트, 스택, 큐, 덱}
- 비선형 구조 : 하나의 데이터 뒤에 여러 개의 데이터가 올 수 있는 구조 {트리, 그래프}
- 알고리즘 : 문제를 해결하는 절차
1-2. 트리
(1) 트리 용어
A <- 루트 노드
/ \
B C <- 내부 노드 (자식 있음)
/ \ \
D E F <- 리프 노드 (자식 없음)
- 노드
- 루트 노드
- 내부 노드 : 자식 노드가 있는 노드 (루트 노드도 포함)
- 서브 트리
- 엣지
- 부모노드
- 자식 노드
- 형제
- 조상 노드
- 자손 노드
- 단말노드(리프노드 leaf node) : 자식 없는 노드
- 비단말 노드
- 차수 : 어떤 노드가 가지고 있는 자식의 수 → 트리의 차수 : 노드 차수 중 가장 큰 값
- 레벨(0부터 시작) → 트리의 높이: 트리 최대 레벨
- 논문이나 자료마다 0부터 시작하는지 1부터 시작하는지 다름
- 포레스트 : 트리들 집합
1-3. 이진 탐색 트리(BST)
- 부모 노드를 기준으로 왼쪽노드는 항상 작고 오른쪽 노드 항상 큼
- 자녀노드는 최대 두개까지
2. B-Tree 개념 및 특징
2-1. 개념

- 이진 탐색 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리
- 데이터베이스와 파일 시스템에 널리 사용되는 트리 자료구조의 일종
- 이진 트리와 다르게 하나의 노드에 많은 수의 정보(데이터 ⇒ key)를 가질 수 있음 → 노드에 정렬된 키 값과 포인터 가짐, 각 노드는 특정 범위의 값을 관리, key는 정렬된 상태로 저장됨
- 데이터와 key가 혼재되어 사용되지만, 사실 B-Tree는 데이터의 특정 키를 인덱스로 지정하고 해당 인덱스를 계층적인 구조로 정렬한 것이기 때문에 데이터보다는 key라는 표현이 더 정확함
- 최대 M개의 자식을 가질 수 있는 B-Tree를 M차 B-Tree라고 함
- Binary Search Tree를 일반화한 tree라고 할 수 있음 → 자녀노드의 최대 개수를 정할 수 있어서
2-2. 특징


- 노드에는 2개 이상의 데이터(key)가 들어갈 수 있으며, 항상 정렬된 상태로 저장된다.
- 내부 노드는 ceil(M/2) ~ M개의 자식노드를 가질 수 있다. → ceil 올림 함수

- 특정 노드의 데이터(key)가 k개라면 자식 노드의 개수는 k+1개여야 한다.
- 노드가 최소 하나의 KEY는 가지기 때문에 몇 차 인지에 상관없이 internal 노드는 최소 두개의 자녀는 가진다.

- 특정 노드의 왼쪽 서브 트리는 특정 노드의 key보다 작은 값들로, 오른쪽 서브 트리는 큰 값들로 구성된다.
- 10의 왼쪽 서브 트리는 10보다 작은 값이 위치하고, (10,21) 사이의 서브 트리는 10보다 크지만 21보다 작은 값들이 위치하고, 21 오른쪽 서브 트리는 21보다 큰 값이 위치한다.

- 노드 내의 데이터(key)는 ceil(M/2)-1개부터 최대 M-1개까지 포함될 수 있다.
- 3차 B트리는 1~2개의 노드 내 데이터를 가짐
- 모든 리프 노드들은 같은 레벨에 존재한다.
- balanced tree(모든 서브 트리의 높이 차이가 최대 하나인 이진트리) → 검색 평균,최악 모두 O(log N)을 가지게 됨
→ 불만족 예시

3. B-Tree 조회 삽입 삭제
3-1. 조회(검색)
- k 값을 조회한다면
- 루트노드에서 하위 노드로 조회를 한다
- k가 해당 노드보다 작으면 포인터를 따라 왼쪽 자식 노드로 이동
- k가 해당 노드보다 크면 포인터를 따라 오른쪽 자식 노드로 이동
3-2. 삽입
- 데이터 추가는 항상 리프노드에 한다. → 이때 조회를 통해 적절한 리프 노드에 추가한다.
- 노드가 넘치면 가운데 key를 기준으로 좌우 key들을 분할하고 가운데 key는 승진한다.
- 부모 노드에 자리가 있으면 부모 노드로 승진
- 부모 노드에 승진 시키고 부모 노드가 넘치면 가운데 key 기준으로 좌우 분할 후 가운데 key 승진
- 노드가 넘친다 = 각 노드의 최대 key값을 넘치는 경우, M-1값을 넘는 경우
예시 → 2추가



예시 → 10추가




3-3. 삭제
(1) 리프노드에서 삭제 발생
(2) 내부(internal) 노드에서 삭제 발생
- 리프 노드와 삭제되는 내부 노드 위치 교체
- 삭제할 데이터의 선임자나 후임자와 위치 교체
- 선임자 : predecessor 나보다 작은 데이터 중 가장 큰 값
- 후임자 : successor 나보다 큰 데이터 중 가장 작은 값
- 즉, 데이터 삭제는 항상 리프노드에서 발생
하지만 코드에서 구현할 때는 조금 다름
- 삭제할 키가 있는 노드가 리프노드일 때
- 삭제할 키가 있는 노드가 리프노드가 아닐 때
- 선임자가 여유 키를 가진 경우 (> min_keys)
→ Predecessor로 교체 후, 왼쪽 서브트리에서 predecessor 재귀 삭제
→ 최종적으로 리프 노드에서 삭제됨
- 후임자가 여유 키를 가진 경우 (> min_keys)
→ Successor로 교체 후, 오른쪽 서브트리에서 successor 재귀 삭제
→ 최종적으로 리프 노드에서 삭제됨
- 선임자, 후임자 모두 최소 키만 가진 경우 (= min_keys)
→ 양쪽 자식과 삭제할 키를 병합(Merge)
→ 병합된 노드에서 삭제 (리프가 아닐 수도 있음)
- 예시 ```
[10, 20, 30] ← 20 삭제
/ | | \
[5] [15] [25] [35]
↑ ↑
양쪽 모두 키 1개 (= min_keys)
Step 1: 병합
- [15] + 20 + [25] = [15, 20, 25]
[10, 30]
/ | \
[5] [15,20,25] [35]
↑
병합된 노드 (리프일 수도, 아닐 수도)
Step 2: 병합된 노드에서 20 삭제
[10, 30]
/ | \
[5] [15,25] [35]
```
- (항상 확인) 삭제 진행 후 현재 노드의 키가 최소보다 작을 때
- 형제에게 키 빌릴 수 있으면 빌리기
- 형제에게 못빌릴때 부모에게 빌리고 부모키 왼쪽 오른쪽 자식(현재 노드와 형제노드)끼리 병합
4. B-Tree 시간복잡도

- 시간복잡도 계산
- N: 전체 key(데이터)의 개수, m : B-Tree의 차수(최대 자식 개수), h : B-Tree 높이
- m^h ≥ N
- h ≤ logₘ N ⇒ h ≈ logₘ N
- 이때 탐색 시간은 트리 높이에 비례함. 즉, 시간복잡도는 logₘ N에 비례
- logₘ N에서 m은 상수로 1로 취급 logₘ N ⇒ log N
- 시간 복잡도 = log N
- 시간복잡도 평균 최악이 같은 이유
- B-Tree는 항상 균형을 유지하므로 모든 리프 노드가 같은 깊이
- 같은 깊이 = 같은 시간복잡도
5. 데이터베이스에서 사용되는 방식
(1) 기본 데이터베이스 개념
- database는 보조저장장치에 위치함

- 데이터를 읽고 쓸 때 원하는 부분만 가져오는 것이 아니라 block 단위로 가져다 씀

- 보조기억장치에 최대한 적게 접근하고 연관된 데이터가 가까이 모아서 저장되면 더 효율적임

(2) DB에 B Tree 계열을 사용하는 이유
- 자녀 노드의 개수, 노드의 데이터 수를 많이 가질 수 있으므로 storage 접근 횟수가 줄어들고 Block 단위의 저장 공간을 알차게 사용할 수 있음 → 데이터를 찾을 때 탐색 범위를 빠르게 좁힐 수 있음
- DBMS에서는 ‘하나의 B-Tree 노드 = 하나의 디스크 블록’으로 설계되므로 같은 노드의 key들은 항상 같은 블록에 존재



(3) B-Tree best case

(4) B-Tree worst case
- 파라미터
- 최소 루트 노드 key 개수 : 1
- 최소 루트 자식 노드 개수 : 2
- 최소 노드 key 개수 : 50
- 최소 자식 노드 개수 : 51


6. 나오게 된 배경, 다른 B+Tree, B*Tree와의 차이점
- 창시자
- 배경
- 디스크를 위한 트리를 위해 만들어진 것으로 디스크의 느린 I/O와 블록 단위의 데이터 읽기를 고려하고 만들어짐
- 차이점
- B-Tree는 데이터가 내부 노드에도 존재 가능 → 디스크 I/O 많이 발생
- B-Tree는 리프노드 연결X → 범위 검색 시 모든 노드 순회 필요
*그 외
*-1. 문자열은 단순 자료구조인지 복합 자료구조인지
- 내부적 구현 관점에서 보면 문자가 연속된 메모리 공간에 저장되어 복합적 구조이지만 일반 프로그래밍 언어에서 기본적으로 제공하는 데이터 타입이므로 논리적으로는 단순 자료구조임
*-2. 배열과 리스트 차이
배열, 동적배열, 리스트, 연결리스트
- 배열
- 선언 시 크기 고정, 연속된 메모리 공간
- 직접 접근 O(1) but, 중간 삽입삭제 느림 O(n)
- 동적 배열
- 크기 조절 가능한 배열 → 공간이 부족하면 더 큰 메모리를 새로 할당하고 기존 데이터 복사 (여전히 연속된 메모리 공간)
- 직접 접근 but, 중간 삽입삭제 느림
- 연결 리스트
- 각 노드가 데이터+포인터(다음 노드 주소) 저장, 비연속 메모리 공간
- 순차 접근 O(n) but, 중간 삽입삭제 빠름 O(1)
- 리스트 → 동적 배열 또는 연결 리스트
*-3. 힙 트리와 일반 트리 차이
(1) 완전 이진 트리
- 높이가 k인 트리에서 레벨 1부터 k-1까지 노드가 모두 채워져있고 마지막 레벨 k에서는 왼쪽부터 오른쪽으로 노드가 순서대로 채워져 있는 이진트리
(2) 힙
- 완전 이진 트리 형태를 가지며, 부모 자식 간의 값 크기 관계를 만족하는 트리
- 최대 힙 : 부모 노드 ≥ 자식 노드
- 최소 힙 : 부모노드 ≤ 자식 노드
- 왼쪽 노드가 오른쪽 노드보다 크거나 작아야 한다는 규칙 없음.
- 단, 삭제 연산 시 루트 노드 삭제 후 제일 말단 노드를 루트로 올려서 자식 노드 중 더 크거나 작은 노드와 교환해야함.
*-4. 알고리즘의 자세한 정의
*-5. 멀티 레벨 인덱스
(1) 인덱스

- 클러스터형 인덱스 : 데이터 행 순서대로 저장되는 인덱스, 각 테이블 당 하나
- 테이블 생성 시 기본키를 기준으로 하나의 클러스터형 인덱스 가짐
- 보조형 인덱스 : 기준이 되는 컬럼을 기준으로 별도의 순서로 저장되는 인덱스, 각 테이블 당 여러개 가능
- 테이블의 컬럼에 ‘유일값을 가지게 하는 UNIQUE’로 설정하면 그 컬럼 기준으로 하나의 보조형 인덱스 가짐
(2) 멀티 레벨 인덱스

- 단일 인덱스와 비교해서 멀티 레벨 인덱스를 사용하면 인덱스 저장 파일 크기는 동일하지만 검색 속도가 빨라짐 (단일 O(n), 멀티레벨 O(log n))
*-6. 해시 테이블

*-7. 파일 시스템
B-Tree를 사용하는 파일 시스템은 Btrfs(B-Tree File System)
(1) Btrfs

**용어
0. 검색키
인덱스가 기준으로 삼는 필드
0. 필드, 레코드
필드 = 컬럼 = 열
레코드 = 행
0. 실린더(Cylinder)
- 물리적인 하드디스크 저장 구조 단위
- 하드디스크에는 원판이 여러개 있고 각 원판에는 트랙이 있음
- 같은 위치의 트랙들을 위아래로 합친 것을 실린더라함
- 즉, 디스크에서 데이터를 연속적으로 읽을 수 있는 최소 단위
참고 자료