Ich versuche herauszufinden, wie die Komplexität eines Codes (aus Cracking the Coding Interview Buch) zum Generieren aller Permutationen einer gegebenen Zeichenkette O (n!) Ist.Komplexität zum Generieren von Permutationen einer Zeichenkette
Ich weiß, dass das die bestmögliche Komplexität ist, wie wir n haben! Permutationen, aber ich würde es gerne codeweise verstehen, denn nicht jeder Algorithmus, der dies tut, wäre O (n!).
Der Code:
import java.util.*;
public class QuestionA {
public static ArrayList<String> getPerms(String str) {
if (str == null) {
return null;
}
ArrayList<String> permutations = new ArrayList<String>();
if (str.length() == 0) { // base case
permutations.add("");
return permutations;
}
char first = str.charAt(0); // get the first character
String remainder = str.substring(1); // remove the first character
ArrayList<String> words = getPerms(remainder);
for (String word : words) {
for (int j = 0; j <= word.length(); j++) {
String s = insertCharAt(word, first, j);
permutations.add(s);
}
}
return permutations;
}
public static String insertCharAt(String word, char c, int i) {
String start = word.substring(0, i);
String end = word.substring(i);
return start + c + end;
}
public static void main(String[] args) {
ArrayList<String> list = getPerms("abcde");
System.out.println("There are " + list.size() + " permutations.");
for (String s : list) {
System.out.println(s);
}
}
}
Dies ist, was ich jetzt, bis gedacht habe: Zu jedem Funktionsaufruf, die Anzahl der Worte zur Verfügung steht (n-1); Angenommen, wir befinden uns an einem Ort, wo der Rest die Länge hat (n-1). Um nun das n-te Element an allen möglichen Stellen für alle diese (n-1) Wörter einzufügen, braucht man (n-1) * (n-1) Zeit.
so über die Ausführung sollte es sein (n-1)^2 + (n-2)^2 + (n-3)^2 + .... 2^2 + 1^2 Operationen, die Ich denke nicht, ist n !.
Was habe ich hier vermisst?
Ich weiß nicht, ob Ich habe Recht, aber ich denke, es ist O ((N + 1)!)? – shole