Ich habe mich über diese Frage gewundert, seit ich Student war. Es ist eine allgemeine Frage, aber ich werde sie im Folgenden anhand von Beispielen erläutern.
Ich habe viele Algorithmen gesehen - zum Beispiel für Probleme mit maximalem Durchfluss kenne ich 3 Algorithmen, die das Problem lösen können: Ford-Fulkerson, Edmonds-Karp & Dinic, wobei Dinic die beste Komplexität aufweist.
Für Datenstrukturen - zum Beispiel Heaps - gibt es Binärheaps, Binomialheaps und Fibonacci-Heaps, wobei Fibonacci-Heaps die beste Gesamtkomplexität aufweisen.
Was mich verwirrt, ist: Gibt es Gründe, warum wir sie alle kennen müssen? Warum nicht einfach lernen und sich mit der besten Komplexität vertraut machen?
Ich weiß, dass es das Beste ist, wenn wir sie alle kennen. Ich möchte nur wissen, ob es "zutreffendere" Gründe gibt. Einige Probleme / Algorithmen können nur mit A , nicht aber mit B usw. gelöst werden .
Antworten:
Irgendwann wartet ein Lehrbuch mit dem Arbeitstitel Datenstrukturen, Algorithmen und Kompromisse auf Sie . Nahezu jeder Algorithmus oder jede Datenstruktur, die Sie wahrscheinlich im Grundstudium lernen, verfügt über einige Funktionen, die es für einige Anwendungen besser machen als für andere.
Nehmen wir als Beispiel das Sortieren, da jeder mit den Standardsortieralgorithmen vertraut ist.
Zunächst einmal ist Komplexität nicht das einzige Problem. In der Praxis spielen konstante Faktoren eine Rolle, weshalb (sagen wir) die schnelle Sortierung in der Regel häufiger verwendet wird als die Heap-Sortierung, obwohl die schnelle Sortierung im schlimmsten Fall eine schreckliche Komplexität aufweist.
In anderen Fällen können Ideen aus einem Algorithmus oder einer Datenstruktur auf ein spezielles Problem angewendet werden. Die Blasensortierung scheint auf echter Hardware immer langsamer zu sein als die Einfügungssortierung, aber die Idee, einen Blasendurchlauf durchzuführen, ist manchmal genau das, was Sie brauchen.
Betrachten Sie beispielsweise eine Art 3D-Visualisierung oder ein Videospiel auf einer modernen Grafikkarte, bei der Sie Objekte aus Leistungsgründen in der Reihenfolge von der nächsten zur Kamera bis zur entferntesten zur Kamera zeichnen möchten Wenn Sie die genaue Bestellung nicht erhalten, kümmert sich die Hardware darum. Wenn Sie sich in der 3D-Umgebung bewegen, ändert sich die relative Reihenfolge der Objekte zwischen den Bildern nicht wesentlich. Daher kann es sinnvoll sein, für jedes Bild einen Bubble-Pass durchzuführen. (Die Source-Engine von Valve bewirkt dies für Partikeleffekte.)
Es gibt Persistenz, Parallelität, Cache-Lokalität, Skalierbarkeit auf einem Cluster / einer Cloud und eine Vielzahl anderer möglicher Gründe, warum eine Datenstruktur oder ein Algorithmus besser geeignet sein kann als ein anderer, selbst wenn Sie für die von Ihnen gewünschten Vorgänge dieselbe Komplexität in der Berechnung haben.
Dies bedeutet jedoch nicht, dass Sie sich für alle Fälle eine Reihe von Algorithmen und Datenstrukturen merken sollten. Der größte Teil des Kampfes besteht darin zu erkennen, dass es einen Kompromiss gibt, der ausgenutzt werden muss, und zu wissen, wo man suchen muss, wenn man denkt, dass etwas angemessen ist.
quelle
Abgesehen von der Tatsache, dass es unzählige Kostenfaktoren (Laufzeit, Speichernutzung, Cache-Fehler, Verzweigungsfehler, Implementierungskomplexität, Durchführbarkeit der Überprüfung ...) für unzählige Maschinenmodelle (TM, RAM, PRAM, ...) gibt. Neben Abwägungen zwischen Durchschnitt und Worst-Case gibt es häufig auch funktionelle Unterschiede, die über den Rahmen der Grundlehrbuchspezifikation hinausgehen.
Einige Beispiele:
Es sind auch didaktische Überlegungen anzustellen:
quelle
In der realen Welt arbeiten Sie wahrscheinlich irgendwann an Software, die von einem Team anderer Leute geschrieben wurde. Einige dieser Software wurde geschrieben, bevor Sie geboren wurden!
Um die verwendeten Algorithmen / Datenstrukturen zu verstehen, ist es sehr hilfreich, eine große Anzahl von Algorithmen / Datenstrukturen zu kennen, einschließlich Optionen, die nicht mehr als „Stand der Technik“ gelten.
Sie müssen auch an Algorithmen arbeiten, die nicht dem Standard entsprechen und nur in der Anwendung verwendet werden, an der Sie arbeiten. Wenn Sie diese Algorithmen verbessern müssen, werden Sie feststellen, dass Ihr Gehirn mit nützlichen Methoden zur Verbesserung von Algorithmen gefüllt ist, da Sie untersucht haben, wie andere Menschen Algorithmen verbessert haben.
Dies unterscheidet jemanden, der Informatik studiert hat, von jemandem, der gerade das Programmieren gelernt hat. In den meisten Arbeitsplätzen habe ich gearbeitet in hat es Zeit , als studierte Informatik mit mir ein Problem lösen könnte , dass ein „von Büchern gelernt“ Programmierer konnte nicht, aber 95% der Zeit fand ich , dass studierte Informatik mit gab mir keinen Vorteil über andere erfahrene Programmierer .
quelle
Viele Leute haben zu Recht erwähnt, dass es oft keinen besten Algorithmus gibt - es hängt von der Situation ab.
Es besteht auch die Möglichkeit, dass Sie eines Tages auf eine ungewohnte Situation stoßen. Je mehr Algorithmen Sie kennen, desto größer ist die Wahrscheinlichkeit, dass Sie einen kennen, der beinahe eine Lösung darstellt, die Sie als Basis verwenden können.
quelle
Viele großartige Antworten, nur etwas, von dem ich denke, dass es fehlt, obwohl Raffaels Antwort dies etwas erwähnt.
Die einfache Implementierung muss ebenfalls berücksichtigt werden.
Bei Sortieralgorithmen ist dies normalerweise kein Problem, da auf den meisten Plattformen / Sprachen bereits ein Algorithmus implementiert ist (und häufig besser ist als das, was Sie tun könnten), aber ungewöhnlichere Algorithmen sind möglicherweise nicht verfügbar.
Abhängig von Ihrem Problem benötigen Sie möglicherweise nicht den absolut besten Algorithmus, wenn die Implementierungszeit 1 Tag gegenüber 2 Wochen beträgt.
quelle