Ich habe eine Datenbank von Benutzern mit ihren Benutzernamen und IDs. Dies sind die Operationen, die Programm verarbeiten:Binary Search Tree mit 2 Schlüsseln
insert
, delete
(von username
), search
(von username
), print
(druckt alle Benutzer Informationen, sortiert nach ihrer id
)
Zeitkomplexität von ersten drei Operationen shouldn nicht mehr als O(log n)
und für den Druck sollte es O(n)
sein. Lösung sollte mit einem ausgewogenen BST implementiert werden.
Meine Idee, das Problem zu lösen, ist zu 2 BST zu haben, der Schlüssel von einem ist id
und für einen anderen ist username
. So können wir auf ein Element mit ihrem Namen oder ihrer ID sowohl in O (log n) -Zeit zugreifen. Dies verdoppelt jedoch Speicherplatz und Betriebszeit.
Gibt es eine Möglichkeit, Elemente sowohl durch ihre username
und id
in O(log n)
Zeit auf eine bessere Weise als das, was ich erklärte, zuzugreifen?
Die Verwendung eines einfachen Arrays schlägt fehl, wenn Sie einen Benutzer löschen müssen, da die resultierende Schiebeoperation "O (n)> O (log n)" ist –
Nicht wahr, wenn Sie es richtig machen. Verschieben Sie das Array nicht. Verknüpfen Sie die Slots mit den gelöschten Einträgen in einer freien Liste und verwenden Sie sie (zusammen mit den zugehörigen IDs) für neue Inserts erneut. Dies war eine sehr übliche Technik, als Speicher teurer war als heute. Der Platz, der für mein Schema benötigt wird, kann leicht viermal geringer sein als für zwei separate rot-schwarze Bäume aufgrund von Overhead für Knoten, Flags, 8-Byte-Zeigern (anstelle von 4-Byte-Array-Indizes) usw. – Gene
Wenn Sie das garantieren können wird der Fall sein und daran denken, gelöschte Einträge, die noch nicht gefüllt wurden, zu überspringen, dann könnte dies eine sehr gute Lösung sein ... –