我需要帮助理解 Big O 章节中问题 11 的答案是如何得出的。
问题描述如下:
下面的代码打印长度为 k 的所有字符按顺序排列的字符串。它通过生成长度为 k 的所有字符串,然后检查每个字符串是否已排序来实现此目的。它的运行时间是多少?
public static int numChars = 26;
public static void printSortedStrings(int remaining) {
printSortedStrings(remaining, "");
}
public static void printSortedStrings(int remaining, String prefix) {
if (remaining == 0) {
if (isInOrder(prefix)) {
System.out.println(prefix); // Printing the string
}
} else {
for (int i = 0; i < numChars; i++) {
char c = ithLetter(i);
printSortedStrings(remaining - 1, prefix + c);
}
}
}
public static boolean isInOrder(String s) {
for (int i = 1; i < s.length(); i++) {
int prev = ithLetter(s.charAt(i - 1));
int curr = ithLetter(s.charAt(i));
if (prev > curr) {
return false;
}
}
return true;
}
public static char ithLetter(int i) {
return (char) (((int) 'a') + i);
}
public static void main(String[] args) {
printSortedStrings(2);
}
书本答案:
O(kck),其中k是字符串长度,c是字母表中字符数量。生成每个字符串需要O(ck)的时间。接着我们需要检查这些字符串是否都已排序,需要O(k)的时间。
注意,上述答案并未考虑打印字符串所需的时间,但在其他问题中我见过相反的情况。
什么时候需要考虑打印字符串所需的时间?
O(k2ck) 是否为正确答案?
另外,如何快速判断这段代码运行时间中是否存在指数部分?:)
prefix + c
不会影响复杂度?我的理解是它本身具有O(n)
的复杂度。我错过了什么吗? - chalimartinesk
系数中有所体现。我以为它会更糟糕,因为它是在每次调用时完成的,而不仅仅是在最后,但总调用次数与最后的调用次数成比例,所以并没有影响。 - fgb