İkili bir ağacın minimum yüksekliği neden


10

Java sınıfımda, farklı koleksiyon türlerinin karmaşıklığını öğreniyoruz.

Yakında üzerinde okuduğum ikili ağaçları tartışacağız. Kitap, ikili bir ağacın minimum yüksekliğininlog2(n+1)1, ancak daha fazla açıklama sunmaz.

Birisi nedenini açıklayabilir mi?


Yanıtlar:


11

Bir ikili ağacın yapraksız düğümlerde 1 veya 2 çocuğu ve yaprak düğümlerinde 0 düğümü vardır. Bırak olsunn Bir ağaçtaki düğümler ve onları hala geçerli bir ikili ağaç oluşturacak şekilde düzenlemeliyiz.

Kanıtlamadan, yüksekliği en üst düzeye çıkarmak için verilen düğümlerin doğrusal olarak düzenlenmesi gerektiğini, yani her bir yaprak olmayan düğümün sadece bir çocuğu olması gerektiğini belirtiyorum:

                              O 1
                              |
                              O 2
                              |
                              O 3
                              |
                              O 4
                              |
                              O 5
                              |
                              O 6
                              |
                              O 7
                              |
                              O 8

Burada, düğüm sayısı açısından yükseklik ilişkisini hesaplamak için formül basittir. Eğerh ağacın yüksekliği o zaman h=n1.

Şimdi, eğer bir ikili ağaç inşa etmeye çalışırsak nminimum yüksekliğe sahip düğümler (her zaman tam bir ikili ağaca indirgenebilir), bir sonraki seviyeye geçmeden önce üst seviyelerde mümkün olduğunca çok sayıda düğüm paketlemeliyiz. Böylece, ağaç aşağıdaki ağaç biçimini alır:

                              O
                              |1
                              |
                       O------+-----O
                       |2           |3
                       |            |
                   O---+---O    O---+----O
                   |4      |5    6        7
                   |       |
               O---+--O    O
                8      9    10

Belirli bir vaka ile başlayalım, n=2m1.

Biz biliyoruz ki,

20+21+22+...+2m1=2m1

Ayrıca, bunu kanıtlamak kolaydır. i en fazla olabilir 2i içindeki düğümler.

Bu sonucu yukarıdaki toplamda kullanarak, her seviye için i, itibaren 0 için m, karşılık gelen bir terim var 2i1 genişlemesinde 2m1. Bu, tam bir ikili ağacın2m1 düğümler tamamen dolu ve yüksekliği var, h(2m1)=m1, nerede h(n)= ile tam bir ikili ağacın yüksekliği n düğümleri.

Bu sonucu kullanarak, h(2m)=m, ağaçtan beri 2m1 düğümler tamamen dolu ve böylece (2m1)+1=2m düğümler ekstra düğümü bir sonraki aşamada karşılamak zorundadır m, yüksekliği 1'den artırarak m1 için m.

Şimdiye kadar kanıtladık,

h(2m)=m,
h(2m+1)=m+1
Hem de,
h(2m+11)=m

Böylece, nZ,2mn<2m+1

mh(n)<m+1

Ancak, her iki tarafta log (taban 2) alarak,

mlog2(n)<m+1
m=log2(n)

Böylece, n,n[2m,2m+1)

h(n)=m=log2(n)

Ve bu sonucu genelleştirebiliriz nZ indüksiyon kullanarak.

PS: Tam bir ikili ağacın yüksekliğini şöyle gösteren kitap log2(n+1)1 herkes için geçerli değil n Çünkü log2(n) çoğu tamsayı için integral olmayan değerler verir n (yani mükemmel ikili ağaçlar hariç herkes için), ancak bir ağacın yüksekliği tamamen ayrılmazdır.


19

Bunu varsayıyorum n, ikili ağaçtaki toplam düğüm sayısını kastediyorsunuz. İkili ağacın yüksekliği (veya derinliği), kök düğümden (ebeveynsiz düğüm) en derin yaprak düğümüne giden yolun uzunluğudur. Bu yüksekliği en aza indirmek için, ağacın en çok doygun olması gerekir (son katman hariç), yani belirli bir katmanın çocuklu düğümleri varsa, üst katmandaki tüm düğümlerin iki çocuğu olmalıdır.

Yani tamamen doymuş bir ikili ağaç 4 katmanlar sahip olacak 1+12+122+1222 maksimum düğüm ve derinliğe sahip olacak 3. Böylece, bir ikili ağacın derinliğine sahipsek, maksimum düğüm sayısını (ağaç tamamen doygun olduğunda ortaya çıkan) kolayca bulabiliriz. Cebir sınıflarınızdan hatırlarsanız, bu sadece geometrik bir seridir ve bu nedenle şu şekilde temsil edilebilir:

nodes=1+2+22+23+...+2depth=k=0depth2k=12depth+112.

Şimdi yeniden düzenleyelim:

nodes=2depth+11,
sonra derinliği için çözmek:
nodes+1=2depth+1log2(nodes+1)=log2(2depth+1)=depth+1log2(nodes+1)1=depth.
ve formülünüz var. Şimdi bunun her ağaç tamamen dolduğunda ('mükemmel' ikili ağaç) tamsayı değerler verdiğini unutmayın, bu nedenle tamsayı olmayan bir değer alırsanız yuvarlamayı unutmayın.

4

Yüksekliği minimumda tutmak için, sonuncusu hariç tüm seviyeleri doldurmamız gerektiğini görmek kolaydır. Neden? aksi takdirde, son seviye düğümlerini üst seviyelerde boş yuvalara taşıyabiliriz.

Şimdi, belirtilmemiş sayıda fasulyem olduğunu ve size her seferinde bir fasulye verdiğimizi ve mümkün olan en düşük yükseklikte bir ikili ağaç inşa etmenizi istediğimizi hayal edin. Ya son seviyeyi tamamen doldurduğunda ya da en azından son seviyede bir çekirdeğe sahip olduğum zaman fasulye tükenebilir. Diyelim ki bu noktada h ağaç yüksekliğiniz var .

Her iki durumda da, h değişmez. Yani bu , benim kısıtlamamla birlikte h yüksekliğinde tam bir ikili ağaca sahip olduğunuz anlamına gelir . Ama son seviyede hayali fasulye varsaydım (eğer son seviyeyi dolduramazsan). Yani aslında,

20+21+22+23++2h=2h+11n.
En az
h=lg(n+1)1.
Ancak hayali fasulye eklediğimizden ve silmediğimizden tavan uygulayın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.