Ich aktualisiere meine CS-Theorie und möchte wissen, wie man die Komplexität eines Algorithmus O (log n) identifiziert. Gibt es eine einfache Möglichkeit, es zu identifizieren?
Ich weiß, mit O (n) hast du normalerweise eine einzelne Schleife; O (n ^ 2) ist eine Doppelschleife; O (n ^ 3) ist eine Dreifachschleife usw. Wie wäre es mit O (log n)?
algorithms
complexity
big-o
Atif
quelle
quelle
Antworten:
Du machst es hier wirklich falsch. Sie versuchen sich zu merken, welcher Big-O-Ausdruck zu einer bestimmten algorithmischen Struktur gehört, aber Sie sollten wirklich nur die Anzahl der Operationen, die der Algorithmus benötigt, hochzählen und diese mit der Größe der Eingabe vergleichen. Ein Algorithmus, der seine gesamte Eingabe durchläuft, hat eine O (n) -Leistung, weil er die Schleife n-mal durchläuft, und nicht, weil er eine einzelne Schleife hat. Hier ist eine einzelne Schleife mit O (log n) -Leistung:
Jeder Algorithmus, bei dem die Anzahl der erforderlichen Operationen in der Größenordnung des Logarithmus der Größe der Eingabe liegt, ist also O (log n). Aus der Big-O-Analyse geht hervor, wie sich die Ausführungszeit eines Algorithmus im Verhältnis zur Größe der Eingabe ändert: Wenn Sie die Größe der Eingabe verdoppeln, führt der Algorithmus einen weiteren Schritt aus (O (log n)). , doppelt so viele Schritte (O (n)), viermal so viele Schritte (O (n ^ 2)) usw.
Hilft es aus Erfahrung zu wissen, dass Algorithmen, die ihre Eingaben wiederholt partitionieren, normalerweise "log n" als Komponente ihrer Leistung haben? Sicher. Aber suchen Sie nicht nach der Partitionierung und gehen Sie zu dem Schluss, dass die Leistung des Algorithmus O (log n) ist - es könnte sich um etwas wie O (n log n) handeln, was ganz anders ist.
quelle
Die Idee ist, dass ein Algorithmus besteht,
O(log n)
wenn Sie, anstatt 1 zu 1 durch eine Struktur zu scrollen, die Struktur immer wieder in zwei Hälften teilen und für jede Teilung eine konstante Anzahl von Operationen ausführen. Suchalgorithmen, bei denen der Antwortraum immer weiter aufgeteilt wird, sindO(log n)
. Ein Beispiel hierfür ist die binäre Suche , bei der Sie ein geordnetes Array immer wieder halbieren, bis Sie die Nummer gefunden haben.Hinweis: Sie müssen nicht unbedingt in gerade Hälften teilen.
quelle
log n
ausgelösten binären Suchreflexen bei Menschen.Die typischen Beispiele sind solche, die sich mit der binären Suche befassen. Zum Beispiel ist ein binärer Suchalgorithmus normalerweise
O(log n)
.Wenn Sie einen binären Suchbaum haben , sind das Nachschlagen, Einfügen und Löschen
O(log n)
kompliziert.In jeder Situation, in der Sie den Space kontinuierlich partitionieren, wird häufig eine
log n
Komponente benötigt. Dies ist der Grund, warum viele Sortieralgorithmen komplex sindO(nlog n)
, da sie häufig eine Menge aufteilen und sortieren, während sie arbeiten.quelle
Wenn Sie es so einfach wie "Einzelschleife -> O (n), Doppelschleife -> O (n ^ 2)" wollen, lautet die Antwort wahrscheinlich "Baum -> O (log n)". Präziseres Überqueren eines Baumes von der Wurzel zu einem (nicht allen!) Blatt oder umgekehrt. Dies sind jedoch alles Übervereinfachungen.
quelle
Sie möchten wissen, ob es eine einfache Möglichkeit gibt, festzustellen, ob ein Algorithmus O (log N) ist.
Nun, lauf einfach und leg los. Führen Sie es für Eingaben 1.000, 10.000, 100.000 und eine Million aus.
Wenn Sie eine Laufzeit von 3,4,5,6 Sekunden (oder ein Vielfaches davon) sehen, können Sie sicher sagen, dass es O (log N) ist. Wenn es eher wie folgt aussieht: 1,10,100,1000 Sekunden, dann ist es wahrscheinlich O (N). Und wenn es wie 3,40,500,6000 Sekunden ist, dann ist es O (N log N).
quelle