AVL Trees und die ECHTE Welt

14

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!

rrazd
quelle
7
In Interviews ist es hilfreich, wenn das als die reale Welt zählt.
Kevin
Dies ist die gleiche Argumentation, die einige Leute über das Erlernen der Trigonometrie in der Schule vertreten: "Meine Güte! Wann werde ich das jemals im wirklichen Leben anwenden?" . Und eines Tages möchtest du einen Baum fällen und dein Partner fragt: "Bist du sicher, dass das nicht das Haus treffen wird?" Trig zur Rettung!
Binary Worrier

Antworten:

13

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.

Macneil
quelle
Interessanter Artikel, aber ich sehe nicht, wie AVL-Bäume Friendster geholfen hätten.
Eratosthenes
Ich hätte mir ein Beispiel gewünscht, wie B + -Bäume für die Datenbankindizierung verwendet werden.
Luca Fülbier
5

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.

Steve314
quelle
1
+1 für das Erweitern der Datenstruktur, obwohl dies sehr selten vorkommt. Die meisten Programmierer müssen sich nicht um Leistung bemühen (ansonsten würden wir alle C ++ / C / Fortran / Assembly verwenden).
Matthieu M.
@Matthieu - Ich glaube, es ist üblich, aber nur in bestimmten Arten von Entwicklungsumgebungen. Das ist kein Widerspruch, ehrlich, denn ... ähm, na ja ...
Steve314
Ich stimme vollkommen zu! : D
Matthieu M.
5

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.

Steven A. Lowe
quelle