Es gibt alle Arten von Gemischen. Sie haben Datenstrukturen, die nicht mit Algorithmen verknüpft sind, Algorithmen, die keine (realen) Datenstrukturen erfordern, aber meistens sind beide in einem Paket enthalten.
Bearbeiten: Wie @Doval richtig hervorhob, sind Datenstrukturen per se nicht mit Operationen verknüpft. Das Kombinieren von Datenstruktur und Algorithmus bildet einen abstrakten Datentyp.
Datenstrukturen ohne Algorithmen
Betrachten Sie zum Beispiel eine Datenstruktur zum Speichern von zweidimensionalen Koordinaten, die entsprechend aufgerufen wird Point
. Es gibt nicht viel in Bezug auf Algorithmen für einen Punkt zu tun und es ist wirklich nur ein Container für einen x
und y
Wert. Aufgrund dieser Datenstruktur können Sie jetzt natürlich alle möglichen Algorithmen hinzufügen (Entfernungsberechnung, konvexe Rümpfe, What-Have-You).
Sie können an viele Datenstrukturen denken, die einfach eine Ansammlung einzelner Daten sind. Während diese in der Praxis häufig vorkommen, sind sie kein gutes Lehrmaterial, da daraus nichts zu lernen ist, sobald Sie verstanden haben, dass einzelne Datenelemente in einer neuen Datenstruktur akkumuliert werden können (wie das, was Sie lernen) Point
Wenn ich Ihnen nach dem obigen Beispiel diese fantastische Datenstruktur mit dem Namen zur Verfügung stelle Point3D
, die das Gleiche für den dreidimensionalen Raum tun kann?)
Algorithmen ohne (reale) Datenstrukturen
"Real", weil offensichtlich jeder interessante Algorithmus primitive Datentypen wie Ganzzahlen oder Boolesche Werte benötigt und wir diese in diesem Zusammenhang nicht als Datenstrukturen betrachten möchten. Ähnlich wie oben sind diese Algorithmen typischerweise eher einfache. Insbesondere haben sie keinerlei komplizierten Zustand, da dieser normalerweise in eine Datenstruktur eingeht (siehe nächster Abschnitt).
Ein Beispiel für einen solchen Algorithmus wäre die Berechnung des größten gemeinsamen Teilers zweier Zahlen. Euklids Algorithmen für die GCD müssen eigentlich nur zwei ganze Zahlen enthalten und diese manipulieren.
Sobald die Dinge interessanter werden, betreten Sie jedoch sehr bald die Welt der abstrakten Datentypen. Beispielsweise basiert das Sieb von Eratosthenes auf einem Array. Wir könnten jetzt diskutieren, ob ein Array noch primitiv ist, oder ob eine Ganzzahl noch keine Datenstruktur ist. In jedem Fall sind Algorithmen, die vollständig ohne Datenstrukturen existieren, ziemlich langweilig, selbst wenn Sie ihre isolierte Existenz akzeptieren.
Algorithmen kombiniert mit Datenstrukturen, auch abstrakte Datentypen genannt
Dies sind die interessanten, aber aus zwei sehr unterschiedlichen Gründen. Normalerweise können Sie sich diesen aus zwei Richtungen nähern: Datenstruktur zuerst oder Algorithmus zuerst.
Während ein abstrakter Datentyp durch die Kombination von Datenstruktur + Algorithmen / Operationen definiert wird, betrachten wir sie häufig mit einem Fokus auf eine dieser beiden und betrachten die andere als Enabler.
Datenstruktur, dann Algorithmus
Sie werden auf abstrakte Datentypen stoßen, die recht einfach zu verwenden sind, jedoch mehr oder weniger komplizierte Algorithmen enthalten, damit sie intern funktionieren. Zum Beispiel ist a HashMap
trivial in der Verwendung, beinhaltet aber eine raffinierte Hash-Funktion und den Umgang mit den Hash-Kollisionen im Inneren. Aus Ihrer Sicht als Benutzer ist es Ihnen jedoch wichtig, dass Daten für Sie gespeichert werden, und nicht, dass etwas für Sie getan wird.
Im Gegensatz zur letzten Gruppe setzen diese Datenstrukturen ihre Benutzer diesen Algorithmen nicht aus. Sie müssen die HashMap
interne Hash-Funktion von a nicht kennen und sich auch nicht darum kümmern, um sie verwenden zu können. (Um es effektiv zu nutzen, möchten Sie vielleicht diese Dinge wissen;)
Algorithmus, dann Datenstruktur
Die andere Richtung bedeutet, dass Sie einen Algorithmus haben, den Sie einfach verwenden möchten, der jedoch intern Datenstrukturen benötigt, damit er wie beabsichtigt funktioniert. Ein Beispiel wäre ein BSP-Algorithmus (Binary Space Partitioning), den Sie einfach Point
aus einer großen Menge von Punkten, die einem bestimmten Abfragepunkt am nächsten liegen, zweidimensional abfragen können. Sie benötigen jedoch eine Baumstruktur (und sogar zusätzliche Algorithmen wie Entfernungsberechnungen) im Inneren, um den Algorithmus tatsächlich zu schreiben.
Im Allgemeinen kann man sagen, dass Algorithmen in dieser Gruppe involvierte Datenstrukturen für ihre interne Zustandsdarstellung verwenden. Ich würde argumentieren, dass diese Gruppe von Algorithmen am vielfältigsten ist und Sie viele, viele verschiedene finden, die zu diesem allgemeinen Schema passen. In Bezug auf die Sichtweise sehen wir diese als interessant an, da sie etwas (z. B. Sortieren) für uns tun und sich nicht so sehr um den Datenbestandsteil kümmern.
Eng verwandte Datenstrukturen und Algorithmen
Schließlich haben Sie Datenstrukturen, die sehr eng mit Algorithmen verwandt sind, die direkt mit ihnen korrespondieren. Ein typisches Beispiel ist ein binärer Baum, der, wenn Sie etwas Sinnvolles damit anfangen möchten, das Thema der Tree-Walking-Algorithmen auf sich zieht (Tiefe zuerst, Breite zuerst, was auch immer).
In diesen Fällen ändern wir den Fokus unserer Sicht auf die resultierenden abstrakten Datentypen von Zeit zu Zeit. Manchmal interessiert Sie die Struktur Ihres Baums, ein paar Minuten später möchten Sie eine Suchoperation ausführen, dann möchten Sie einen Knoten löschen und gleich wissen, wie die Struktur danach aussieht. Dies gilt zwar auch für die anderen obigen Abschnitte, ist jedoch nicht das Hauptaugenmerk, das Sie beim Speichern / Abrufen von Daten in / aus einer Map
oder beim Sortieren einer verknüpften Liste haben.