【问题标题】:What is the space complexity of this string manipulation code?这个字符串操作代码的空间复杂度是多少?
【发布时间】: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


【解决方案1】:

该示例中的空间复杂度为 O(N),因为字符串是作为参数接收的;我们并不确切地知道它的大小,并且考虑到空间复杂度对算法的内存消耗的影响,它会根据“str”的大小而有所不同。因为应该使用 N。

例如,如果我有完全相同的情况:

public void someMethod(int a[], char s, int w){...}

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

另一方面:

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

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我认为这有点复杂:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 2016-10-30
      • 2013-10-05
      • 2015-03-31
      • 1970-01-01
      相关资源
      最近更新 更多