Drzewa AVL i PRAWDZIWY świat

14

w szkole uczymy się, jak balansować drzewo AVL po wstawieniu lub usunięciu.

W jaki sposób ten rodzaj wiedzy będzie przydatny w prawdziwym świecie? Czy ktoś może podać przykład, kiedy ten rodzaj wiedzy byłby rzeczywiście przydatny?

Z tego, co widziałem, w miejscu pracy takie szczegóły rzadko się pojawiają ...

Widzę, jak szczegółowa wiedza na temat algorytmów i niektórych struktur danych może być ważna, ale nie takie szczegóły, jak rotacje drzewa AVL (i podobne szczegółowe pojęcia).

dzięki!

rrazd
źródło
7
Jest to pomocne w wywiadach, jeśli liczy się to jako prawdziwy świat.
Kevin
Jest to ten sam argument, który niektórzy ludzie wypowiadają się na temat uczenia się trygonometrii w szkole „Sheesh! Kiedy kiedykolwiek będę tego używać w prawdziwym życiu?”, A odpowiedź brzmi: „pomyślałeś, jak przeanalizować i rozwiązać całą klasę problemu” . Tego i pewnego dnia chcesz wyciąć drzewo, a twój partner pyta: „Jesteś pewien, że to nie uderzy w dom?” Uruchom na ratunek!
Binary Worrier

Odpowiedzi:

13

Badanie drzew AVL może być pomocne z następujących powodów:

  • To świetna praktyka do wnioskowania o danych abstrakcyjnych. Nie musisz myśleć o jednym konkretnym drzewie, musisz rozważyć każdą możliwość. Ćwiczenie z tego rodzaju rozumowaniem może pomóc w prostszych przypadkach.

  • To świetna praktyka do zrozumienia predykatów i umów. Zapewnienie, że drzewo jest zrównoważone, a narzędzia używane do udowodnienia zachowania każdej operacji zachowały równowagę, można np. Zastosować do problemów bezpieczeństwa i do kodu równoległego.

  • Umożliwia pisanie własnych wariantów, a nawet tworzenie całkowicie nowych typów struktur danych.

  • Być może będziesz musiał zaimplementować drzewo AVL dla nowej biblioteki lub platformy.

Możesz omówić szczególne zalety uczenia się każdego rodzaju algorytmu sortowania lub każdego rodzaju zrównoważonego drzewa. Tak naprawdę nie ma znaczenia, które z nich kończysz się uczyć, ale powinieneś mieć pewność, że uzyskasz pełne omówienie najważniejszych tematów.

Jeśli chcesz zobaczyć, jak ważna jest znajomość algorytmów w prawdziwym świecie, przeczytaj „ How Kill a Great Idea! ”, Artykuł w Inc o upadku Friendstera i jak najmniejsze zastosowanie podstawowych zasad w celu poprawy wydajności mogło im pomóc.

Macneil
źródło
Ciekawy artykuł, ale nie widzę, jak drzewa AVL pomogłyby Friendsterowi.
Eratosthenes
Chciałbym zobaczyć przykład, jak do indeksowania bazy danych używane są drzewa B +.
Luca Fülbier
5

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.

Steve314
źródło
1
+1 za rozszerzanie struktury danych, choć jest to dość rzadkie. Większość programistów nie musi dążyć do wydajności (w innym przypadku wszyscy używalibyśmy C ++ / C / Fortran / Assembly).
Matthieu M.,
@Matthieu - Wierzę, że jest to powszechne, ale tylko w niektórych rodzajach środowisk programistycznych. To nie jest sprzeczność, szczerze mówiąc, bo ... cholera, cóż ...
Steve314
W pełni się zgadzam! : D
Matthieu M.
5

Nie

To naprawdę nie jest przydatne w prawdziwym świecie ...

Z wyjątkiem tego, żebyś myślał .

W prawdziwym świecie występują znacznie trudniejsze problemy , z których wiele nie ma jeszcze dobrze znanych rozwiązań.

Steven A. Lowe
źródło