처음에 비어있는 B + 트리에 키가있는 레코드를 입력하는 방법은 무엇입니까?


11

키가있는 레코드를 입력 한 순서대로 (1, 2, 3, 4, 5) 순서대로 비어있는 B + – 트리 m-3의 트리를 표시하십시오. 오버 플로우의 경우 노드를 분할하고 재분배하지 마십시오. 이웃의 열쇠. 키가 낮은 레코드를 다른 순서로 입력하여 키가 작은 트리를 가질 수 있습니까?

에서 동적 트리 구조의 조직, P.50 : 관계형 DBMS 내부 구조, 제 5 장

나는 이것에 좋지 않다. 왼쪽에서 ≤를하고 오른쪽에서>를 시도했다.

1,2의 삽입까지 :

여기에 이미지 설명을 입력하십시오

그런 다음 노드를 분할하고 키를 이웃에 재배포하지 않아야하는 한 (손 노드로 이해합니다) 셀 오른쪽에 2를 삽입했습니다.

여기에 이미지 설명을 입력하십시오

그리고 5를 삽입 할 때도 똑같이했습니다.

여기에 이미지 설명을 입력하십시오

그러나 이것은 매우 이상합니다.이 같은 빈 노드를 보지 못했습니다 ... 그리고 그것이 매우 기본적인 B-tree 속성을 존중하는지 모르겠습니다.

  • 각 노드에는 키를 비울 수없고 키를 "포인터"로 이해하지 않는 한 최대 (m-1) 키와 적어도 (/ 2 (m / 2) ⌉-1) 키가 있습니다.

첫 번째 시도 : 주문 오류로 인해 모호한 나무가 드러남

처음에는 "순서"가 무엇인지 (노드 당 최대 자식 수) 오해했습니다. 그래서 노드에 세 개의 공백이있을 수 있다고 생각했습니다. 따라서 4 명의 자식이 있습니다.

1,2,3의 삽입까지 :

여기에 이미지 설명을 입력하십시오

노드를 분할하고 이웃에게 키를 재분배하지 않는 한 4를 삽입하면 (모순되는 것처럼 보입니다) 3 후 오른쪽 리프에서 1,2,3 및 4,5를 보냈습니다.

4 & 5를 삽입 한 후 순서 3의 B 트리

답변:


6

페이지 작성이 거꾸로 된 것 같습니다. 노드가 분할되면 계층 구조 아래에 더 많은 노드가 생성되지 않습니다 (명칭의 아들 노드). 대신 루트쪽으로 더 위쪽을 만듭니다 . 책이 말했듯이

성장은 나무 의 꼭대기 에 있으며, 이것은 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가 어떻게 성장하는지에 대한 대화식 시뮬레이션 을 보았습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.