[英]Does this algorithm have time complexity of O(n) or O(n^2)?
public static void reverseWords(char[] message) {
reverseCharacters(message, 0, message.length - 1);
int currentWordStartIndex = 0;
for (int i = 0; i <= message.length; i++) {
if (i == message.length || message[i] == ' ') {
reverseCharacters(message, currentWordStartIndex, i - 1);
currentWordStartIndex = i + 1;
}
}
}
private static void reverseCharacters(char[] message, int leftIndex, int rightIndex) {
while (leftIndex < rightIndex) {
char temp = message[leftIndex];
message[leftIndex] = message[rightIndex];
message[rightIndex] = temp;
leftIndex++;
rightIndex--;
}
}
乍一看,這似乎具有 O(n) 的時間復雜度和 O(1) 的空間復雜度。 這也是作者建議的。 然而,函數reverseWords 首先調用reverseCharacters,它的時間復雜度為O(n),空間復雜度為O(1)。
然后 for 循環將最多運行 n 次,並再次調用 reverseCharacters,其中包含一個也將運行 n 次的 while 循環。 這不是意味着時間復雜度是 O(n^2) 嗎?
來自 helper 函數的代碼是否真的被實現到 reverseWord 函數中,它是否會改變空間或時間復雜度?
[..] 最多運行 n 次的 for 循環
真的
[..]並且它再次調用reverseCharacters,其中包含一個while循環,該循環也將運行n次。
這不是真的。
reverseCharacters
當被稱為reverseWords
遇到空間或字符串的結尾。 邊界leftIndex
和rightIndex
指向單詞的開頭和結尾,並且不會遍歷整個字符串。
因此,字符串中的每個字符都被看到兩次,就像O(n + n)
是O(n)
。
例子:
對於字符串abcd efg hijk
,很明顯reverseWords
掃描了這個字符串。
當它看到一個空格或字符串的結尾時,它會調用reverseCharacters
。 對於上述字符串,這種情況發生了 3 次 - from (a - d)
、 (e - g)
和(h - k)
。 它反轉邊界之間的字符。 這些操作中的每一個都不是O(n)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.