Der folgende Code gibt alle Primfaktoren der angegebenen Zahl n zurück.Was wäre die Ausführungszeit für den folgenden Algorithmus?
Ansatz hinter dem Algorithmus:
Iterate über die Zahlen (d> = 2) bis n/i die Primfaktoren zu bekommen.
Die interne Schleife reduziert einfach die Größe der Zahl, indem sie durch die aktuelle Primzahl dividiert wird und wenn die gleiche Primzahl mehr als einmal erscheint, wird sie weiter geteilt.
Die if-Anweisung würde die letzte & die höchste Primzahl für n> 2 hinzufügen, da n zu diesem Zeitpunkt auf diesen Wert reduziert worden wäre.
static List<Integer> getAllPrimes(int n){
List<Integer> factors = new ArrayList<Integer>();
for(int i = 2 ; i <= n/i ; ++i){
while(n % i == 0){
factors.add(i); //LINE 1
n/=i;
}
}
if(n > 2){factors.add(n);}
return factors;
}
Wie wird die Laufzeit für diesen Algorithmus bestimmt? Da jedes Mal, wenn die innere Schleife iteriert wird, verringert sie die Größe mit einem konstanten Wert, beispielsweise n/2, n/3, usw. basierend auf dem Index i, wenn es eine Primzahl ist.
Dies ist eigentlich ein Standardalgorithmus für die Primfaktorzerlegung einer Zahl mit der Worst-Case-Komplexität als O (sqrt (n)) und der Worst-Case ist eine Primzahl als n. Sie können dies durchgehen [** Artikel **] (http://www.geeksforgeeks.org/print-all-prime-factors-of-a-given-number/). –
Können Sie bitte beweisen, wie im schlimmsten Fall Zeile 1 sqrt (n) mal entweder mit Mathematik oder einfachen Testfällen ausgeführt wird. Ich bin nicht in der Lage, es herauszufinden –
Gut im schlimmsten Fall wird 'n' nicht in der inneren while-Schleife verringert. So bleibt 'n' gleich dem Anfangswert in der gesamten Ausführung von' for' loop. 'For' Schleife benötigt' O (sqrt (n)) 'Zeit, wenn' n' gleich dem Anfangswert ist. Dann wird schließlich in 'if (n> 2)' Anweisung "n" zur Liste hinzugefügt. Auf diese Weise wird im schlimmsten Fall "O (sqrt (n))" angenommen. Worst-Case-Eingaben sind Primzahlen (Nimm 11 als Beispiel und finde heraus, wie lange die for-Schleife läuft). –