【问题标题】:Valid Anagram Space Complexity有效的字谜空间复杂度
【发布时间】:2018-07-11 23:45:50
【问题描述】:
var isAnagram = function(s, t) {
const len = s.length;
if (len !== t.length) return false;
const hashTab = {};
for (let i = 0; i < len; i++) {
    if (!hashTab[s[i]]) {
        hashTab[s[i]] = 1;
    } else {
        hashTab[s[i]]++;
    }
    if (!hashTab[t[i]]) {
        hashTab[t[i]] = -1;
    } else {
        hashTab[t[i]]--;
    }
}
for (let item in hashTab) {
    if (hashTab[item]) return false;
}
return true;

很难弄清楚这个算法的空间复杂度。我的假设是 O(n),因为哈希表的大小与输入 s 相关。本题假设字符串只包含小写字母。

【问题讨论】:

  • 可能我理解错了,但是,如果字符串只包含小写字母,那么hashTab中可能只有26个唯一键,所以hashTab的最大大小是26个键值对吧?假设我们使用固定位计数作为值,这给出了 constant 范围的辅助空间使用(或者,如果计数是任意多位,则计数的大小是对数的,因此总体空间使用将是对数)。
  • 同意,就字符串的长度而言,它是 O(n),但受字母表大小的限制(例如,如果字母表是 [a-z],则为 26,如果字母表是所有 Unicode 字符)

标签: javascript algorithm big-o


【解决方案1】:

正如你提到的字符串只包含小写字母,我们可以将给定字符串中的字符转换为对应的整数,范围从0到25。
为了跟踪这些字母的频率,我们可以声明一个正好为 26 大小空间的数组。因此,整体空间复杂度将是 O(M),其中 M 是所有不同的字母。在这种情况下,M=26。因此,空间复杂度为 O(26)。

var isAnagram = function(s, t) {
  const len = s.length;
  if (len !== t.length) return false;
  hashTab = new Array(26);
  for(i = 0; i<26; i++){
     hashTab[i] = 0;
  }
  for (let i = 0; i < len; i++) {
     idx = s[i].charCodeAt()-97; 
     hashTab[ idx ]++;
     idx = t[i].charCodeAt()-97; 
     hashTab[ idx ]--;
  }
  for(i = 0; i<26; i++){
     if(hashTab[i]!=0) return false;
  }
  return true;
}

【讨论】:

    【解决方案2】:

    代码中的主要空间成本是哈希图,它可能包含从az 的每个小写字母的频率计数器。所以在这种情况下,空间复杂度应该是常数O(26)

    为了更笼统地说,这个问题的空间复杂度与输入字符串的字母大小有关。如果输入字符串仅包含 ASCII 字符,那么在最坏的情况下,您的空间成本将是 O(256)。如果字母表增长到 UNICODE 集,那么在最坏的情况下空间复杂度会更差。

    所以一般是O(size of alphabet)

    【讨论】:

      【解决方案3】:

      由于使用的空间是恒定的(在这种情况下为 26 个字母/项目 - 或者即使您使用了 256 个项目的数组)并且不依赖于输入的长度,空间复杂度为 O( 1).

      另见this answer

      【讨论】:

        猜你喜欢
        • 2014-01-09
        • 2022-08-12
        • 2020-04-15
        • 1970-01-01
        • 2016-02-13
        • 2012-08-14
        • 2013-09-12
        • 2018-08-02
        • 2021-07-03
        相关资源
        最近更新 更多