簡體   English   中英

這個算法的時間復雜度是 O(n) 還是 O(n^2)?

[英]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遇到空間或字符串的結尾。 邊界leftIndexrightIndex指向單詞的開頭和結尾,並且不會遍歷整個字符串。

因此,字符串中的每個字符都被看到兩次,就像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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM