Sayfa oluşturma işleminizi baş aşağı yaptığınızı düşünüyorum. Bir düğüm böler zaman daha fazla düğüm yaratmaz aşağı (sizin terminolojideki oğul düğümleri) hiyerarşi. Bunun yerine köke doğru daha yukarı doğru oluşturur . Kitabın dediği gibi
Büyümenin ağacın üstünde olduğunu ve bu, her zaman tüm yaprakların aynı seviyede olmasını ve her düğümün kökten farklı olmasını sağlayan önemli özellikleri sağlamak için bir B ağacının kendisinin karakteristik özelliğine dikkat edin. % 50 dolu.
(Vurgu.)
Bağlantılı e-kitaptan:
Tanım 5.1 AB --- m (m ≥ 3) ağacı ... her düğüm en fazla m - 1 anahtarı içerir
Egzersiz m = 3 içindir, bu nedenle düğüm başına en fazla 2 anahtar.
İlk iki anahtar kolaydır - ilk sayfaya girerler:
A:[1,2]
ASCII sanatını kullanacağım. Her sayfayı oluşturuldukları sırayla etiketleyeceğim ve sayfadaki tuşları / işaretçileri göstereceğim. Yani k1 ve k2 anahtar değerlerini içeren P sayfası olacaktır P:[k1,k2]
.
Şimdi anahtar 3 geliyor. Bölüm 5.2.1 ... Yerleştirmeye göre, ilk görev aramaktır. Bu, anahtar 3'ün sahip olduğumuz tek sayfa olan A sayfasında olması gerektiğini belirler. Ayrıca "[bu düğüm] doluysa, iki düğüme bölünecektir.” Sayfa dolu olduğundan bölünmesi gerekiyor. Şimdi sahibiz
A:[1,2] B:[3, ]
Ama bu bir ağaç değil! Kitabın dediği gibi:
[yeni düğüm], .. işaretçisi [ mevcut düğümün] baba düğümüne .. yerleştirilir, bu düğümdeki [yani baba düğüm] ekleme işlemini tekrarlar. Bu bölme ve yukarı taşıma işlemi gerektiğinde köke kadar devam edebilir ve bu bölünmesi gerekiyorsa, yeni bir kök düğüm oluşturulur.
(İşleme gösterme konusundaki vurgum, ağacı yapraklara doğru değil, köküne doğru sürdürüyor.)
Bu yüzden, yeni sayfanın (B) geçerli sayfanın (A) babasına bir işaretçi koymalıyız. Yeni bir kök düğüm olmalıdır:
C:[2,3]
/ \
A:[1,2] B:[3, ]
Bir çocuk (oğul) düğümde en yüksek değere işaret eden yaprak olmayan sayfalarda işaretçiler var. Bağlantılı metniniz bunu farklı yapabilir, ancak sonuç eşdeğer olur.
Anahtar değeri 4 gelir; algoritmanın ardından hangi sayfada olması gerektiğini araştırıyoruz. Sayfa B olmalıdır. Bu nedenle, bu sayfayı ve C sayfasındaki işaretçiyi güncelleyelim:
C:[2,4]
/ \
A:[1,2] B:[3,4]
Sonra anahtar 5'i ekliyoruz. B sayfasına gitmeli ama dolu. Bu nedenle
C:[2,4]
/ \
A:[1,2] B:[3,4] D:[5, ]
Baba düğümünü güncellemeliyiz. O da dolu, böylece böler:
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
Bölme çoğalır ve yeni bir kök düğüm oluşur:
F:[4,5]
/ \
C:[2,4] E:[5, ]
/ \ \
A:[1,2] B:[3,4] D:[5, ]
Yukarı doğru büyüyerek ağaç her dalda aynı derinliği korur. Bu, öngörülebilir performans için önemlidir. (Bazıları B-Tree'deki B'nin bu nedenle "dengeli" anlamına geldiğini söylüyor.)
İkinci bölüm ise - "Daha az yükseklikte bir ağaca sahip olmak için kayıtları anahtarlarla farklı bir sırada girmek mümkün mü?" Düğüm başına 5 anahtar ve iki anahtar ile tüm değerleri tutmak için en az 3 yaprak düğümüne ve ağacı oluşturmak için 3 yüksekliğe ihtiyacımız var. Bu yüzden benim düzenlemem verilen veri, dizi ve algoritma için en uygunudur.
Kitap kullandığım şeye göre çok farklı bir işaretçi düzenlemesi ve farklı bir sayfa bölme düzenlemesi kullanıyor. Bu önemli olacak ve kısmen dolu sayfalara yol açacaktır. 42. sayfada "Veri Yükleme" adlı bir bölümün, tuş dizisi yüklenerek daha dolgun sayfalara nasıl ulaşılabileceğini gösteren bir önsezi benim kümemi destekler. Bununla birlikte, umarım size yeterli sayıda işaretçi verdim ve kitabın işaretçi yapısını kendiniz için kullanabileceksiniz.
Ben geldim bu interaktif simülasyon B-ağacı yetişir nasıl.