这个字符串操作代码的空间复杂性是多少?

时间:2013-02-20 23:07:23

标签: string algorithm complexity-theory

这段代码来自Cracking the Coding采访书。

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)。

有人可以解释,如果我错了(以及为什么?)

非常感谢你。

2 个答案:

答案 0 :(得分:0)

它有点复杂,我想:

在两次遇到某个字符之前的最大迭代次数是字符串构建的字母大小。

如果这个大小是有限的,时间复杂度是O(1),如果不是,布尔数组不能是有限大小,因此,空间复杂度将是O(n)。

答案 1 :(得分:0)

该示例中的空间复杂度为O(N),因为该字符串作为参数接收;我们并不确切知道它的大小,并且考虑到空间复杂性对算法时间内存消耗的建议,它会根据&#34; str&#34;的大小而变化。 。因为应该使用N.

如果我有例如:

,则完全相同
public void someMethod(int a[], char s, int w){...}

因为&#34; a []&#34;它将是O(N); (我们不知道它的大小)。

另一方面:

public void someMethod(char s, int a, int x){...}

它将是O(1)(常数)。由于我们已经知道为必要属性分配的内存。

希望它有所帮助。