Mit asymptotischer Analyse meine ich hier das Verhalten des Algorithmus, wenn die Größe der Eingabe unendlich wird.
Der Grund, warum wir die asymptotische Analyse verwenden, ist, dass
sie für die Vorhersage des Verhaltens von Algorithmen in der Praxis nützlich ist . Die Vorhersagen erlauben uns Entscheidungen zu treffen, zB wenn wir unterschiedliche Algorithmen für ein Problem haben, welches sollten wir verwenden? (Nützlich zu sein bedeutet nicht, dass es immer richtig ist.)
Dieselbe Frage kann über jedes vereinfachte Modell der realen Welt gestellt werden. Warum verwenden wir vereinfachte mathematische Modelle der realen Welt?
Denken Sie an Physik. Die klassische Newtonsche Physik ist bei der Vorhersage der realen Welt nicht so gut wie die relativistische Physik. Aber es ist ein Modell, das gut genug ist, um Autos, Wolkenkratzer, U-Boote, Flugzeuge, Brücken usw. zu bauen. Es gibt Fälle, in denen es nicht gut genug ist, z. B. wenn wir einen Satelliten bauen oder eine Raumsonde an Pluto senden oder die Bewegung vorhersagen möchten von massiven Himmelsobjekten wie Sternen und Planeten oder sehr schnellen Objekten wie Elektronen.
Es ist wichtig zu wissen, wo die Grenzen eines Modells liegen.
Dies ist normalerweise eine hinreichende Annäherung an die reale Welt.
In der Praxis sehen wir oft, dass ein Algorithmus mit besserer asymptotischer Analyse in der Praxis besser funktioniert. Es kommt selten vor, dass ein Algorithmus ein besseres asymptotisches Verhalten aufweist. Wenn die Eingaben also groß genug sind, können wir uns in der Regel auf die asymptotische Analyse als erste Vorhersage des Verhaltens des Algorithmus verlassen. Es ist nicht so, wenn wir wissen, dass die Eingaben klein sein werden. Abhängig von der gewünschten Leistung müssen wir möglicherweise eine genauere Analyse durchführen. Wenn wir beispielsweise Informationen über die Verteilung der Eingaben haben, die dem Algorithmus mitgeteilt werden, können wir eine genauere Analyse durchführen, um die Ziele zu erreichen, die wir haben (z. B. schnell auf 99) % der Eingänge). Der Punkt ist, als erster Schritt, die asymptotische Analyse ist ein guter Ausgangspunkt. In der Praxis sollten wir auch Leistungstests durchführen, aber bedenken Sie, dass dies auch seine eigenen Probleme hat.
In der Praxis ist die Berechnung relativ einfach.
Typischerweise können wir zumindest gute Grenzen für die asymptotische Komplexität eines Algorithmus berechnen. Der Einfachheit halber nehmen wir an, dass wir einen Algorithmus , der jeden anderen Algorithmus bei jeder Eingabe übertrifft. Wie können wir wissen, dass besser ist als andere? Wir können asymptotische Analysen durchführen und feststellen, dassA AAAAhat eine bessere asymptotische Komplexität. Was ist in allen Eingaben besser als das andere? Dann wird es kniffliger und hängt davon ab, was uns wichtig ist. Interessieren uns große oder kleine Eingaben? Wenn wir uns um große Eingaben kümmern, ist es nicht üblich, dass ein Algorithmus eine bessere asymptotische Komplexität aufweist, sich jedoch bei großen Eingaben, die uns wichtig sind, am schlechtesten verhält. Wenn wir uns mehr für kleine Eingaben interessieren, ist eine asymptotische Analyse möglicherweise nicht so nützlich. Wir sollten die Laufzeit der Algorithmen auf Eingaben vergleichen, die uns interessieren. In der Praxis ist eine asymptotische Analyse für komplizierte Aufgaben mit komplizierten Anforderungen möglicherweise nicht so nützlich. Für einfache Grundprobleme, die in Algorithmus-Lehrbüchern behandelt werden, ist es sehr nützlich.
Kurz gesagt ist asymptotische Komplexität eine relativ einfach zu berechnende Approximation der tatsächlichen Komplexität von Algorithmen für einfache Grundaufgaben (Probleme in einem Algorithmenlehrbuch). Wenn wir kompliziertere Programme erstellen, ändern sich die Leistungsanforderungen und werden komplizierter, und die asymptotische Analyse ist möglicherweise nicht so nützlich.
Es ist gut, die asymptotische Analyse mit anderen Ansätzen zu vergleichen, um die Leistung von Algorithmen vorherzusagen und zu vergleichen. Ein gängiger Ansatz sind Leistungstests anhand von Zufalls- oder Benchmark-Eingaben. Dies ist häufig der Fall, wenn die Berechnung der asymptotischen Komplexität schwierig oder nicht durchführbar ist, z. B. wenn wir Heuristiken wie die SAT-Lösung verwenden. Ein anderer Fall ist, wenn die Anforderungen komplizierter sind, z. B. wenn die Leistung eines Programms von externen Faktoren abhängt und unser Ziel möglicherweise darin besteht, dass auf 99% der Websites eine zeitlich begrenzte Aktualisierung der Benutzeroberfläche durchgeführt wird Eingänge.
Beachten Sie jedoch, dass die Leistungsanalyse auch Probleme mit sich bringt. Es gibt keine mathematischen Anhaltspunkte für die Leistung bei weniger. Wir führen den Leistungstest tatsächlich für alle Eingaben durch, die an den Algorithmus gegeben werden (oft rechnerisch nicht umsetzbar) (und es ist oft nicht möglich, zu entscheiden, dass einige Eingaben niemals gegeben werden). Wenn wir mit einer Zufallsstichprobe oder einem Benchmark testen, gehen wir implizit von einer gewissen Regelmäßigkeit in Bezug
auf die Leistung der Algorithmen aus, dh der Algorithmus wird bei anderen Eingaben, die nicht Teil des Leistungstests waren, eine ähnliche Leistung erbringen.
Das zweite Problem bei Leistungstests ist, dass sie von der Testumgebung abhängen. Das heißt, die Leistung eines Programms wird nicht allein durch die Eingaben bestimmt, sondern durch äußere Faktoren (z. B. Maschinentyp, Betriebssystem, Effizienz des codierten Algorithmus, Auslastung der CPU, Speicherzugriffszeiten usw.), von denen einige zwischen verschiedenen Durchläufen variieren können der Test auf der gleichen Maschine. Auch hier gehen wir davon aus, dass die bestimmten Umgebungen, in denen Leistungstests durchgeführt werden, der tatsächlichen Umgebung ähnlich sind, es sei denn, wir führen die Leistungstests in allen Umgebungen durch, in denen das Programm ausgeführt werden kann (und wie können wir vorhersagen, auf welchen Computern eine Sortierung ausgeführt werden könnte Algorithmus in 10 Jahren an?).
Vergleichen Sie diese mit der Berechnung der asymptotischen Laufzeit von say MergeSort ( ) und vergleichen Sie sie mit der Laufzeit von say SelectionSort ( ) oder BinarySerch ( ) mit LinearSearch ( ).Θ ( n 2 ) Θ ( lg n ) O ( n )Θ(nlgn)Θ(n2)Θ(lgn)O(n)