Zalety binarne drzewo poszukiwań ponad Hash Tables

głosy
81

Jakie są zalety binarne drzewo poszukiwań nad stołami hash?

Tabele hash może wyszukać dowolny element Theta (1) czas i to jest tak proste, aby dodać element .... ale nie jestem pewien z zalet dzieje na odwrót.

Utwórz 08/11/2010 o 23:06
źródło użytkownik
W innych językach...                            


20 odpowiedzi

głosy
70

One „zaleta” binarnego drzewa jest to, że może on być przesuwany do listy wyłączyć wszystkie elementy w kolejności. To nie jest niemożliwe z tabeli mieszania, ale nie jest to normalna operacja jeden projekt w strukturze zakodowanej.

Odpowiedział 08/11/2010 o 23:11
źródło użytkownik

głosy
9

Hashtable zajęłoby więcej miejsca, kiedy to po raz pierwszy stworzył - będzie miał dostępne gniazda dla elementów, które mają jeszcze zostać włożona (czy nie są one kiedykolwiek włożona), wyszukiwanie binarne drzewo będzie tylko tak duża, jak to musi być. Również, gdy hash-table potrzebuje więcej miejsca, rozszerzając do innej struktury mogłoby być czasochłonne, ale może zależeć od realizacji.

Odpowiedział 08/11/2010 o 23:11
źródło użytkownik

głosy
76

Pamiętaj, że binarne drzewo poszukiwań (reference-based) to pamięć efektywny. Nie zarezerwować więcej pamięci niż muszą.

Na przykład, jeśli funkcja hash ma zasięg R(h) = 0...100, to trzeba przydzielić tablicę 100 elementów (wskaźników-TO), nawet jeśli to tylko mieszania 20 elementów. Jeśli było użyć wyszukiwarki binarne drzewo do przechowywania tych samych informacji, jakich można przydzielić tylko tyle miejsca, jak to potrzebne, jak również niektóre metadane dotyczące powiązań.

Odpowiedział 08/11/2010 o 23:11
źródło użytkownik

głosy
6

Binarne drzewo jest wolniejszy, aby szukać i wstawić, ale ma bardzo miłą cechę przechodzenie Infix który w istocie oznacza, że ​​można iterację węzłach drzewa w posortowanych.

Iteracja wpisów z tabeli mieszania po prostu nie ma wiele sensu, ponieważ wszystkie one są rozproszone w pamięci.

Odpowiedział 08/11/2010 o 23:13
źródło użytkownik

głosy
8

Przeszukanie drzewo binarne mogą być realizowane z przetrwałym interfejs, gdzie nowe drzewo jest zwracany, ale stare drzewo nadal istnieje. Wdrożone ostrożnie, stare i nowe drzewa akcji większość węzłów. Nie można tego zrobić za pomocą standardowego tabeli mieszania.

Odpowiedział 08/11/2010 o 23:19
źródło użytkownik

głosy
23

Główne zalety binarnego drzewa nad tabeli mieszania jest to, że drzewo binarne daje dwa dodatkowe czynności nie można zrobić (łatwo i szybko) z tabeli mieszania

  • znaleźć element najbliżej (niekoniecznie równe) jakiejś arbitralnej wartości klucza (lub najbliżej powyżej / poniżej)

  • iterację zawartości drzewa posortowanych

Dwa są połączone - drzewo binarne zachowuje swoją zawartość w posortowanych, więc rzeczy, które wymagają, aby kolejność posortowane są łatwe do zrobienia.

Odpowiedział 08/11/2010 o 23:25
źródło użytkownik

głosy
14

A (zrównoważony) binarne drzewo poszukiwań ma również tę zaletę, że jego asymptotycznej złożoności jest rzeczywiście górną granicę, natomiast „Constant” czasy dla tabel hash są amortyzowane razy: Jeśli masz nieodpowiedniego funkcji skrótu, może skończyć się rozkładające do czasu linearnego zamiast stałej.

Odpowiedział 08/11/2010 o 23:29
źródło użytkownik

głosy
1

Jeśli chcesz uzyskać dostęp do danych w uporządkowany sposób, a następnie lista posortowana ma być utrzymana równolegle do tablicy mieszającej. Dobrym przykładem jest słownik w .NET. (patrz http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).

Ma to efekt uboczny nie tylko spowolnienie wkładek, ale zużywa większą ilość pamięci niż B-drzewa.

Ponadto, ponieważ b-tree jest posortowana, to jest proste, aby znaleźć zakresy wyników, lub do wykonywania związków lub scala.

Odpowiedział 08/11/2010 o 23:34
źródło użytkownik

głosy
48

Oprócz wszystkich innych dobrych komentarzy:

Hash stoły w ogóle mają lepsze zachowanie cache wymagającą mniej pamięci odczytuje porównaniu do binarnego drzewa. Dla tabeli mieszania normalnie ponieść tylko jeden odczyt przed masz dostęp do odniesienia trzyma swoje dane. Drzewo binarne, jeśli jest to wariant zrównoważony, wymaga czegoś w kolejności k * lg (n) pamięci brzmi dla pewnej stałej k.

Z drugiej strony, jeśli wróg zna swoją funkcję hash-wróg może egzekwować swoje tabeli mieszania do kolizji, co znacznie utrudnia jego wydajność. Rozwiązaniem jest, aby wybrać funkcję hash-losowo z rodziny, ale BST nie posiada tej wady. Również, gdy ciśnienie tabeli mieszania rośnie zbyt dużo, często mają tendencję do enlargen i realokacji tabeli mieszania, które mogą być kosztowna operacja. BST ma prostszą zachowanie tutaj i nie wydają się nagle przeznaczyć dużo danych i wykonać operację hashuje.

Drzewa mają tendencję do ostatecznego Uśrednioną strukturę danych. Mogą one działać jako listy można łatwo podzielić do pracy równoległej mają szybkie usunięcie, wstawienie i wyszukiwanie jest rzędu O (log n) . Robią nic szczególnie dobrze, ale oni nie mają żadnego albo nadmiernie złe zachowanie.

Wreszcie BSTS są znacznie łatwiejsze do wdrożenia w (czysty) Języki funkcjonalne w porównaniu do hash-tabel i nie wymagają one destrukcyjne aktualizacje mają zostać wdrożone (the wytrwałość argument Pascal powyżej).

Odpowiedział 09/11/2010 o 01:01
źródło użytkownik

głosy
-1

Główną zaletą tabeli mieszania jest to, że ma prawie wszystkie ops w ~ = O (1). I jego bardzo łatwe do zrozumienia i wdrożenia. Czyni rozwiązać wiele problemów „wywiadzie” skutecznie. Więc jeśli u chcą złamać wywiad kodowania, uczynić najlepszych przyjaciół z tabeli mieszania ;-)

Odpowiedział 05/04/2011 o 00:45
źródło użytkownik

głosy
4

BSTS także zapewnić „findPredecessor” i operacji „findSuccessor” (aby znaleźć następny najmniejsze i największe elementy obok) w O (logn) czasu, który może być również bardzo poręczne operacji. Tabela mieszania nie mogą zapewnić w tym oszczędność czasu.

Odpowiedział 20/09/2012 o 18:55
źródło użytkownik

głosy
1

To także zależy od zastosowania, Hash pozwala zlokalizować dokładne dopasowanie. Jeśli chcesz zapytać o zasięgu następnie BST jest wybór. Załóżmy, że masz dużo danych E1, E2, E3 ..... en.

Z tabeli mieszania można zlokalizować każdy element w stałym czasie.

Jeśli chcesz znaleźć zakres wartości większe niż E41 i mniej niż E8, BST można szybko znaleźć to.

Kluczową sprawą jest funkcja hash używany w celu uniknięcia kolizji. Oczywiście, nie możemy całkowicie uniknąć kolizji, w tym przypadku mamy uciekania się do połączeń łańcuchowych lub innymi metodami. To sprawia, że ​​odbierający nie stały czas w najgorszych przypadkach.

Po pełnym, stolik hash musi zwiększyć swój rozmiar wiadro i skopiować wszystkie elementy ponownie. Jest to dodatkowy koszt nie prezentujemy nad BST.

Odpowiedział 29/01/2013 o 15:54
źródło użytkownik

głosy
94

Jedną z zalet, że nikt inny nie zauważył, że binarne drzewo poszukiwań pozwala na wykonywanie wyszukiwań zasięgu efektywnie.

W celu zilustrowania mój pomysł, chcę zrobić skrajny przypadek. Powiedzmy, że chcesz, aby wszystkie elementy, których klucze są w zakresie od 0 do 5000. I rzeczywiście istnieje tylko jeden taki element i 10000 innych elementów, których klucze nie są w tym zakresie. BST można zrobić wyszukiwania zakres dość skutecznie, gdyż nie przeszukiwać poddrzewo które jest niemożliwe, aby mieć odpowiedź.

Natomiast, w jaki sposób można zrobić wyszukiwania klasy w tabeli mieszania? Albo trzeba iteracyjne każdą przestrzeń wiadro, która jest O (n), albo trzeba szukać, czy każdy z 1,2,3,4 ... do 5000 istnieje. (Co z kluczami między 0 a 5000 jest zbiorem nieskończonym? Na przykład klawisze mogą być dziesiętne)

Odpowiedział 11/11/2013 o 01:05
źródło użytkownik

głosy
0

Tabeli mieszania jest nieuporządkowana struktura danych podczas projektowania telefonu komórkowego, aby zachować jak dużo danych, jak to możliwe dostępna do przechowywania danych. Tabeli mieszania jest nieuporządkowana struktura danych - co oznacza, że ​​nie przechowuje jej elementów w określonej kolejności. Tak więc, jeśli użyć tabeli hash do książki adresowej telefonu komórkowego, to będzie potrzebować dodatkowej pamięci do sortowania wartości bo na pewno trzeba do wyświetlania wartości w kolejności alfabetycznej - to książka adresowa po wszystkim. Tak więc, przy użyciu tabeli mieszania trzeba odstawić pamięć do sortowania elementów, które mają być w przeciwnym razie byłyby wykorzystywane jako miejsca do przechowywania. Ale binarne drzewo poszukiwań jest posortowana dane structure.Because wyszukiwanie binarne drzewo jest już posortowane, nie będzie trzeba tracić pamięć lub czas przetwarzania sortowania rekordów w telefonie komórkowym. Jak już wspomniano wcześniej, robi odnośnika lub wkładkę na binarnym drzewie jest wolniejszy niż robi to z tabeli mieszania, ale książka adresowa telefon komórkowy prawie nigdy nie będzie mieć ponad 5000 wpisów. Przy tak małej liczby zgłoszeń, o poszukiwania binarnego drzewa (log (n)) z pewnością będzie wystarczająco szybki. Tak więc, biorąc pod uwagę wszystkie te informacje, wyszukiwanie binarne drzewo jest struktura danych, które należy użyć w tym scenariuszu, ponieważ jest to lepszy wybór niż tabeli mieszania.

Odpowiedział 26/12/2013 o 17:40
źródło użytkownik

głosy
0

Hash Tables nie są dobre do indeksowania. Gdy szukasz zakresie, BSTS są lepsze. To jest powód, dlaczego większość indeksów bazy danych użyć b + drzew zamiast Hash Tables

Odpowiedział 05/04/2015 o 17:34
źródło użytkownik

głosy
4

Od Cracking kodowaniu wywiadzie 6 Edition

Możemy realizować tabeli mieszania ze zrównoważonym binarne drzewo poszukiwań (BST). Daje nam to O (log n) czas wyszukiwania. Zaletą jest to potencjalnie używając mniej miejsca, ponieważ nie musimy już przeznaczyć dużą tablicę. Możemy również iterację kluczy w porządku, co może być przydatne czasami.

Odpowiedział 29/05/2016 o 18:47
źródło użytkownik

głosy
-1

Klasy Hashset i stołowe są zbiory nieuporządkowane. To nie jest oczywiste z interfejsu (a mogło być inaczej), ale stoliki hash zostały zaimplementowane przy użyciu AVL drzew. Oznacza to, że kod skrótu nie zmniejsza modulo tablicy kolizji (mniej), a to oznacza, że nie ma hashuje tablicy być wykonane (płynne wydajność). Fakt, że są zbiory nieuporządkowane oznacza, że tylko dostarczyć równa funkcję i funkcję hashCode - nie jest pełną comparer jak dla drzew. Tak czy użyć stół hash <K, T> lub binarne drzewo <K, T> zależy od klasy K - czy jest to w pełni porównywalne lub tylko równość porównywalne.

Istnieją sytuacje, gdy typ danych jest zarówno porównywalne i równość porównywalna - jak String. Oznacza to, że HashSet <String> i Set <String> są zarówno możliwe. Wyszukiwania na zbiorze hash łańcuchów wydają się być około 10 razy szybciej niż wyszukiwań w uporządkowanym zbiorze ciągów. Jeżeli komparator jest droższe niż drzewa spowalniają porównaniu HashTables. Jeżeli komparator jest szybki, (jak dla liczb całkowitych i pływaki), a następnie drzew będzie działał szybciej niż tabele hash.

Odpowiedział 19/08/2017 o 03:24
źródło użytkownik

głosy
0

HashMap jest zestaw asocjacyjna. Więc swoją tablicę wartości wejściowych dostaje połączono w wiadrach. W otwartym schemacie adresowania, masz wskaźnik do wiadra, a za każdym razem dodać nową wartość do wiadra, dowiedzieć się, gdzie w morzu są jeszcze wolne miejsca. Istnieje kilka sposobów na to- rozpocząć na początku wiadra i przyrost wskaźnika za każdym razem, i sprawdzić, czy jego zajęte. To się nazywa liniowy sondowania. Następnie można zrobić binarne przeszukiwanie takiego dodatku, gdzie dwukrotność różnicy między początkiem wiadra i gdzie za każdym razem jesteś szukając wolnego miejsca podwoić lub z powrotem w dół. To się nazywa kwadratowa sondowania. OK. Teraz problemy w obu tych metod jest to, że jeśli wiadro przelewa się kolejnych wiader adres, to trzeba To-

  1. Podwójne każdy wiadra size- malloc (N wiadra) / zmienić skrót funk- wymagany czas: zależy od implementacji malloc
  2. Przelew / kopiować każdego z wcześniejszymi danymi łyżki do nowych danych wiadra. Jest to O (N), gdzie N reprezentuje operację cały dane

OK. ale jeśli używasz LinkedList nie powinien być taki problem, prawda? Tak, W połączonych listach nie ma tego problemu. Biorąc pod uwagę każde wiadro zacząć połączonej listy, a jeśli masz 100 elementów w wiaderku to wymaga przemierzać te 100 elementów, aby dotrzeć do końca LinkedList stąd List.add (Element E) będzie wymagało czasu To-

  1. Hash element do A wiadro Normalna jak we wszystkich implementacjach
  2. Poświęć trochę czasu, aby znaleźć ostatni element we wspomnianym wiadro O (n) operacji.

Zaletą wdrożenia LinkedList jest to, że nie trzeba operację alokacji pamięci i O (N) przelew / kopie wszystkich wiader, jak w przypadku otwartej implementacji adresowania.

Tak, tak, aby zminimalizować O (n) operacji jest konwersja wdrożenie do tego z binarne drzewo poszukiwań gdzie znaleźć operacje O (log (n)) i dodać element w swoim położeniu w oparciu o jego wartość. Dodana cecha BST jest to, że chodzi sortowane!

Odpowiedział 20/08/2017 o 23:24
źródło użytkownik

głosy
0

Binarne drzewo poszukiwań są dobrym wyborem do realizacji słownika jeśli klucze mieć jakiś całkowity porządek (klawisze są porównywalne) zdefiniowanego na nich i chcesz, aby zachować informacje o zamówieniu.

Jak BST zachowuje informacje o zamówieniach, zapewnia ona z czterech dodatkowych operacji dynamiczny zestaw, który nie może być wykonywane (efektywnie) przy użyciu tabel mieszania. Operacje te są następujące:

  1. Maksymalny
  2. Minimum
  3. Następca
  4. Poprzednik

Wszystkie te operacje, takie jak każdej operacji BST ma złożoność czasową O (h). Dodatkowo wszystkie zapisane klucze pozostają klasyfikowane w BST dzięki czemu może uzyskać posortowane sekwencję klawiszy tylko przez przejeżdżające w drzewo na zamówienie.

Podsumowując, jeśli chcesz to operacje wstawiania, usuwania i usunąć następnie tablica mieszająca jest nie do pobicia (przez większość czasu) w wydajności. Ale jeśli chcesz dowolne lub wszystkie czynności wymienione powyżej was powinien użyć BST, korzystnie samobalansujący BST.

Odpowiedział 19/05/2018 o 16:46
źródło użytkownik

głosy
0

Binarne drzewo poszukiwań może być szybsze w przypadku korzystania z kluczami tekstowymi. Zwłaszcza, gdy struny są długie.

Drzewa binarne wyszukiwania przy użyciu porównań dla mniej / większy które są szybkie na smyczki (gdy nie są równe). Więc BST można szybko odpowiedzieć, gdy ciąg nie zostanie znaleziony. Kiedy znalazł to trzeba zrobić tylko jeden pełny porównanie.

W tabeli mieszania. Trzeba obliczyć hash ciąg, a to oznacza, że ​​trzeba przejść przez wszystkich bajtów, co najmniej raz do obliczania hash. Potem znowu, gdy wpis zostanie znaleziony.

Odpowiedział 13/10/2018 o 11:32
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more