Vorteile von binären Suchbäume über Hash Tables

stimmen
81

Was sind die Vorteile von binären Suchbäumen über Hash-Tabellen?

Hash-Tabellen können ein beliebiges Element in Theta (1) Zeit schauen und es ist genauso einfach ein Element hinzuzufügen .... aber ich bin nicht sicher, der Vorteile in die andere Richtung um.

Veröffentlicht am 08/11/2010 um 23:06
quelle vom benutzer
In anderen Sprachen...                            


20 antworten

stimmen
70

Ein „Vorteil“ eines binären Baum ist, dass es alle Elemente, um zur Liste ab verfahren werden kann. Dies ist mit einer Hash-Tabelle nicht unmöglich, aber ist kein normaler Betrieb ein Design in eine Hash-Struktur.

Beantwortet am 08/11/2010 um 23:11
quelle vom benutzer

stimmen
9

Eine Hash - Tabelle würde mehr Platz in Anspruch nehmen , wenn es zum ersten Mal erstellt wird - es verfügbare Slots für die Elemente hat , die noch eingeführt werden (ob sie jemals eingesetzt werden), eine binäre Baumsuche wird nur so groß sein , wie es braucht , um Sein. Auch wenn eine Hash-Tabelle mehr Platz benötigt, auf einem andere Struktur erweitern könnte zeitaufwändig sein, aber das könnte bei der Umsetzung abhängen.

Beantwortet am 08/11/2010 um 23:11
quelle vom benutzer

stimmen
76

Denken Sie daran, dass Binary Search Trees (Referenz-basierte) sind speichereffizient. Sie behalten uns nicht mehr Speicher als sie müssen.

Wenn beispielsweise eine Hash - Funktion einen Bereich hat R(h) = 0...100, dann müssen Sie eine Reihe von 100 (Zeiger-to) Elemente zuzuweisen, selbst wenn man nur 20 Elemente sind Hashing. Wenn Sie einen binären Suchbaum zu verwenden , sind die gleichen Informationen zu speichern, würden Sie nur so viele Speicherplatz zuweisen , wie Sie benötigt wird , sowie einige Metadaten über Links.

Beantwortet am 08/11/2010 um 23:11
quelle vom benutzer

stimmen
6

Ein binärer Baum ist langsamer zu suchen und einfügen in, hat aber die sehr schöne Eigenschaft des Infix-Traversal, die im Wesentlichen bedeutet, dass Sie durch die Knoten des Baumes in einer sortierten Reihenfolge durchlaufen können.

Iterieren durch die Einträge eines Hash-Tabelle macht einfach nicht viel Sinn, weil sie alle im Speicher verstreut sind.

Beantwortet am 08/11/2010 um 23:13
quelle vom benutzer

stimmen
8

Ein binärer Suchbaum kann mit einer implementiert wird persistent Schnittstelle, wo ein neuer Baum zurückgegeben wird , aber der alte Baum weiter zu existieren. Umgesetzt sorgfältig, die alten und neuen Bäume Aktien den größten Teil ihrer Knoten. Sie können dies nicht mit einer Standard - Hash - Tabelle.

Beantwortet am 08/11/2010 um 23:19
quelle vom benutzer

stimmen
23

Die wichtigsten Vorteile eines binären Baum über einen Hash-Tabelle ist, dass der binäre Baum Sie zwei zusätzliche Operationen gibt können Sie nicht (einfach, schnell) tun mit einer Hash-Tabelle

  • finden Sie das Element am nächsten (nicht notwendigerweise gleich) einen beliebigen Schlüsselwert (oder am nächsten oben / unten)

  • iterieren durch den Inhalt des Baumes in sortierter Reihenfolge

Die beiden sind verbunden - der binäre Baum hält seinen Inhalt in einer sortierten Reihenfolge, so dass Dinge, die sortierten Reihenfolge erfordern, sind einfach zu tun.

Beantwortet am 08/11/2010 um 23:25
quelle vom benutzer

stimmen
14

A (symmetrisch) binärer Suchbaum hat auch den Vorteil, dass seine asymptotische Komplexität ist eigentlich eine obere Grenze, während die „Konstante“ Zeiten für Hash-Tabellen amortisieren Zeiten sind: Wenn Sie eine ungeeignete Hash-Funktion haben, könnten Sie zu dem linearen Zeit am Ende abbau , anstatt konstant.

Beantwortet am 08/11/2010 um 23:29
quelle vom benutzer

stimmen
1

Wenn Sie die Daten in einer sortierten Weise zugreifen möchten, dann hat eine sortierte Liste parallel zu der Hash - Tabelle beibehalten werden. Ein gutes Beispiel ist Wörterbuch in .Net. (siehe http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).

Dies hat den Nebeneffekt, nicht nur verlangsamt Einsätze, aber es verbraucht eine größere Menge an Speicher als ein B-Baum.

Da ferner ein B-Baum sortiert ist, ist es einfach, Bereiche der Ergebnisse zu finden oder Gewerkschaften oder verschmilzt auszuführen.

Beantwortet am 08/11/2010 um 23:34
quelle vom benutzer

stimmen
48

Zusätzlich zu all den anderen gut Kommentare:

Hash - Tabellen haben im Allgemeinen eine bessere Cache - Verhalten erfordert weniger Speicher liest im Vergleich zu einem binären Baum. Für eine Hash - Tabelle entstehen Sie in der Regel nur einen einzigen lesen , bevor Sie Zugriff auf eine Referenz haben Halten Sie Ihre Daten. Der binäre Baum, wenn es sich um eine ausgewogene Variante ist, erfordert etwas in der Größenordnung von k * lg (n) Speicher liest für eine Konstante k.

Auf der anderen Seite, wenn ein Feind Ihre Hash-Funktion kennt, kann der Feind Ihre Hash-Tabelle erzwingen Kollisionen zu machen, seine Leistung erheblich erschwert. Die Abhilfe ist die Hash-Funktion zufällig aus einer Familie zu wählen, aber ein BST hat diesen Nachteil nicht. Auch wenn der Hash-Tabelle Druck zu viel wächst, neigen Sie dazu, oft enlargen und die Hash-Tabelle neu zuweisen, die eine teuere Operation sein können. Das BST hat einfacheres Verhalten hier und neigt nicht plötzlich eine große Datenmenge zu verteilen und einen Aufguß Betrieb zu tun.

Bäume sind in der Regel die ultimative durchschnittliche Datenstruktur sein. Sie können als Listen wirken, kann leicht für den Parallelbetrieb aufgeteilt werden, müssen schnelle Entfernung, Insertion und Lookup in der Größenordnung von O (lg n) . Sie tun nichts besonders gut, aber sie haben kein allzu schlechtes Verhalten nicht.

Schließlich BSTs viel einfacher zu implementieren sind in (rein) funktionalen Sprachen im Vergleich zu Hash-Tabellen und sie benötigen keine destruktive Updates implementiert (die werden Persistenz von Pascal obige Argument).

Beantwortet am 09/11/2010 um 01:01
quelle vom benutzer

stimmen
-1

Hauptvorteil der Hash-Tabelle ist, dass es fast alle ops in ~ = O (1). Und es ist sehr leicht zu verstehen und umzusetzen. Es tut löst effektiv viele „Interview Probleme“. Also, wenn u eine Codierung Interview knacken wollen, machen die besten Freunde mit Hash-Tabelle ;-)

Beantwortet am 05/04/2011 um 00:45
quelle vom benutzer

stimmen
4

BSTs bieten auch die „findPredecessor“ und „findSuccessor“ Operationen in O (log n) Zeit, was sehr praktisch Operationen könnten auch (auf die nächste kleinste und nächstgrößere Elemente zu finden). Hash-Tabelle kann in dieser Zeit nicht Effizienz bieten.

Beantwortet am 20/09/2012 um 18:55
quelle vom benutzer

stimmen
1

Es hängt auch von der Verwendung, Hash ermöglicht genaue Übereinstimmung zu finden. Wenn Sie einen Bereich abfragen wollen, dann ist BST die Wahl. Angenommen, Sie haben eine Menge Daten e1, e2, e3 ..... en.

Mit Hash-Tabelle können Sie jedes Element in konstanter Zeit finden.

Wenn Sie Bereichswerte größer als e41 finden wollen und weniger als e8 kann BST schnell, dass finden.

Das Wichtigste ist, die Hash-Funktion verwendet, um eine Kollision zu vermeiden. Natürlich können wir nicht völlig um eine Kollision zu vermeiden, in diesem Fall werden wir auf Verkettungs oder andere Methoden zurückgreifen. Dies macht Abruf nicht mehr konstant Zeit im schlimmsten Fall.

Einmal voll, hat Hash-Tabelle wieder seine Eimer Größe und kopieren Sie über alle Elemente zu erhöhen. Dies ist ein zusätzlich Kosten nicht BST präsentieren über.

Beantwortet am 29/01/2013 um 15:54
quelle vom benutzer

stimmen
94

Ein Vorteil, dass sonst niemand klargestellt hat, ist, dass binäre Suchbaum können Sie Bereich Suche effizient zu tun.

Um meine Idee zu illustrieren, möchte ich einen Extremfall machen. Sagen Sie bitte alle Elemente, deren Schlüssel zwischen 0 bis 5000. Und tatsächlich gibt es nur ein solches Element und 10000 andere Elemente, deren Schlüssel nicht im Bereich erhalten möchten. BST kann sehr effizient Bereich sucht tun, da es nicht einen Teilbaum durchsucht, was unmöglich ist, die Antwort zu haben.

Während, wie kann man tun Bereich sucht in einer Hash-Tabelle? Sie müssen entweder jeden Eimer Raum zu durchlaufen, die O (n) ist, oder Sie haben zu suchen, ob jeder von 1,2,3,4 ... bis zu 5000 existiert. (Was ist mit den Tasten zwischen 0 und 5000 ist eine unendliche Menge? Zum Beispiel Tasten Dezimalzahlen sein können)

Beantwortet am 11/11/2013 um 01:05
quelle vom benutzer

stimmen
0

Eine Hash-Tabelle ist eine ungeordnete Datenstruktur, wenn ein Handy entwerfen, wollen Sie so viele Daten wie möglich zur Verfügung für die Datenspeicherung zu halten. Eine Hash-Tabelle ist eine ungeordnete Datenstruktur - was bedeutet, dass es nicht in einer bestimmten Reihenfolge ihre Elemente nicht halten. Also, wenn Sie eine Hash-Tabelle für ein Handy-Adressbuch verwenden, dann würden Sie zusätzliche Speicher benötigen, um die Werte zu sortieren, weil Sie auf jeden Fall die Werte müßten in alphabetischer Reihenfolge angezeigt werden - es ist ein Adressbuch, nachdem alle. Also, durch eine Hash-Tabelle verwenden, haben Sie Speicher beiseite legen Elemente zu sortieren, die sonst als Stauraum genutzt werden würde. Aber binäre Suchbaum ist eine sortierte Daten structure.Because ein binärer Suchbaum bereits sortiert ist, wird es keine Notwendigkeit, den Speicher oder Verarbeitungszeit Sortieren von Datensätzen in einem Handy zu verschwenden. Wie wir bereits erwähnt, auf einem binären Baum ein Nachschlagen oder einen Einsatz zu tun ist langsamer als es mit einer Hash-Tabelle zu tun, aber ein Adressbuch Handy wird fast nie mehr als 5.000 Einträge. Mit solch einer kleinen Anzahl von Einträgen, ein binärer Suchbaum des O (log (n)) wird auf jeden Fall schnell genug sein. Also, da all diese Informationen, ein binärer Suchbaum ist die Datenstruktur, die Sie in diesem Szenario verwenden sollten, da es eine bessere Wahl als eine Hash-Tabelle ist.

Beantwortet am 26/12/2013 um 17:40
quelle vom benutzer

stimmen
0

Hash-Tabellen sind nicht gut für die Indizierung. Wenn Sie für einen Bereich suchen, sind BSTs besser. Das ist der Grund, warum die meisten Datenbank-Indizes verwenden B + Bäume statt Hash Tables

Beantwortet am 05/04/2015 um 17:34
quelle vom benutzer

stimmen
4

Von Cracking the Coding Interview, 6. Auflage

Wir können die Hash-Tabelle mit einem ausgewogenen binären Suchbaum (BST) implementieren. Dies gibt uns eine O (lügt n) Lookup Zeit. Der Vorteil dabei ist, mit potenziell weniger Platz, da wir nicht mehr ein großes Array zuweisen. Wir können auch über die Tasten, um durchlaufen, die manchmal nützlich sein kann.

Beantwortet am 29/05/2016 um 18:47
quelle vom benutzer

stimmen
-1

Die Klassen HashSet und Tabelle sind ungeordnete Sammlungen. Es ist nicht offensichtlich von der Schnittstelle (und könnte auf andere Weise) , aber Hash - Tabellen wurden mit AVL - Bäumen umgesetzt. Dies bedeutet , dass der Hash - Code wird nicht durch den modulo eines Arrays reduziert (weniger Kollisionen) und es bedeutet auch , dass es kein Aufguß eines Arrays durchgeführt (glattere Leistung) werden. Die Tatsache , dass sie ungeordnete Sammlungen sind , bedeutet , dass Sie nur eine Gleichheitsfunktion und eine hashCode Funktion liefern - keine vollen comparer wie für Bäume. Egal, ob Sie eine Hash - Tabelle Tabelle mit <K, T> oder einem binären Baum Baum <K, T> , hängt von der Klasse K - ob vollständig vergleichbar oder nur Gleichheit vergleichbar ist.

Es gibt Gelegenheiten, bei denen der Datentyp beide vergleichbar und Gleichheit vergleichbar ist - wie String. Dies bedeutet, dass HashSet <String> und Set <String> beides ist möglich. Sucht auf einer Hash-Menge von Strings ist in der Regel etwa 10-mal schneller als Suche auf einer geordneten Menge von Strings sein. Wenn der Komparator teuer ist dann langsam Bäume im Vergleich zu HashTables nach unten. Wenn der Komparator schnell ist, (wie für ganze Zahlen und Schwimmer), dann Bäume schneller als Hash-Tabellen ausgeführt werden.

Beantwortet am 19/08/2017 um 03:24
quelle vom benutzer

stimmen
0

Ein hashmap ist ein Set assoziative Array. So wird Ihr Array von Eingabewerten in Eimern gesammelt. In einem offenen Adressierungsschema, haben Sie einen Zeiger auf einen Eimer, und jedes Mal, wenn Sie einen neuen Wert in einen Eimer hinzufügen, können Sie herausfinden, wo in den Eimern dort Freiräume sind. Es gibt ein paar Möglichkeiten, this- Sie beginnen am Anfang des Eimers und erhöhen den Zeiger jedes Mal und zu testen, ob sie besetzt zu tun. Dies wird linear Sondieren genannt. Dann können Sie eine binäre Suche wie add tun, wo Sie den Unterschied zwischen dem Beginn des Eimers verdoppeln und wo Sie verdoppeln oder wieder nach unten jedes Mal, wenn Sie für einen freien Platz suchen. Dies wird quadratisches Sondieren genannt. OK. Nun sind die Probleme in diesen beiden Methoden ist, dass, wenn der Eimer läuft über in den nächsten Eimer adressieren, dann müssen Sie to-

  1. Doppel jeder Eimer größen- malloc (N Eimer) / den Hash ändern funktions- Dauer: abhängig von malloc Implementierung
  2. Transfer / Kopieren Sie jede der früheren Eimer Daten in die neuen Eimer Daten. Dies ist ein O (N) -Operation wobei N die gesamten Daten darstellt

OK. aber wenn Sie eine LinkedList verwenden soll es nicht so ein Problem, nicht wahr? Ja, verkettete Listen Sie haben dieses Problem nicht. Betrachte man jeden Eimer mit einer verknüpften Liste zu beginnen, und wenn Sie 100 Elemente in einem Eimer haben es erfordert, dass Sie diese 100 Elemente zu durchqueren, um das Ende des LinkedList daher die List.add (Element E) Zeit to- zu erreichen nehmen

  1. Hash des Elements auf eine Eimer-Normale, wie in allen Implementierungen
  2. Nehmen Sie sich Zeit das letzte Element in dem Eimer-O (N) Betrieb zu finden.

Der Vorteil der LinkedList Implementierung ist, dass Sie nicht die Speicherzuordnungsoperation und O (N) Transfer / Kopie aller Eimer, wie im Fall der offenen Adressierung Implementierung benötigen.

So ist der Weg, um die O (N) Betrieb zu minimieren, ist die Umsetzung der von ein binärer Suchbaum zu konvertieren, wo Operationen finden sind O (log (N)) und das Element in seiner Position hinzufügen, basierend auf seinen Wert. Die zusätzliche Funktion eines BST ist, dass es sortiert kommt!

Beantwortet am 20/08/2017 um 23:24
quelle vom benutzer

stimmen
0

Binäre Suchbäume sind gute Wahl Wörterbuch zu implementieren, wenn die Tasten etwas totale Ordnung haben (Tasten sind vergleichbar) auf sie definiert und Sie die Reihenfolge Informationen zu erhalten.

Als BST die Auftragsinformationen erhält, bietet es Ihnen mit vier zusätzlichen dynamischen Set-Operationen, die nicht (effizient) durchgeführt werden kann Hash-Tabellen. Diese Operationen sind:

  1. Maximal
  2. Minimum
  3. Nachfolger
  4. Vorgänger

All diese Vorgänge wie jeder BST Betrieb haben Zeitkomplexität von O (H). Zusätzlich werden alle gespeicherten Schlüssel bleiben in der BST sortiert so dass Sie die sortierte Folge von Tasten bekommen nur durch den Baum in der Reihenfolge nach durchquert.

Zusammenfassend, wenn alles, was Sie wollen, ist Operationen einfügen, löschen und entfernen Sie dann Hash-Tabelle (die meiste Zeit) in der Leistung unschlagbar. Aber wenn Sie einige oder alle oben aufgeführten Verfahren Sie sollten ein BST, vorzugsweise ein selbstausgleich BST.

Beantwortet am 19/05/2018 um 16:46
quelle vom benutzer

stimmen
0

Binäre Suchbäume können schneller sein, wenn sie mit String-Schlüsseln verwendet. Vor allem, wenn Strings sind lang.

Binäre Suchbäume anhand von Vergleichen für weniger / mehr davon schnell für Streicher (wenn sie nicht gleich sind). So kann ein BST schnell antworten, wenn ein String nicht gefunden wird. Wenn es gefunden wird es braucht nur eine vollständigen Vergleich zu tun.

In einer Hash-Tabelle. Sie müssen den Hash der Zeichenfolge berechnen und dies bedeutet, dass Sie durch alle Bytes mindestens einmal den Hash zu berechnen, gehen müssen. Dann wieder, wenn ein passender Eintrag gefunden wird.

Beantwortet am 13/10/2018 um 11:32
quelle vom benutzer

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