何时使用 javaScript 中的集合

When to use set in javaScript

我只是 javaScript 的初学者,有 python 的背景。我正在尝试这个练习来检查 string2 的每个字符是否都包含在 string1 中。 例如,如果 string1 是 "hello",我将 return true 如果 string2 是 "leh" 和 false 如果 string2 是 "low".

我想到的是这个:

function mutation(arr) {
  var set = new Set(string1.split(''));
  for (var i = 0; i < string2.length; i++)
    if (!set.has(string2[i]))
      return false;
  return true;
}

我也可以着手将 string2 转换成一个集合,然后取差,即 set(string2) - set(string1) 的操作,它将为我获取 string2 中但不在 string1 中的字符集,但我阅读了创建一套很贵,所以我没有继续。

我检查了其他解决方案,每个人都在使用 string1.indexOf(letter) 方法来检查 string2 中的每个字母是否存在于 string1 中。

我想知道什么时候应该使用集合差异。为什么每个人都使用成本为 O(n) 的 array.indexOf() 方法而不是 O(1) 的 set.has() 方法。如果我使用 set.has(),会有什么陷阱吗? (说浏览器兼容性)?

任何建议都有帮助。

在编程中,多种方法导致相同的解决方案。使用带有 .has() 的集合与使用 indexOf() 一样有效,这完全取决于周围的代码,以及您对对象(例如:集合)的重用。

通常在 CPU 上使用 indexOf() 速度更快,并且不关心特殊字符(而传统的简单拆分意味着单词始终由相同的字符分隔)。

制作套装的成本略高。但它仍然相当快,所以不应该太在意。

最后,按照您的直觉去做,这样您的代码就会保持一致。

您可以在维基百科 MDN - Set. For implementation of a Set in general, you can read Set - Implementations 上找到更多详细信息和浏览器兼容性。

Implementations described as "general use" typically strive to optimize the element_of, add, and delete operations.

您还可以在 Stack Overflow 上的 上查看一些测试结果。


为了回答你的问题,尽管 has 操作可能比使用字符串的 indexOf(或 includes)快一点,但在你的特定情况下,实例化一个新的成本Set每次比较都大很多。

我用以下两种方法创建了一个简单的测试:

function existsSet(str1, str2) {
  const set = new Set(str1);
  return ![...str2].some(char => !set.has(char));
}

function existsString(str1, str2) {
  return ![...str2].some(char => !str1.includes(char));
}

我对 100 万个随机创建的字符串调用了上述方法,得到了以下结果:

existsSet: 1.29s
existsString: 0.47s

对于实例化 Set 的方法来说,这几乎慢了三倍。


你可以在下面的JsFiddle上找到我运行的测试:

https://jsfiddle.net/mspyratos/zwx3zcx1/11/

Set().size returns 数组中唯一元素的数量。因此,它可用于通过将其与数组的长度进行比较来检查重复元素。