AVL i czerwono-czarne drzewa równoważą się samoczynnie, z wyjątkiem czerwonego i czarnego koloru w węzłach. Jaki jest główny powód wyboru czerwono-czarnych drzew zamiast drzew AVL? Jakie są zastosowania czerwonych czarnych drzew?
AVL i czerwono-czarne drzewa równoważą się samoczynnie, z wyjątkiem czerwonego i czarnego koloru w węzłach. Jaki jest główny powód wyboru czerwono-czarnych drzew zamiast drzew AVL? Jakie są zastosowania czerwonych czarnych drzew?
Odpowiedzi:
Jaki jest główny powód wyboru czerwono-czarnych drzew zamiast drzew AVL?
Zarówno drzewa czerwono-czarne, jak i drzewa AVL są najczęściej używanymi zrównoważonymi drzewami wyszukiwania binarnego i obsługują wstawianie, usuwanie i wyszukiwanie w gwarantowanych O(logN) time
. Istnieją jednak następujące punkty porównania między nimi:
O(N)
dodatkową przestrzeń. Jeśli jednak wiemy, że klucze, które zostaną wstawione do drzewa, będą zawsze większe od zera, możemy użyć bitu znaku kluczy do przechowywania informacji o kolorze czerwono-czarnego drzewa. Zatem w takich przypadkach czerwono-czarne drzewo nie zajmuje dodatkowej przestrzeni.Jakie jest zastosowanie czerwonego czarnego drzewa?
Drzewa czerwono-czarne są bardziej ogólnego przeznaczenia. Działają stosunkowo dobrze przy dodawaniu, usuwaniu i wyszukiwaniu, ale drzewa AVL mają szybsze wyszukiwania kosztem wolniejszego dodawania / usuwania. Drzewko czerwono-czarne wykorzystywane jest w:
java.util.TreeMap
,java.util.TreeSet
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
to nie jest prawda.
std:: map
a przyjaciele używają żadnej określonej struktury. Pozostało to do implementacji, chociaż libstdc ++ i Dinkumware używają przynajmniej czerwono-czarnych drzew i wydaje się, że masz rację w praktyce.
Spróbuj przeczytać ten artykuł
Zapewnia dobry wgląd w różnice, podobieństwa, wydajność itp.
Oto cytat z artykułu:
RB-Drzewa, podobnie jak drzewa AVL, równoważą się samoczynnie. Oba zapewniają wyszukiwanie O (log n) i wydajność wstawiania.
Różnica polega na tym, że RB-Drzewa gwarantują O (1) obrotów na operację wkładki. To właśnie kosztuje wydajność w rzeczywistych wdrożeniach.
Upraszczając, RB-Drzewa zyskują tę przewagę dzięki koncepcyjnemu byciu 2-3 drzewami bez przenoszenia narzutu dynamicznych struktur węzłów. Fizycznie RB-Drzewa są implementowane jako drzewa binarne, czerwone / czarne flagi symulują 2-3 zachowanie
O ile wiem, drzewa AVL i RB nie są zbyt odległe pod względem wydajności. Drzewo RB jest po prostu wariantem drzewa B, a równoważenie jest realizowane inaczej niż drzewo AVL.
Nasze zrozumienie różnic w wydajności poprawiło się przez lata i teraz głównym powodem używania czerwono-czarnych drzew zamiast AVL byłby brak dostępu do dobrej implementacji AVL, ponieważ są one nieco mniej powszechne, być może, ponieważ nie są objęte CLRS.
Oba drzewa są obecnie uważane za formy drzew o zrównoważonej randze, ale czerwono-czarne drzewa są konsekwentnie wolniejsze o około 20% w rzeczywistych testach . Lub nawet o 30-40% wolniej po wstawieniu danych sekwencyjnych .
Dlatego ludzie, którzy badali czerwono-czarne drzewa, ale nie drzewa AVL, wybierają drzewa czerwono-czarne. Główne zastosowania czerwono-czarnych drzew są szczegółowo opisane we wpisie w Wikipedii .
Inne odpowiedzi tutaj dobrze podsumowują zalety i wady drzew RB i AVL, ale ta różnica była szczególnie interesująca:
Drzewa AVL nie obsługują stałego zamortyzowanego kosztu aktualizacji [ale drzewa czerwono-czarne tak]
Źródło: Mehlhorn & Sanders (2008) (sekcja 7.4)
Tak więc, podczas gdy zarówno RB i AVL drzew zagwarantować O (log (n)) czas najgorszym przypadku odnośników, wstawiania i usuwania, przywracając własność AVL / RB po włożeniu lub usunięcie węzła można zrobić w czasie O (1) zamortyzowany czas dla czerwono-czarne drzewa.
Programiści na ogół nie lubią dynamicznie alokować pamięci. Problem z drzewem avl polega na tym, że dla "n" elementów potrzebujesz co najmniej log2 (log2 (n)) ... (height-> log2 (n)) bitów do przechowywania wysokości drzewa! Więc kiedy obsługujesz ogromne dane, nie możesz być pewien, ile bitów przeznaczyć na przechowywanie wysokości w każdym węźle.
Na przykład, jeśli używasz 4 bajtów int (32 bity) do przechowywania wysokości. Maksymalna wysokość może wynosić: 2 ^ 32, a więc maksymalna liczba elementów, które można przechowywać w drzewie to 2 ^ (2 ^ 32) - (wydaje się być bardzo duża, ale w obecnym wieku danych nic nie jest zbyt duże). Dlatego jeśli przekroczysz ten limit, musisz dynamicznie przydzielić więcej miejsca na przechowywanie wysokości.
To odpowiedź zasugerowana przez profesora z mojej uczelni, która wydała mi się rozsądna! Mam nadzieję, że mam sens.
Edycje: drzewa AVL są bardziej zrównoważone w porównaniu do czerwonych czarnych drzew, ale mogą powodować więcej obrotów podczas wstawiania i usuwania. Jeśli więc aplikacja wymaga wielu częstych wstawień i usunięcia, preferowane powinny być drzewa Red Black. A jeśli wstawienia i usunięcia są rzadsze, a wyszukiwanie jest częstszą operacją, to drzewo AVL powinno być preferowane przed drzewem Red Black. - Źródło GEEKSFORGEEKS.ORG
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Nie potrzebuję wysokości żadnego węzła w drzewie AVL, aby go zaimplementować. Potrzebujesz jednej dodatkowej informacji dla każdego węzła ( JESTEM NAJLEPSZY (rodzeństwo z najwyższym poddrzewem)); wygodniej i bardziej konwencjonalnie jest mieć dwa dodatkowe bity (dziecko jest wyższe dla lewego i prawego), jak przedstawiają AV i L.
Ponowne zbilansowanie drzewa AVL powinno spełniać poniższą właściwość. (Dokumentacja Wiki - Drzewo AVL )
W drzewie AVL wysokości dwóch poddrzew podrzędnych dowolnego węzła różnią się co najwyżej o jeden; jeśli w dowolnym momencie różnią się o więcej niż jeden, przeprowadzane jest równoważenie w celu przywrócenia tej właściwości.
Oznacza to, że całkowita wysokość drzewa AVL nie może zwariować, tj. Wyszukiwania będą lepsze z drzewami AVL. A ponieważ należy wykonać dodatkowe operacje (obroty), aby nie dopuścić do szaleństwa wysokości, operacje modyfikacji drzewa mogą być nieco kosztowne.