Javascript 有效字谜空间复杂度 var isAnagram=函数(s,t){ 常数len=s.长度; 如果(len!==t.length)返回false; 常量hashTab={}; for(设i=0;i

Javascript 有效字谜空间复杂度 var isAnagram=函数(s,t){ 常数len=s.长度; 如果(len!==t.length)返回false; 常量hashTab={}; for(设i=0;i,javascript,algorithm,big-o,Javascript,Algorithm,Big O,很难计算出这个算法的空间复杂度。我的假设是O(n)由于哈希表的大小与输入s有关。此问题假设字符串仅包含小写字母。正如您提到的字符串仅包含小写字母,我们可以将给定字符串中的字符转换为范围从0到25的相应整数 为了跟踪这些字母的频率,我们可以声明一个正好有26个大小的空间的数组。因此,总体空间复杂度将为O(M),其中M是所有不同的字母。在这种情况下,M=26。因此,空间复杂度为O(26)。 var isAnagram=函数(s,t){ 常数len=s.长度; 如果(len!==t.length)返回

很难计算出这个算法的空间复杂度。我的假设是O(n)由于哈希表的大小与输入s有关。此问题假设字符串仅包含小写字母。

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

var isAnagram=函数(s,t){
常数len=s.长度;
如果(len!==t.length)返回false;
hashTab=新数组(26);

对于(i=0;i,由于使用的空间是恒定的(本例中为26个字母/项目,或者即使使用了256个项目的数组),并且不依赖于输入的长度,因此空间复杂度为O(1)


另请参见。

代码中的主要空间开销是hashmap,它可能包含从
a
z
的每个小写字母的频率计数器。因此,在这种情况下,空间复杂度应该是恒定的
O(26)

更一般地说,此问题的空间复杂度与输入字符串的字母表大小有关。如果输入字符串仅包含ASCII字符,则在最坏的情况下,您将使用
O(256)
作为您的空间成本。如果字母表增加到UNICODE集,那么在最坏的情况下,空间复杂度会更差


所以一般来说,它的
O(字母表的大小)

也许我误解了,但是,如果字符串只包含小写字母,那么
hashTab
中只有26个可能的唯一键,所以
hashTab
的最大大小是26个键值对,对吗?假设我们使用固定位计数作为值,这就提供了恒定的有界辅助空间使用(或者,如果计数为任意多个位,则计数的大小为对数,因此总体空间使用率为对数)。同意,字符串长度为O(n),但以字母表的大小为界(例如,如果字母表为[a-z],则为26,如果字母表均为Unicode字符,则为更多)
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;
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;
}