【发布时间】:2019-04-13 03:05:24
【问题描述】:
我需要帮助理解作者如何得到大 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)?
此外,任何关于能够快速判断此代码的运行时存在指数部分的建议将不胜感激。 :)
【问题讨论】:
-
你如何到达 O(k2ck) ? “2”来自哪里(教科书只有 O(k ck) )。
-
如果您想考虑打印字符串,那么找到的每个答案都是 O(k)。所以你可以把它算作“检查”的一部分(对于每个候选者来说已经是 O(k))并且它不会增加复杂性。
-
为什么字符串连接
prefix + c不会影响复杂度?我的理解是它本身有O(n)。我错过了什么? -
字符串连接的复杂性在最终的
k因素中得到了说明。我认为这会更糟,因为它是在每次通话时完成的,而不是只在最后完成,但通话总数与最后的通话次数成正比,所以没有区别。
标签: java algorithm sorting big-o