【问题标题】:Does this algorithm have time complexity of O(n) or O(n^2)?这个算法的时间复杂度是 O(n) 还是 O(n^2)?
【发布时间】:2020-01-20 03:46:19
【问题描述】:
  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,其中包含一个 while 循环,该循环也将运行 n 次。这不意味着时间复杂度将是 O(n^2) 吗?

帮助函数中的代码是否已实际实施到 reverseWord 函数中,是否会改变空间或时间复杂度?

【问题讨论】:

  • 澄清n 的意思,答案应该很明显。提示:与messagereverseCharacters中的长度无关。

标签: java algorithm big-o


【解决方案1】:

[..] for 循环最多运行 n 次

是的

[..]它再次调用reverseCharacters,其中包含一个while循环,该循环也将运行n次。

这不是真的。

reverseCharactersreverseWords 遇到空格或字符串结尾时被调用。边界leftIndexrightIndex 指向单词的开头和结尾,不会遍历整个字符串。

因此,字符串中的每个字符都会出现两次,例如 O(n + n)O(n)

例子:

对于字符串abcd efg hijk,很明显reverseWords扫描了这个字符串。

当它看到空格或字符串结尾时,它会调用reverseCharacters。对于上述字符串,这种情况发生了 3 次 - 从 (a - d)(e - g)(h - k)。它反转边界之间的字符。这些操作中的每一个都不是O(n)

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多