Versuch, mein Big-O-Verständnis für einen Test aufzupeppen (Ein sehr grundlegendes Verständnis ist offensichtlich erforderlich) und machte einige Übungsprobleme in meinem Buch.Big-Oh-Notation für eine einzelne while-Schleife, die zwei Hälften eines Arrays mit zwei Iterator-Vars abdeckt
Sie gaben mir die folgenden Ausschnitt
public static void swap(int[] a)
{
int i = 0;
int j = a.length-1;
while (i < j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
Ziemlich einfach denken, ich verstehe. Es hat zwei Iteratoren, die jeweils die Hälfte des Arrays mit einem festen Betrag an Arbeit abdecken (was ich denke, taktet sie beide bei O (n/2))
Daher O (n/2) + O (n/2) = O (2n/2) = O (n)
Jetzt bitte vergeben, da dies mein derzeitiges Verständnis ist und das war mein Versuch, das Problem zu lösen. Ich habe viele Beispiele für Big-O-Online gefunden, aber keine, die so ähnlich sind, wobei die Iteratoren das Array im Wesentlichen zur gleichen Zeit erhöhen und modifizieren.
Die Tatsache, dass es eine Schleife hat, lässt mich denken, dass es sowieso O (n) ist.
Würde mir jemand diese Frage klären?
Dank
FYI: Auch wenn Sie nur über ein halbes Array iterieren - etwas wie 'sumOddIndexElements()', zum Beispiel - es ist immer noch O (n). Der konstante Faktor von 1/2 geht weg. Wenn Sie mit der Analyse komplexerer Algorithmen beginnen, ist es hilfreich, zu Beginn der Analyse von exakten Zählwerten zu großen O-Werten zu wechseln. Dann werden Ihre Zwischenschritte einfacher, weil Sie Begriffe wegwerfen können. I.E. Wenn ein Unterprogramm O (n) + O (log n) funktioniert, können Sie es für den Rest der Analyse sofort auf O (n) reduzieren. – japreiss
@japreiss Es tut mir leid, ich versuche nicht, überflüssig zu sein, aber dein letzter Satz verwirrte mich ein wenig. Wenn ich richtig verstehe, wird O (log n) zu einem bestimmten Punkt unbedeutend genug für O (n), dass es sich nicht lohnt, in die Zeiteffizienz zu rechnen, und deshalb lassen wir es fallen. – Habitat
Durch die Definition von großen O, wenn Sie Begriffe hinzufügen, können Sie immer alles außer dem asymptotisch größten fallen lassen. Sie können beweisen, dass "n + log n <2n" aber "2n" ist O (n). Also ja, es ist unbedeutend, auf eine sehr gut definierte Art und Weise. – japreiss