Neben Macneils Punkten ...
Rot-Schwarz-Bäume sind möglicherweise direkter nützlich, da es nützliche effiziente Operationen gibt, die in Standard-Bibliotheksimplementierungen wie C ++ nicht allgemein unterstützt werden std::map
(zumindest AFAIK) . Rot-schwarze Bäume können "splitten" (Schneiden eines Baums in zwei, wobei einer Schlüssel weniger als einen angegebenen Schlüssel enthält und einer Schlüssel größer ist) und "verbinden" (umgekehrt, indem ein Baum mit großen Schlüsseln mit einem Baum mit kleinen Schlüsseln kombiniert wird) unterstützen keys) können beide in O (log n) -Zeit ausgeführt werden, aber wenn diese in Standardcontainerbibliotheken unterstützt werden, scheint dies eine gut versteckte Sache zu sein.
Das "Erweitern" von Datenstrukturen ist jedoch üblich. Ein einfaches Beispiel ist das Hinzufügen von Informationen zur Teilbaumgröße zu Knoten in nahezu jeder Baumdatenstruktur, um die Subskription von O (log n) zu unterstützen. Anspruchsvollere Beispiele umfassen Intervallbäume.
Sobald Sie die Idee haben, Datenstrukturen zu erweitern, gibt es viele Variationen, die für bestimmte Anwendungen nützlich sein können - und nur sehr wenige sind als Bibliothek vorab verpackt erhältlich. Bestehende Datenstrukturen von Standardbibliotheken (z. B. std::map
) können nicht erweitert werden, ohne den Quellcode zu kopieren und direkt zu ändern. Sie können sie nicht mithilfe von Vorlagenparametern erweitern.
Um eine erweiterte Datenstruktur zu entwickeln, müssen Sie die zugrunde liegende nicht erweiterte Datenstruktur verstehen.
AVL-Bäume können schneller sein als rot-schwarze Bäume, wenn Sie viel häufiger suchen als Einfügen / Löschen (und vorausgesetzt, Sie benötigen diese Aufteilungs- / Verknüpfungsoperationen nicht). Abhängig von der Anwendung sind sie daher möglicherweise eine sehr gute Basis für vermehrend.