何时使用 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上找到我运行的测试:
Set().size returns 数组中唯一元素的数量。因此,它可用于通过将其与数组的长度进行比较来检查重复元素。
我只是 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
, anddelete
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上找到我运行的测试:
Set().size returns 数组中唯一元素的数量。因此,它可用于通过将其与数组的长度进行比较来检查重复元素。