![](/img/trans.png)
[英]Understanding Example 12 All Permutations of a string from Big O notation - Cracking the Coding Interview
[英]Understanding Big O notation - Cracking the Coding Interview
我需要幫助理解作者如何在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(kc k ),其中k是字符串的長度,c是字母表中的字符數。 生成每個字符串需要O(c k )時間。 然后,我們需要檢查每個是否排序,這需要O(k)時間。
請注意,在上面的答案中沒有考慮打印字符串,但我在其他問題中看到了相反的情況。
您何時考慮在運行時打印字符串?
這是正確答案O(k 2 c k )嗎?
此外,任何關於能夠快速告知在此代碼的運行時間中存在指數部分的建議將非常感激。 :)
簡而言之,沒有。 正確的答案是書中的O(kc k )。
在你查完字符串以檢查它的字符是否被排序后,這將花費O(k),打印它只會添加O(k) - 這不會改變你的復雜性。
假設測試字符串是否有序需要a*k
操作,打印需要b*k
。 那么每個字符串的操作總數最多是(a+b)*k
,它仍然是O(k)。
編輯:關於問題的第二部分,遍歷具有一定長度的所有單詞將導致指數運行時復雜度,因為有c k這樣的單詞,其中c
是字母表的大小, k
是單詞的長度。
一般來說,恆定長度字符串的打印也被認為是常量,但如果我們想要精確,讓我們考慮將單個字符的打印作為基本操作:這意味着要打印ak長度字符串,我們有O(k)
。
由於我們有O(c k )個可能的字符串,並且對於每個字符串,我們必須檢查它是否已經排序(使用O(k))並打印它們(另一個O(k)),總復雜度變為O(c k) (k + k))= O(2c k k)。
但是將函數乘以常數因子並不會改變它的復雜性,因此答案仍然是O(c k k)。
打印字符串只是k
時間的額外補充。
檢查每個字符串是否被排序是O(k)
並且說對於某個整數d
(常數)打印它是O(dk)
)。 加上兩個得到O(k + dk)
,可以重寫為O(k(1 + d))
。 因為這只是一個標量,我們知道O(k + dk) = O(k)
所以答案不會改變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.