Oprócz punktów Macneils ...
Czerwono-czarne drzewa mogą być bardziej bezpośrednio przydatne, ponieważ istnieją przydatne wydajne operacje, które nie są szeroko obsługiwane w standardowych implementacjach bibliotek, takich jak C ++ std::map
(przynajmniej AFAIK). Czerwono-czarne drzewa mogą obsługiwać „podział” (cięcie drzewa na dwa, jeden zawierający klucze mniejsze niż określony klucz, a drugi zawierający klucze większe) i „łączyć” (odwrotnie, łącząc drzewo dużych kluczy z drzewem małych klucze) można wykonać zarówno w czasie O (log n), ale jeśli są one obsługiwane w standardowych bibliotekach kontenerów, wydaje się, że jest to dobrze ukryta rzecz.
Jednak „rozszerzanie” struktur danych jest powszechne. Prostym przykładem jest dodanie informacji o rozmiarze poddrzewa do węzłów w prawie każdej strukturze danych drzewa w celu obsługi indeksowania O (log n). Bardziej zaawansowane przykłady obejmują drzewa interwałów.
Gdy wpadniesz na pomysł rozszerzenia struktur danych, istnieje wiele odmian, które mogą być przydatne w określonych aplikacjach - a bardzo niewiele jest dostępnych w pakiecie jako biblioteka. Istniejących struktur danych biblioteki standardowej (np. Takich jak std::map
) nie można rozszerzyć poza kopiowaniem kodu źródłowego i modyfikowaniem go bezpośrednio - nie można go rozszerzyć za pomocą parametrów szablonu.
Oczywiście, aby opracować rozszerzoną strukturę danych, musisz zrozumieć leżącą u jej podstaw nie rozszerzoną strukturę danych.
Drzewa AVL mogą być szybsze niż drzewa czerwono-czarne, jeśli wykonujesz dużo więcej operacji wyszukiwania niż wstawianie / usuwanie (i pod warunkiem, że nie potrzebujesz tych operacji dzielenia / łączenia), więc w zależności od aplikacji mogą być bardzo dobrą bazą dla powiększanie.