Bagaimana cara memasukkan catatan dengan kunci ke pohon B + yang awalnya kosong?

11

Perlihatkan hasil dari memasukkan catatan dengan kunci dalam urutan (1, 2, 3, 4, 5) ke B + yang awalnya kosong –tiga pesanan m = 3. Jika terjadi luapan, pisahkan simpul dan jangan mendistribusikan ulang kunci tetangga. Apakah mungkin memasukkan catatan dengan kunci dalam urutan yang berbeda untuk memiliki pohon yang kurang tinggi?

Dari Internal DBMS Relasional, bab 5: Organisasi Struktur Pohon Dinamis, hal.50

Saya tidak pandai dalam hal ini, tetapi saya mencoba melakukan ≤ di sebelah kiri dan> di kanan:

Sampai penyisipan 1,2:

masukkan deskripsi gambar di sini

Kemudian sejauh kita harus memisahkan simpul dan tidak mendistribusikan kunci ke tetangga (saya memahaminya sebagai son-node) Saya hanya menyisipkan di sebelah kanan sel dengan 2:

masukkan deskripsi gambar di sini

Dan saya terus melakukan hal yang sama ketika memasukkan 5:

masukkan deskripsi gambar di sini

Tapi ini sangat aneh, saya tidak pernah melihat node kosong seperti ini ... Dan saya tidak tahu apakah itu menghormati beberapa properti B-tree yang sangat dasar:

  • setiap node memiliki paling banyak (m-1) kunci dan setidaknya (⌈ (m / 2) ⌉-1) kecuali kunci dapat kosong dan saya akan memahami kunci sebagai "pointer".

Upaya pertama: kesalahan pada urutan mengungkapkan pohon ambigu

Pada awalnya saya salah paham apa "pesanan" itu (jumlah maksimum anak per node). Jadi saya pikir sebuah simpul dapat memiliki tiga ruang (dan karenanya 4 anak. Saya membuat pohon pesanan 4 saya pikir:

Sampai penyisipan 1,2,3:

masukkan deskripsi gambar di sini

Penyisipan 4, sejauh kita harus memisahkan simpul dan tidak membagikan kembali kunci ke tetangga (yang tampaknya bertentangan) Saya akan membiarkan 1,2,3 dan 4,5 di daun kanan setelah 3:

B pohon pesanan 3 setelah memasukkan 4 & 5

Revolusi untuk Monica
sumber

Jawaban:

6

Saya pikir Anda memiliki kreasi halaman Anda terbalik. Ketika sebuah node membagi itu tidak membuat lebih node bawah hirarki (anak node dalam nomenklatur Anda). Sebaliknya ia menciptakan lebih ke atas , ke arah akar. Seperti yang dikatakan buku itu

Perhatikan bahwa pertumbuhan berada di atas pohon, dan ini merupakan karakteristik intrinsik dari pohon-B untuk memastikan sifat-sifat penting yang selalu dimiliki semua daun pada tingkat yang sama, dan setidaknya setiap simpul berbeda dari akar setidaknya 50% penuh.

(Penekanan saya.)

Dari ebook tertaut:

Definisi 5.1 AB – tree of order m (m ≥ 3) ... setiap node berisi paling banyak kunci m-1

Latihan ini untuk m = 3, jadi paling banyak 2 kunci per node.

Dua kunci pertama mudah - mereka masuk ke halaman pertama:

A:[1,2]

Saya akan menggunakan seni ASCII. Saya akan memberi label pada setiap halaman dalam urutan yang mereka buat dan menunjukkan kunci / petunjuk di dalam halaman. Jadi halaman P berisi nilai-nilai kunci k1 dan k2 akan P:[k1,k2].

Sekarang kunci 3 datang. Menurut Bagian 5.2.1 ... Penyisipan, tugas pertama adalah mencari. Ini menentukan kunci 3 harus di halaman A - satu-satunya halaman yang kita miliki. Selanjutnya "jika [simpul itu] penuh, itu akan dibagi menjadi dua simpul." Halaman penuh jadi harus dibagi. Kami sekarang punya

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

Tapi ini bukan pohon! Seperti yang dikatakan buku itu:

penunjuk ke [simpul baru], .. dimasukkan ke dalam simpul ayah .. dari [simpul saat ini], mengulangi operasi penyisipan dalam simpul ini [yaitu simpul ayah]. Proses pemisahan dan pemindahan ini dapat berlanjut jika perlu hingga ke root, dan jika ini harus dipisah, simpul root baru akan dibuat ..

(Penekanan saya untuk menunjukkan pemrosesan terus naik pohon ke arah akar, bukan ke bawah ke daun.)

Jadi kita harus meletakkan pointer ke halaman baru (B) ke dalam bapak halaman saat ini (A). Harus ada simpul root baru:

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

Saya memiliki pointer di halaman non-daun yang menunjuk ke nilai tertinggi dalam simpul anak (anak). Teks tertaut Anda dapat melakukan ini secara berbeda tetapi hasilnya akan setara.

Nilai kunci 4 tiba; mengikuti algoritma kami mencari untuk menemukan halaman yang seharusnya. Itu harus halaman B. Ada ruang untuk itu sehingga kami memperbarui halaman itu dan penunjuk di halaman C:

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

Selanjutnya kita masukkan kunci 5. Seharusnya masuk halaman B tapi sudah penuh. Karena itu ia terbelah

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

Kita harus memperbarui simpul ayah. Itu juga penuh sehingga terbagi:

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

Split menyebar dan sebuah node root baru membentuk:

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

Dengan tumbuh ke atas pohon mempertahankan kedalaman identik di setiap cabang. Ini penting untuk kinerja yang dapat diprediksi. (Ada yang mengatakan B dalam B-Tree berarti "seimbang" karena alasan ini.)


Adapun bagian kedua - "Apakah mungkin untuk memasukkan catatan dengan kunci dalam urutan yang berbeda untuk memiliki pohon yang kurang tinggi?" Dengan 5 kunci dan dua kunci per simpul, kita membutuhkan setidaknya 3 simpul daun untuk menampung semua nilai dan tinggi 3 untuk membentuk pohon. Jadi pengaturan saya optimal untuk data, urutan, dan algoritma yang diberikan.

Buku ini menggunakan pengaturan penunjuk yang sangat berbeda dengan apa yang saya gunakan, dan pengaturan pembagian halaman yang berbeda. Ini akan menjadi signifikan, mengarah ke bagian-halaman penuh. Bahwa ada bagian di halaman 42 yang disebut "Pemuatan Data" yang menunjukkan bagaimana halaman yang lebih lengkap dapat dicapai dengan mengeluarkan urutan kunci mendukung firasat saya. Namun, saya harap saya telah memberi Anda petunjuk yang cukup dan Anda akan dapat menggunakan struktur penunjuk buku untuk mengerjakannya sendiri.


Saya telah menemukan simulasi interaktif ini tentang bagaimana B-Tree tumbuh.

Michael Green
sumber