Чому мінімальна висота двійкового дерева ?


10

У моєму класі Java ми дізнаємось про складність колекцій різних типів.

Незабаром ми обговоримо двійкові дерева, про які я читав. У книзі зазначено, що мінімальна висота двійкового дерева - , але не надає додаткових пояснень.log2(n+1)1

Може хтось пояснить, чому?


Я пояснюю це тут stackoverflow.com/a/13093274/550393
2cupsOfTech

Відповіді:


11

Бінарне дерево має 1 або 2 дітей у нелистових вузлах та 0 вузлів у листкових вузлах. Нехай у дереві буде вузлів, і ми маємо їх розташувати таким чином, щоб вони все-таки утворювали дійсне двійкове дерево.n

Не доводячи, я заявляю, що для досягнення максимальної висоти дані вузли повинні розташовуватися лінійно, тобто кожен нелистовий вузол повинен мати лише одну дитину:

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

Тут формула для обчислення відношення висоти за кількістю вузлів прямолінійна. Якщо - висота дерева, то .hh=n1

Тепер, якщо ми спробуємо побудувати бінарне дерево з вузлів з мінімальною висотою (завжди зводиться до повного бінарного дерева), нам доведеться спакувати якомога більше вузлів у верхніх рівнях, перш ніж переходити до наступного рівня. Отже, дерево має форму наступного дерева:n

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

Почнемо з конкретного випадку, .n=2m1

Ми знаємо, що

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

Крім того, легко довести, що рівень може мати в ньому не більше вузлів.i2i

Використовуючи цей результат у наведеній вище сумі, знаходимо, що для кожного рівня , від до , існує відповідний доданок при розширенні . Це означає, що повне двійкове дерево вузлів повністю заповнене і має висоту, , де висота повного двійкового дерева з вузлами.i0m2i12m12m1h(2m1)=m1h(n)=n

Використовуючи цей результат, , оскільки дерево з вузлами повністю заповнене і, таким чином, дерево з вузлами має вміщувати додатковий вузол на наступному рівні , збільшуючи висоту на 1 з до .h(2m)=m2m1(2m1)+1=2mmm1m

До цього часу ми довели, , а також,

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

Таким чином,nZ,2mn<2m+1

mh(n)<m+1

Але, беручи журнал (база 2) з обох сторін,

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

Таким чином,n,n[2m,2m+1)

h(n)=m=log2(n)

І ми можемо узагальнити цей результат за допомогою індукції.nZ

PS: Книга, яка визначає висоту повного бінарного дерева як , не вірна для всіх оскільки дасть значення для більшості цілих чисел (тобто для всіх, крім досконалих двійкові дерева), але висота дерева суцільно цільна.log2(n+1)1nlog2(n)n


19

Я припускаю, що під ви маєте на увазі загальну кількість вузлів у двійковому дереві. Висота (або глибина) двійкового дерева - це довжина шляху від кореневого вузла (вузла без батьків) до найглибшого листяного вузла. Щоб ця висота була мінімальною, дерево має бути найбільш насиченим (за винятком останнього ярусу), тобто якщо на певному ярусі є вузли з дітьми, то всі вузли на батьківському ярусі повинні мати двох дітей.n

Отже, повністю насичене бінарне дерево з ярусами матиме і матиме глибину . Таким чином, якщо ми маємо глибину двійкового дерева, ми можемо дуже легко знайти максимальну кількість вузлів (що відбувається, коли дерево повністю насичене). Якщо ви згадуєте з класів з алгебри, це просто геометричний ряд, і тому його можна представити так:41+12+122+12223

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

Тож давайте переставимо: а потім вирішимо для глибини: і ось ваша формула. Тепер майте на увазі, що це дає лише цілі значення, коли кожне дерево повністю заповнене («ідеальне» двійкове дерево), тому якщо ви отримаєте не ціле значення, не забудьте закріпити його.

nodes=2depth+11,
nodes+1=2depth+1log2(nodes+1)=log2(2depth+1)=depth+1log2(nodes+1)1=depth.

4

Щоб мінімізувати висоту, легко зрозуміти, що нам потрібно заповнити всі рівні, за винятком останнього. Чому? в іншому випадку ми можемо просто переміщати вузли останнього рівня в порожні слоти на верхніх рівнях.

А тепер уявіть, що у мене є певна кількість бобів, і я даю вам по одній квасолі за один раз і прошу побудувати бінарне дерево з можливою мінімальною висотою. Я можу закінчити боби до того моменту, коли ви повністю заповнили останній рівень, або принаймні один квасоля на останньому рівні. Скажімо, у вас є висота дерева годину в цій точці.

В будь-якому випадку h не змінюється. Отже, це означає, що у вас є повне двійкове дерево висотою h з моїм обмеженням. Але я припускав, що уявні боби на останньому рівні (якщо ви не змогли заповнити останній рівень). Так це насправді, Отже мінімум Але застосуйте стелю, оскільки ми додаємо уявні боби і не видаляємо їх.

20+21+22+23++2h=2h+11n.
h=lg(n+1)1.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.