Jaka jest średnia wysokość drzewa binarnego?

10

Czy istnieje formalna definicja średniej wysokości drzewa binarnego?

Mam pytanie instruktażowe dotyczące znalezienia średniej wysokości drzewa binarnego przy użyciu następujących dwóch metod:

  1. Naturalnym rozwiązaniem może być przyjęcie średniej długości wszystkich możliwych ścieżek od korzenia do liścia

    avh1(T)=1# leaves in Tv leaf of Tdepth(v).

  2. Inną opcją jest zdefiniowanie go rekurencyjnie, to znaczy średnia wysokość dla węzła to średnia ponad średnich wysokości poddrzewa plus jeden, to znaczy

    avh2(N(l,r))=avh2(l)+avh2(r)2+1

    z dla liści orazavh2(l)=1lavh2(_)=0 dla pustych miejsc.

Na podstawie mojego obecnego zrozumienia, na przykład średniej wysokości drzewa T

    1    
   / \
  2   3
 /
4

jest według drugiej metody, która wykorzystuje rekurencję.avh2(T)=1.25

Nadal jednak nie rozumiem, jak zrobić ten pierwszy. jest niepoprawny.avh1(T)=(1+2)/2=1.5

Ponadczasowy
źródło
1
Czy możesz podać jakiś kontekst? Nie ma czegoś takiego jak „poprawna” definicja matematyczna; możesz zdefiniować „średnią wysokość drzewa binarnego”, jak chcesz. (Średnia z czego w jakiej dystrybucji ?) Ale różne definicje będą mniej lub bardziej przydatne dla różnych aplikacji.
JeffE,
@JeffE "Nie jest od razu oczywiste, jak zdefiniować średnią wysokość drzewa binarnego. Być może najbardziej naturalnym rozwiązaniem może być określenie średniej długości możliwych ścieżek od korzenia do liścia. Prostsze (być może nawet uproszczone) rozwiązanie to powiedzieć, że średnia wysokość dla węzła jest średnią ponad średnich wysokości poddrzewa plus jeden. Wypełniasz łatwiej kodować tę alternatywę. Czy możesz podać przykłady, aby wykazać różnicę? ”
Ponadczasowy,
Starałem się, aby twój post był bardziej przejrzysty, podając precyzyjne definicje dwóch wariantów. Sprawdź, czy poprawnie zinterpretowałem Twój tekst. W szczególności brakowało ci kotwicy dla drugiego wariantu; to, czy bierzesz liście, aby mieć wysokość jeden, czy zero, robi różnicę.
Raphael

Odpowiedzi:

3

Nie ma powodu sądzić, że obie definicje opisują tę samą miarę. Możesz rekurencyjnie napisać avh 1 :avh1

avh1(N.(l,r))=lv(l)(zavh1(l)+1)+lv(r)(zavh1(r)+1)lv(l)+lv(r)

z dla liści l . Jeśli nie wierzysz, że to jest to samo, rozwiń definicję avh 1 po prawej stronie lub wykonaj dowód indukcyjny.avh1(l)=0lavh1

Teraz widzimy, że działa zupełnie inaczej niż avh 2 . Podczas gdy avh 2 waży równomiernie wysokości rekurencyjne dzieci węzłów (dodając i dzieląc przez dwa), avh 1 waży je zgodnie z liczbą zawartych w nich liści. Są więc takie same (modulo the anchor) dla drzew zrównoważonych liśćmi, co jest zrównoważone w tym sensie, że rodzeństwo ma tyle samo liści. Jeśli uprościsz rekurencyjną formę avh 1 za pomocą lv ( l ) = lv ( r )avh1avh2)avh2)avh1avh1lv(l)=lv(r)jest to natychmiast widoczne. Jednak na niezrównoważonych drzewach są one inne.

Twoje obliczenia są rzeczywiście poprawne (biorąc pod uwagę Twoją definicję); zauważ, że przykładowe drzewo nie jest zrównoważone liśćmi.

Raphael
źródło
Czy to możliwe, aby wyświetlić kod implementacyjny dla , nie do końca wiem, jak to zrobić rekurencyjnieavh1
Ponadczasowy
avh1
Mam na myśli kod implementacyjny wykorzystujący rekurencję
Timeless
@ null: Możesz skopiować formułę prawie dosłownie , pod warunkiem, że uwzględnisz przypadek podstawowy. To, jak to zrobić, zależy dokładnie od języka programowania i implementacji drzewa. Sugeruję wzięcie rekurencji do przepełnienia stosu, jeśli implementacja jest dla Ciebie przeszkodą.
Raphael
2

Edycja: Jeffe ma rację w swoim komentarzu powyżej. Prawdopodobnie powinieneś przeczytać „poprawny kontra nieprawidłowy” w następującej odpowiedzi jako „wygodny / spójny kontra niespójny”.

Wygląda na to, że twoje drugie obliczenie jest nieprawidłowe. Niech wysokość poddrzewa z pojedynczym węzłem (tj. Liściem) będzie wynosić 0. Następnie wysokość korzenia poddrzewa przy:

  • wysokość przy 4 wynosi 0
  • wysokość przy 3 wynosi 0
  • wysokość przy 2 oznacza średnią wysokość przy 3 + 1 = 0 + 1 = 1
  • wysokość przy 1 jest średnią wysokości przy 2 i 3 = (0 + 1) / 2 + 1 = 1,5

Myślę, że poprawnie wykonujesz pierwsze obliczenia, a 1.5 to właściwa odpowiedź.

Joe
źródło
chodzi o węzeł zerowy o wysokości -1, oparty na drugim podejściu, średnia wysokość węzła to średnia z poddrzewa plus 1, średnia wysokość węzła 4 to ((-1) + (- 1)) / 2 + 1 = 0 , średnia wysokość węzła 2 wynosi (0 + (- 1)) / 2 + 1 = 0,5, a zatem średnia wysokość korzenia wynosi 1,25.
Ponadczasowy,
@ null Możesz to zdefiniować w ten sposób, jeśli nalegasz, ale wtedy dwie definicje nie będą spójne.
Joe