Làm cách nào để nhập các bản ghi với các khóa vào cây B + trống ban đầu?


11

Hiển thị kết quả của việc nhập các bản ghi với các khóa theo thứ tự (1, 2, 3, 4, 5) cho B + mậttree ban đầu của đơn hàng m = 3. Trong trường hợp tràn, hãy chia nút và không phân phối lại chìa khóa cho hàng xóm. Có thể nhập các bản ghi với các khóa theo thứ tự khác để có một cây có chiều cao ít hơn?

Từ các bộ phận DBMS quan hệ, chương 5: Các tổ chức cấu trúc cây năng động, tr.50

Tôi không tốt về điều này nhưng tôi đã cố gắng làm bên trái và> bên phải:

Cho đến khi chèn 1,2:

nhập mô tả hình ảnh ở đây

Sau đó, theo như chúng tôi phải phân chia nút và không phân phối lại khóa cho hàng xóm (tôi hiểu đó là nút con trai) Tôi chỉ chèn bên phải ô với 2:

nhập mô tả hình ảnh ở đây

Và tôi tiếp tục làm tương tự với khi chèn 5:

nhập mô tả hình ảnh ở đây

Nhưng điều này khá kỳ lạ, tôi chưa bao giờ thấy các nút trống như thế này ... Và tôi không biết liệu nó có tôn trọng một số thuộc tính cây B rất cơ bản không:

  • mỗi nút có nhiều nhất (m-1) khóa và ít nhất ((m / 2)-1) trừ khi một khóa có thể trống và tôi sẽ hiểu khóa là "con trỏ".

Lần thử đầu tiên: lỗi trên đơn đặt hàng đã tiết lộ một cây mơ hồ

Lúc đầu, tôi đã hiểu nhầm "thứ tự" là gì (số lượng con tối đa trên mỗi nút). Vì vậy, tôi nghĩ rằng một nút có thể có ba khoảng trắng (và do đó có 4 con. Tôi đang tạo một cây theo thứ tự 4 Tôi nghĩ:

Cho đến khi chèn 1,2,3:

nhập mô tả hình ảnh ở đây

Chèn 4, theo như chúng ta phải phân chia nút và không phân phối lại các khóa cho hàng xóm (có vẻ mâu thuẫn), tôi sẽ để 1,2,3 và 4,5 trên lá bên phải sau 3:

Cây B của đơn hàng 3 sau khi chèn 4 & 5

Câu trả lời:


6

Tôi nghĩ rằng bạn đã tạo ra trang của bạn lộn ngược. Khi một nút tách ra, nó không tạo ra nhiều nút hơn theo cấu trúc phân cấp (các nút con theo danh pháp của bạn). Thay vào đó nó tạo ra nhiều trở lên , về phía gốc. Như cuốn sách nói

Lưu ý rằng sự tăng trưởng đang ở đỉnh của cây, và đây là một đặc điểm nội tại của một chiếc B-cây để đảm bảo các tính chất quan trọng mà nó luôn luôn có tất cả các lá cùng cấp, và mỗi khác nhau nút từ gốc là ít nhất 50% đầy đủ.

(Nhấn mạnh của tôi.)

Từ ebook liên kết:

Định nghĩa 5.1 Cây AB kèm theo thứ tự m (m 3) ... mỗi nút chứa tối đa m - 1 khóa

Bài tập dành cho m = 3, vì vậy nhiều nhất là 2 phím cho mỗi nút.

Hai khóa đầu tiên rất dễ dàng - chúng đi vào trang đầu tiên:

A:[1,2]

Tôi sẽ sử dụng nghệ thuật ASCII. Tôi sẽ gắn nhãn cho từng trang trong chuỗi chúng được tạo và hiển thị các phím / con trỏ trong trang. Vì vậy, trang P chứa các giá trị chính k1 và k2 sẽ là P:[k1,k2].

Bây giờ phím 3 đi cùng. Theo Mục 5.2.1 ... Chèn, nhiệm vụ đầu tiên là tìm kiếm. Điều này xác định khóa 3 phải ở trang A - trang duy nhất chúng tôi có. Hơn nữa "nếu [nút đó] đầy, nó sẽ được chia thành hai nút." Trang đã đầy nên phải chia. Chúng tôi hiện có

A:[1,2]    B:[3, ]

Nhưng đây không phải là một cái cây! Như cuốn sách nói:

con trỏ tới [nút mới], .. được chèn vào nút cha .. của [nút hiện tại], lặp lại thao tác chèn trong nút này [tức là nút cha]. Quá trình phân tách và di chuyển lên này có thể tiếp tục nếu cần thiết đến gốc và nếu điều này phải được phân tách, một nút gốc mới sẽ được tạo ..

(Sự nhấn mạnh của tôi để hiển thị quá trình xử lý tiếp tục lên cây về phía gốc, chứ không phải xuống phía lá.)

Vì vậy, chúng ta phải đặt một con trỏ đến trang mới (B) vào cha đẻ của trang hiện tại (A). Phải có một nút gốc mới:

      C:[2,3]
      /     \
A:[1,2]    B:[3, ]

Tôi có các con trỏ trong các trang không có lá trỏ đến giá trị cao nhất trong nút con (con). Văn bản được liên kết của bạn có thể làm điều này khác nhau nhưng kết quả sẽ tương đương.

Giá trị khóa 4 đến; theo thuật toán chúng tôi tìm kiếm để tìm trang nào sẽ được trên. Nó phải là trang B. Có chỗ cho nó để chúng tôi cập nhật trang đó và con trỏ trên trang C:

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]

Tiếp theo chúng ta chèn khóa 5. Nó sẽ vào trang B nhưng nó đã đầy. Do đó, nó chia tách

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]   D:[5, ]

Chúng ta phải cập nhật nút cha. Nó cũng vậy, nó đầy nên nó chia ra:

      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

Sự phân chia lan truyền lên và một nút gốc mới hình thành:

            F:[4,5]
            /     \
      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

Bằng cách phát triển lên trên, cây duy trì độ sâu giống hệt nhau trong mỗi nhánh. Điều này rất quan trọng đối với hiệu suất dự đoán. (Một số người nói B trong B-Tree là viết tắt của "thăng bằng" vì lý do này.)


Đối với phần thứ hai - "Có thể nhập các bản ghi bằng các phím theo thứ tự khác để có một cây có chiều cao nhỏ hơn không?" Với 5 khóa và hai khóa cho mỗi nút, chúng ta cần ít nhất 3 nút lá để giữ tất cả các giá trị và chiều cao là 3 để tạo thành cây. Vì vậy, sự sắp xếp của tôi là tối ưu cho dữ liệu, trình tự và thuật toán nhất định.

Cuốn sách sử dụng cách sắp xếp con trỏ rất khác với những gì tôi sử dụng và cách sắp xếp phân chia trang khác nhau. Điều này sẽ rất quan trọng, dẫn đến các trang toàn phần. Rằng có một phần trên trang 42 được gọi là "Tải dữ liệu" cho thấy mức độ đầy đủ của các trang có thể đạt được bằng cách tải ra khỏi chuỗi chính hỗ trợ linh cảm của tôi. Tuy nhiên, tôi hy vọng tôi đã cung cấp cho bạn đủ con trỏ và bạn sẽ có thể sử dụng cấu trúc con trỏ của cuốn sách để tự mình giải quyết.


Tôi đã bắt gặp mô phỏng tương tác này về cách cây B phát triển.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.