Ja, für entsprechend kleines N. Es wird immer ein N geben, über dem Sie immer die Reihenfolge O (1) <O (lg N) <O (N) <O (N log N) <O (N c haben ) <O (c ^ N) (wobei O (1) <O (lg N) bedeutet, dass bei einem O (1) -Algorithmus weniger Operationen ausgeführt werden, wenn N geeignet groß ist und c eine feste Konstante ist, die größer als 1 ist ).
Angenommen, ein bestimmter O (1) -Algorithmus benötigt genau f (N) = 10 ^ 100 (a googol) -Operationen und ein O (N) -Algorithmus benötigt genau g (N) = 2 N + 5 Operationen. Der O (N) -Algorithmus liefert eine höhere Leistung, bis N ungefähr ein Googol ist (tatsächlich, wenn N> (10 ^ 100 - 5) / 2). Wenn Sie also nur damit gerechnet haben, dass N im Bereich von 1000 bis einer Milliarde liegt, haben Sie würde unter Verwendung des O (1) -Algorithmus eine größere Strafe erleiden.
Zum realistischen Vergleich können Sie auch n-stellige Zahlen miteinander multiplizieren. Der Karatsuba-Algorithmus besteht aus höchstens 3 n ^ (lg 3) Operationen (dh ungefähr 0 (n ^ 1,585)), während der Schönhage-Strassen-Algorithmus 0 (N log N log N) ist, was eine schnellere Ordnung darstellt , aber zu zitieren ist Wikipedia:
In der Praxis beginnt der Schönhage-Strassen-Algorithmus, ältere Methoden wie Karatsuba und die Toom-Cook-Multiplikation für Zahlen jenseits von 2 ^ 2 ^ 15 bis 2 ^ 2 ^ 17 (10.000 bis 40.000 Dezimalstellen) zu übertreffen. [4] [5] [6 ]
Wenn Sie also 500-stellige Zahlen miteinander multiplizieren, ist es nicht sinnvoll, den Algorithmus zu verwenden, der durch große O-Argumente "schneller" ist.
EDIT: Sie können f (N) im Vergleich zu g (N) bestimmen, indem Sie die Grenze N-> unendlich von f (N) / g (N) nehmen. Wenn die Grenze 0 ist, dann ist f (N) <g (N), wenn die Grenze unendlich ist, dann ist f (N)> g (N), und wenn die Grenze eine andere Konstante ist, dann sind f (N) ~ g (N) in Bezug auf die große O-Notation.