페이지 작성이 거꾸로 된 것 같습니다. 노드가 분할되면 계층 구조 아래에 더 많은 노드가 생성되지 않습니다 (명칭의 아들 노드). 대신 루트쪽으로 더 위쪽을 만듭니다 . 책이 말했듯이
성장은 나무 의 꼭대기 에 있으며, 이것은 B- 트리의 본질적인 특성으로 모든 잎이 항상 같은 레벨에 있어야하며 뿌리와 다른 각 노드는 최소한 50 % 찼습니다.
(내 강조)
연결된 전자 책에서 :
정의 5.1 AB – m의 트리 m (m ≥ 3) ... 각 노드는 최대 m-1 키를 포함합니다
연습은 m = 3이므로 노드 당 최대 2 개의 키입니다.
처음 두 키는 쉽습니다. 첫 페이지로 이동합니다.
A:[1,2]
ASCII 아트를 사용하겠습니다. 각 페이지에 순서대로 레이블을 작성하고 페이지 내에 키 / 포인터를 표시합니다. 따라서 키 값 k1 및 k2를 포함하는 페이지 P는입니다 P:[k1,k2]
.
이제 열쇠 3이 나옵니다. 섹션 5.2.1 ... 삽입에 따르면 첫 번째 작업은 검색하는 것입니다. 이렇게하면 키 3이 페이지 A에 있어야합니다 (유일한 페이지). 또한 "[해당 노드]가 가득 찬 경우 두 개의 노드로 분할됩니다." 페이지가 가득 차서 분할해야합니다. 우리는 지금
A:[1,2] B:[3, ]
그러나 이것은 나무가 아닙니다! 책에서 말한 것처럼 :
[새 노드] 포인터가 있습니다 .. 삽입 아버지 [즉 아버지 노드이 노드에 삽입 동작을 반복 [현재 노드]의 .. 노드. 이 분할 및 이동 프로세스는 필요한 경우 루트까지 계속 될 수 있으며, 분할해야하는 경우 새 루트 노드가 작성됩니다.
(가공을 강조하는 나의 강조는 잎을 향한 것이 아니라 뿌리를 향한 나무를 계속합니다.)
따라서 새 페이지 (B)에 대한 포인터를 현재 페이지 (A)의 아버지에 배치해야합니다. 새로운 루트 노드가 있어야합니다.
C:[2,3]
/ \
A:[1,2] B:[3, ]
리프가 아닌 페이지의 포인터가 자식 (아들) 노드에서 가장 높은 값을 가리키는 포인터가 있습니다. 링크 된 텍스트는 다르게 수행 할 수 있지만 결과는 동일합니다.
키 값 4가 도착합니다. 알고리즘에 따라 어떤 페이지가 있어야하는지 검색합니다. B 페이지 여야합니다.이 페이지와 C 페이지의 포인터를 업데이트 할 공간이 있습니다.
C:[2,4]
/ \
A:[1,2] B:[3,4]
다음으로 키 5를 삽입합니다. B 페이지로 가야하지만 가득 찼습니다. 따라서 분할
C:[2,4]
/ \
A:[1,2] B:[3,4] D:[5, ]
아버지 노드를 업데이트해야합니다. 또한 꽉 차서 분할됩니다.
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
분할이 전파되고 새로운 루트 노드가 형성됩니다.
F:[4,5]
/ \
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
위쪽으로 자라면서 나무는 모든 가지에서 동일한 깊이를 유지합니다. 예측 가능한 성능에 중요합니다. (B-Tree의 B가 바로 이런 이유로 "균형"을 의미한다고 말하는 사람들도 있습니다.)
두 번째 부분은 "키가 다른 레코드를 다른 순서로 입력하여 키가 작은 나무를 가질 수 있습니까?" 노드 당 5 개의 키와 2 개의 키를 사용하면 트리를 구성하기 위해 모든 값과 높이 3을 유지하기 위해 최소한 3 개의 리프 노드가 필요합니다. 따라서 주어진 데이터, 시퀀스 및 알고리즘에 가장 적합합니다.
이 책은 내가 사용하는 것과 매우 다른 포인터 배열과 다른 페이지 분할 배열을 사용합니다. 이것은 중요한 부분으로 가득 찬 페이지로 이어집니다. 42 페이지에 "데이터로드"라는 섹션이 있는데 키 시퀀스에서로드하여 전체 페이지를 얻을 수있는 방법을 보여줍니다. 그러나 충분한 포인터를 제공했으면 책의 포인터 구조를 사용하여 스스로 해결할 수 있습니다.
나는 B-Tree가 어떻게 성장하는지에 대한 대화식 시뮬레이션 을 보았습니다 .