java - 这个算法的时间复杂度是 O(n) 还是 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,其中包含一个 while 循环,该循环也将运行 n 次。这不意味着时间复杂度将是 O(n^2) 吗?
辅助函数中的代码是否实际上已被实施到 reverseWord 函数中,它是否会改变空间或时间复杂度?
解决方案
[..] for 循环最多运行 n 次
真的
[..]它再次调用reverseCharacters,其中包含一个while循环,该循环也将运行n次。
这不是真的。
reverseCharacters
reverseWords
当遇到空格或字符串结尾时调用。boundsleftIndex
和rightIndex
指向单词的开头和结尾,不会遍历整个字符串。
因此,字符串中的每个字符都被看到两次,就像O(n + n)
which is一样O(n)
。
例子:
对于字符串abcd efg hijk
,很明显就是reverseWords
扫描了这个字符串。
当它看到空格或字符串结尾时,它会调用reverseCharacters
. 对于上述字符串,这会发生 3 次 - from (a - d)
、 (e - g)
和 (h - k)
。它反转边界之间的字符。这些操作中的每一个都不 O(n)
是。
推荐阅读
- authentication - 无法连接 Google DataStudio 和 MySQL 8
- c++ - 有先前输入时如何使用getline?由于先前的输入,getline(cin, stringName) 无法正常工作
- macos - 在 MacOS 终端中运行多个命令失败
- vb.net - 在 VB.Net 应用程序代码中设置 SourceSwitch 未配置
- visual-studio-code - Markdown > 预览:在 VS Code 中打开 Markdown 链接设置有什么作用?
- go - BST删除功能无法追踪问题
- python - 如何使用 NodeJS 在单个 HTTP POST 中发送文件和 JSON 数据(元数据)
- javascript - Javascript警报进入离子登录页面
- javascript - 调用时出现 Javascript 错误
- python - 如何在 Python 中将嵌套列表拆分为多个列表?