Die Big-O-Notation ist ein einheitenfreies Mittel für die Messung von Leistungsschwankungen und ist daher unempfindlich gegenüber den relativen Kosten von Rechenprimitiven.
Kurz gesagt: Die
Big O-Notation ist eine einheitfreie relative Messart (im Gegensatz zur absoluten Messung). Es kann nur Leistungsschwankungen messen, nicht die absolute Leistung, für die Konstanten eine große Rolle spielen. Der Vorteil besteht darin, dass die Implementierung weitgehend unabhängig ist, da eine einfachere Analyse möglich ist, bei der die relativen Kosten elementarer Operationen ignoriert werden können, sofern diese Kosten positive feste Ober- und Untergrenzen haben. Die Konsequenz ist jedoch, dass konstante Faktoren bedeutungslos sind . Die Analyse der asymptotischen Komplexität kann jedoch auch für den beabsichtigten Zweck aus anderen Gründen in Frage gestellt werden und muss sorgfältig abgewogen werden. Beispielsweise ist die unformatierte Eingabegröße möglicherweise nicht der richtige Parameter.
Eine erste Bemerkung ist, dass Ihre Frage nicht ganz richtig gestellt ist. Wenn Sie die Konstante in 3 vernachlässigen3, gibt es zwar eine "dreifache Änderung", aber beide variieren mit der gleichen Rate, und Sie können nicht behaupten, dass "[eines] dreimal schneller variiert als das andere".3n
Ein guter Grund, die Konstante in der Landau-Notation zu ignorieren, ist, dass wir keine Einheit haben, auf die wir uns verlassen können. Wenn jemand angibt, dass A doppelt so weit von Ihnen entfernt ist wie B, hat dies unabhängig von einer Einheit eine Bedeutung. Wir können uns darauf einigen, obwohl Sie Entfernungen in Zoll messen, während ich das in Lichtjahren mache. Die absolute Entfernungsmessung erfordert jedoch die Angabe von Einheiten, und ihre numerische Formulierung hängt von der gewählten Einheit ab.
Die tatsächliche Zeit, die ein Algorithmus benötigt, hängt von der Ausführungszeit elementarer Operationen ab, die sehr maschinenabhängig ist. Sie könnten die Anzahl der elementaren Operationen zählen, aber es gibt keinen Grund zu der Annahme, dass sie alle dieselbe Zeit benötigen, und es ist immer möglich, mehrere Operationen zu einer einzigen zusammenzufassen oder umgekehrt eine Operation in kleinere zu zerlegen, sodass die Anzahl erhalten bleibt von Operationen ist nicht wirklich sinnvoll, es sei denn, Sie stimmen einer virtuellen Referenzmaschine zu. Referenzunabhängigkeit ist von Vorteil.
Ein weiterer Vorteil des Ansatzes besteht darin, dass Sie in der Analyse nur die Anzahl der Elementaroperationen zählen müssen, sofern deren Kosten eine Obergrenze und eine positive Untergrenze haben. Sie müssen sich nicht um die individuellen Kosten kümmern.
Der zu zahlende Preis für diesen Vorteil ist jedoch, dass die Berechnung mit einer nicht angegebenen Einheit erfolgt und die Berechnungszeit beispielsweise Nanosekunden oder Jahrtausende betragen kann - wir versuchen es nicht einmal zu wissen. Mit anderen Worten, konstante Faktoren sind bedeutungslos, da sich ändernde Einheiten nicht von ändernden konstanten Faktoren trennen lassen und keine Bezugseinheiten verwendet werden.
Wie von Patrick87 bemerkt , reicht dies aus, um zu verstehen, wie ein Algorithmus in Bezug auf die Eingabegröße skaliert, aber es gibt kein absolutes Maß für die Leistung, wenn man sich nicht auf eine Referenzeinheit verlässt. Das Fehlen einer gemeinsamen Referenz-Abstract-Maschine kann durchgeführt werden, wenn die Leistung bestimmter Algorithmen tatsächlich verglichen werden soll, es ist jedoch schwieriger sicherzustellen, dass der Vergleich nicht durch Realisierungsdetails verzerrt wird. In der asymptotischen Komplexität wird dieses Risiko vermieden, weil Sie den Algorithmus mit sich selbst vergleichen.
Wie auch immer, nur ein naiver Programmierer würde sich ausschließlich auf asymptotische Komplexität verlassen, um einen Algorithmus auszuwählen. Es gibt viele andere Kriterien, einschließlich der unermesslichen Konstante und der tatsächlichen Kosten für elementare Operationen. Darüber hinaus kann die Worst-Case-Komplexität ein schlechter Indikator sein, da die Quelle der Worst-Case-Komplexität selten auftritt und bei Fragmenten der Eingabe so klein ist, dass sie eine begrenzte Auswirkung hat. Zum Beispiel haben allgemeine Parser für Grammatiken, die an einen Baum angrenzen , eine theoretische Komplexität und sind in der Praxis durchaus verwendbar. Der schlimmste mir bekannte Fall ist die
polymorphe Inferenz nach Damas-Hindley-MilnerO(n6)Algorithmus für ML mit exponentieller Worst-Case-Komplexität. Dies scheint jedoch ML-Benutzer nicht zu stören oder das Schreiben sehr großer Programme in ML zu verhindern. Es geht um mehr als die Konstante. Tatsächlich bezieht die asymptotische Analyse ein Maß für die Kosten einer Berechnung auf ein Maß für die Komplexität der Eingabe. Aber die Rohgröße ist möglicherweise nicht das richtige Maß.
Komplexität ist wie Entscheidbarkeit, sie mag theoretisch schlecht sein, aber das mag für den größten Teil des Datenraums irrelevant sein ... manchmal. Die Analyse der asymptotischen Komplexität ist ein gutes und gut gestaltetes Werkzeug, mit seinen Vorteilen und Einschränkungen, wie alle Werkzeuge. Mit oder ohne Erklärung der Konstante, die bedeutungslos sein kann, ist ein Urteil erforderlich.