Найгірший випадок у Max-Heapify - як ви отримуєте 2n / 3?


81

У CLRS, третє видання, на сторінці 155, зазначено, що в MAX-HEAPIFY,

Кожне дитяче піддерево має розмір не більше 2 н / 3 - найгірший випадок трапляється, коли нижній рівень дерева заповнений рівно наполовину.

Я розумію, чому найгірше, коли нижній рівень дерева заповнений рівно наполовину. І в цьому питанні також дається відповідь на найгірший випадок у MAX-HEAPIFY: "найгірший випадок трапляється, коли нижній рівень дерева заповнений рівно наполовину"

Моє питання полягає в тому, як отримати 2n / 3?

Чому, якщо нижній рівень наполовину заповнений, тоді розмір дочірнього дерева до 2n / 3?

Як це розрахувати?

Дякую


5
Простий розрахунок наведено в цьому блозі: bit.ly/138f43F .
akaHuman

Відповіді:


65

У дереві, де кожен вузол має рівно 0 або 2 дочірніх, кількість вузлів з 0 дочірніми на один більше, ніж кількість вузлів з 2 дочірніми. {Пояснення: кількість вузлів на висоті h дорівнює 2 ^ h, що формула підсумовування геометричного ряду дорівнює (сума вузлів від висоти 0 до h-1) + 1; і всі вузли від висоти 0 до h-1 - це вузли з рівно 2 дочірніми елементами}

    ROOT
  L      R
 / \    / \
/   \  /   \
-----  -----
*****

Нехай k - кількість вузлів у R. Кількість вузлів у L дорівнює k + (k + 1) = 2k + 1. Загальна кількість вузлів n = 1 + (2k + 1) + k = 3k + 2 (корінь плюс L плюс R). Співвідношення (2k + 1) / (3k + 2), яке обмежене вище на 2/3. Не працює константа менше 2/3, оскільки межа, коли k переходить до нескінченності, становить 2/3.


2
так, я розумію, ви маєте на увазі L / n = 2/3
Jackson Tale

7
Ого. Це було глибоко. Як ти це сам зрозумів?
Програмування Noob

38

Understand the maximum number of elements in a subtree happens for the left subtree of a tree that has the last level half full.Draw this on a piece of paper to realize this.

Як тільки це стане ясно, межу 2N / 3 легко отримати.

Припустимо, що загальна кількість вузлів у дереві дорівнює N.

Кількість вузлів у дереві = 1 + (Кількість вузлів у лівому піддереві) + (Кількість вузлів у правому піддереві)

У нашому випадку, коли дерево має останній рівень наполовину заповнений, iF ми припускаємо, що праве піддерево має висоту h, тоді ліве піддерево, якщо висоти (h + 1):

Кількість вузлів у лівому піддереві = 1 + 2 + 4 + 8 .... 2 ^ (h + 1) = 2 ^ (h + 2) -1 ..... (i)

Кількість вузлів у правому піддереві = 1 + 2 + 4 + 8 .... 2 ^ (h) = 2 ^ (h + 1) -1 ..... (ii)

Таким чином, підключаючи до:

Кількість вузлів у дереві = 1 + (Кількість вузлів у лівому піддереві) + (Кількість вузлів у правому піддереві)

=> N = 1 + (2^(h+2)-1) + (2^(h+1)-1)

=> N = 1 + 3*(2^(h+1)) - 2

=> N = 3*(2^(h+1)) -1

=> 2^(h+1) = (N + 1)/3

Підключаючи це значення до рівняння (i), отримуємо:

Number of nodes in Left Subtree = 2^(h+2)-1 = 2*(N+1)/3 -1 =(2N-1)/3 < (2N/3)

Отже, верхня межа максимальної кількості вузлів у піддереві для дерева з N вузлами дорівнює 2N / 3.


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

1
@SundarRajan check math.stackexchange.com/questions/181022/… Особливо частинаThis is the most the heap can get imbalanced; adding another node will either begin to rebalance the heap (by filling out the other, right, half of the last level) or break the heap's shape property of being a complete binary tree
momo

Гарне пояснення.
Eagle

14

Для повного двійкового дерева висоти hкількість вузлів дорівнює f(h) = 2^h - 1. У наведеному вище випадку ми маємо майже повне бінарне дерево із заповненою нижньою половиною. Ми можемо уявити це як колекцію root + left complete tree + right complete tree. Якщо висота оригінального дерева дорівнює h, то висота лівої є h - 1та правої є h - 2. Тож рівняння стає

n = 1 + f(h-1) + f(h-2) (1)

Ми хочемо вирішити вище для f(h-1)виражених як у термінахn

f(h-2) = 2^(h-2) - 1 = (2^(h-1)-1+1)/2 - 1 = (f(h-1) - 1)/2 (2)

Використовуючи вищевказане в (1), маємо

n = 1 + f(h-1) + (f(h-1) - 1)/2 = 1/2 + 3*f(h-1)/2

=> f(h-1) = 2*(n-1/2)/3

Звідси O (2n / 3)


9
Чи не f (h) = 2 ^ (h + 1) - 1?
a_fan

Відмінна відповідь. Будь ласка, виправте f (h), як згадав @afnrf
Ajay

2

Додати до відповіді Свена. Як (2k + 1) / (3k + 2) прагне до 3/3, коли k прагне до нескінченності,

Lim_ (k -> inf) (2k + 1) / (3k + 2) = Lim_ (k -> inf) k (2 + 1 / k) / k (3 + 2 / k) = Lim_ (k -> inf) ) (2 + 1 / k) / (3 + 2 / k)

застосуйте ліміт, і ви отримаєте 2/3


2

Кількість вузлів на -

  • рівень 0 тобто корінь 2 ^ 0
  • рівень 1 дорівнює 2 ^ 1
  • рівень 2 - 2 ^ 2
  • ...
  • рівень n дорівнює 2 ^ n

Підсумовування всіх вузлів від рівня 0 до рівня n,

  • S = 2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ n

З правила підсумовування геометричних рядів ми це знаємо

  • x ^ 0 + x ^ 1 + x ^ 2 + ... + x ^ (n) = (x ^ (n + 1) - 1) / (x-1)

Підставивши x = 2, отримаємо

  • S = 2 ^ (n + 1) - 1. тобто 2 ^ (n + 1) = S + 1

Оскільки 2 ^ (n + 1) - це загальна кількість вузлів на рівні n + 1, ми можемо сказати, що кількість вузлів з 0 дочірніми одиницями більше, ніж кількість вузлів з 2 дітьми.

Тепер давайте розрахуємо кількість вузлів у лівому піддереві, правому дереві та загальному ..

  • Припустимо, що кількість нелистових вузлів у лівому піддереві кореня = k.
  • Згідно з вищезазначеними міркуваннями, кількість листових вузлів у лівому піддереві або корені = k + 1. Кількість нелистових вузлів у правому піддереві кореня = k, оскільки дерево називається рівно наполовину заповненим.

  • Загальна кількість вузлів у лівому піддереві кореня = k + k + 1 = 2k +

  • Загальна кількість вузлів у дереві, n = (2k + 1) + k + 1 = 3k + 2.
  • Співвідношення вузлів у лівому піддереві та загальних вузлах = (2k + 1) / (3k + 2), яке обмежене вище на 2/3.

Ось причина сказати, що дитячі піддерева мають розмір не більше 2n / 3.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.