【发布时间】:2013-02-06 03:35:57
【问题描述】:
这段代码来自Cracking the Coding interview book。
public static boolean isUniqueChars2(String str) {
boolean[] char_set = new boolean[256];
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i);
if (char_set[val]) return false;
char_set[val] = true;
}
return true;
}
作者提到,
时间复杂度是 O(n),其中 n 是字符串的长度,并且 空间复杂度为 O(n)。
我知道时间复杂度是 O(n),但我不明白空间复杂度怎么可能是 O(n)
我的想法: 无论输入 (str) 大小是多少,char_set 都将保持一个大小为 256 的数组。 即使“str”的长度是 100,000,char_set 仍然是一个 256 元素的数组。 所以我想,由于这个函数的内存需求不会随着输入的大小而改变并且保持恒定的 256,所以空间复杂度是恒定的,即 O(1)。
如果我错了,谁能解释一下(以及,为什么?)
非常感谢。
【问题讨论】:
-
我认为您是对的,但是作者说原始 str 自我占用 O(n) (或者您正在按价值获得副本?)。
-
嗯...这很有趣。我认为在推导渐近复杂性时,我们通常会忽略输入的读取方式/位置/时间?并且只关注方法内部发生的事情(考虑到输入的大小,即 n)
-
我想看看作者的推理。算法本身使用的空间是恒定的。你说得对,当我们分析空间复杂度时,我们谈论的是处理所需的 额外 空间量,而忽略了算法的输入。
-
这本书的副本(第 5 版)说 O(1) 空间。不过我没有在勘误表中看到它。
-
我第二个@brooksbp 评论。我有第 5 版,上面写着 O(1)。我认为它在以后的版本中进行了修改。
标签: string algorithm complexity-theory