Was Sie verlangen, ist aufgrund Ihrer Einschränkungen möglich.
Analyse
Die Stärke einer Hash-Tabelle liegt in ihrer schnellen Suche und Einfügegeschwindigkeit. Um diese Geschwindigkeit zu erreichen, muss man jeden Anschein von Ordnung in der Tabelle aufgeben: dh alle Einträge sind durcheinander. Es ist akzeptabel, eine Liste als Tabelleneintrag zu verwenden, da die Listen, während die Durchquerung O (n) ist, dazu neigen, kurz zu sein, vorausgesetzt, die Hash-Tabelle ist ausreichend groß und die in der Tabelle gespeicherten Objekte werden unter Verwendung eines Hash-Algorithmus guter Qualität gehasht.
Ein binärer Suchbaum (BST) hat eine schnelle Einfügung und Suche bei O (log 2 n). Außerdem werden die gespeicherten Elemente eingeschränkt: Es muss eine Möglichkeit geben, die Elemente zu ordnen. Bei zwei im Baum gespeicherten Elementen A und B muss festgestellt werden können, ob A vor B steht oder ob sie eine äquivalente Reihenfolge haben.
Eine Hash-Tabelle unterliegt keiner solchen Einschränkung: Elemente in einer Hash-Tabelle müssen zwei Eigenschaften haben. Erstens muss es eine Möglichkeit geben, festzustellen, ob sie gleichwertig sind. Zweitens muss es eine Möglichkeit geben, einen deterministischen Hash-Code zu berechnen. Bestellung ist keine Voraussetzung.
Wenn Ihre Hash-Tabellenelemente eine Reihenfolge haben, können Sie eine BST als Hash-Tabelleneintrag verwenden, um Objekte mit demselben Hash-Code (Kollisionen) zu speichern. Aufgrund einer BST mit O (log 2 n) -Suche und Einfügung ist der schlechteste Fall für die gesamte Struktur (Hash-Tabelle plus BST) jedoch technisch besser als die Verwendung einer Liste als Tabelleneintrag. Abhängig von der BST-Implementierung wird mehr Speicher als eine Liste benötigt, aber wahrscheinlich nicht viel mehr.
Bitte beachten Sie, dass der Overhead und das Verhalten eines BST in realen Situationen normalerweise nichts als Hash-Tabellen-Buckets auf den Tisch bringen , weshalb die theoretisch schlechte Leistung einer Liste akzeptabel ist. Mit anderen Worten, die Hash-Tabelle gleicht die Schwäche der Liste aus, indem weniger Elemente in jede Liste (Bucket) eingefügt werden. Das Problem stellte jedoch ausdrücklich fest, dass die Hash-Tabelle nicht größer werden kann und Kollisionen häufiger auftreten als in einer Hash-Tabelle üblich.
Implementierung
Ich werde hier keinen Code einfügen, weil es ehrlich gesagt nicht wirklich notwendig ist und Sie sowieso keine Sprache angegeben haben.
Ich würde einfach die Standard-Hash-Tabelle, die die Standardbibliothek Ihrer Sprache enthält, in eine neue Klasse kopieren und dann den Tabellen-Bucket-Typ von einer Liste in einen Baum ändern. Abhängig von der Sprache und der Standardbibliothek kann dies sehr trivial sein.
Normalerweise würde ich das Kopieren und Einfügen einer solchen Codierung nicht befürworten. Es ist jedoch eine einfache Möglichkeit, sehr schnell eine kampferprobte Datenstruktur zu erhalten .