In der Schule wird uns beigebracht, wie wir einen AVL-Baum beim Einfügen oder Löschen balancieren können.
Wie wird diese Art von Wissen in der realen Welt wirklich nützlich sein? Kann jemand ein Beispiel geben, wann diese Art von Wissen tatsächlich nützlich wäre?
Nach allem, was ich am Arbeitsplatz gesehen habe, tauchen solche Details so gut wie nie auf ...
Ich kann sehen, wie wichtig detaillierte Kenntnisse über Algorithmen und einige Datenstrukturen sein können, aber nicht solche Details wie AVL-Baumrotationen (und ähnliche detaillierte Konzepte).
Vielen Dank!
algorithms
data-structures
rrazd
quelle
quelle
Antworten:
Das Studium von AVL-Bäumen kann aus folgenden Gründen hilfreich sein:
Es ist eine großartige Methode, um über abstrakte Daten nachzudenken. Man muss nicht an einen bestimmten Baum denken, man muss jede Möglichkeit in Betracht ziehen. Das Üben mit dieser Art von Argumentation kann auch in einfacheren Fällen hilfreich sein.
Es ist eine großartige Übung, um Prädikate und Verträge zu verstehen. Stellen Sie sicher, dass ein Baum ausgeglichen ist, und die Tools, mit denen Sie den Erhalt des Gleichgewichts für jede Operation nachweisen, können z. B. auf Sicherheitsbedenken und auf parallelen Code angewendet werden.
Es ermöglicht Ihnen, Ihre eigenen Varianten zu schreiben oder sogar völlig neue Arten von Datenstrukturen zu erstellen.
Möglicherweise müssen Sie einen AVL-Baum für eine neue Bibliothek oder Plattform implementieren.
Sie können die besonderen Vorzüge des Lernens jeder Art von Sortieralgorithmus oder jeder Art von ausgeglichenem Baum diskutieren. Es ist eigentlich egal welche Sie am Ende lernen, aber Sie sollten sicher sein, dass Sie die wichtigsten Themen vollständig behandeln.
Wenn Sie sehen möchten, wie wichtig es ist, Algorithmen in der realen Welt zu kennen, lesen Sie " How to Kill a Great Idea! ", Einen Artikel in Inc über den Untergang von Friendster, und wie ihnen die geringste Anwendung grundlegender Prinzipien zur Verbesserung der Effizienz hätte helfen können.
quelle
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.
quelle
Nein
Es ist wirklich nicht nützlich in der realen Welt ...
Nur um Sie zum Nachdenken zu bringen .
Die reale Welt hat viel schwierigere Probleme , von denen viele noch keine bekannten Lösungen haben.
quelle