我正在创建一个函数,它将接受两个参数,即每个数组,并在两个数组之间返回一个单独的匹配值数组。
我制作了两个版本的函数,
for
中的第一个参数
循环,并使用.includes()
例如:
var matches = [];
for (let i = 0, len = array1.length; i < len; i++) {
var a = array1[i];
if (array2.includes(a)) {
matches.push(a)
}
for
循环例如:
if (array1.length <= array2.length) {
var itArr = array1;
var checkArr = array2 }
else { var itArr = array2
var checkArr = array1 };
var matches = [];
for (let i = 0, len = itArr.length; i < len; i++) {
var a = itArr[i];
if (checkArr.includes(a)) {
matches.push(a)
}
我的问题是这是否实际上改善了性能,或者没有差别,或者损害了性能(通过添加更多变量定义,计算等)?
答案 0 :(得分:1)
它不会产生显着差异,因为最坏情况的复杂性将是 O(n * m),其中n和m是数组的长度。
你可以对2个数组进行排序,并使用2个指针找到交集,在这种情况下,时间复杂度为 O(nlogn + mlogm + n + m),取决于使用的排序算法
答案 1 :(得分:0)
我想我会选择第一种方法,因为.includes函数将尝试迭代数组并在找到元素时返回true,所以如果元素位于数组的末尾,它会完全迭代它。因此,你选择小一个的尝试不应该产生太大的不同。
答案 2 :(得分:0)
以下是使用Set查看一个数组是否包含另一个数组的值的示例。
如果你不是ES6,(为什么不呢?),你可以使用一个简单的对象文字。
这应该比做一个双循环更快,因为那是包括将要做的事情。
function makeRandom(count, max) {
return Array.from(new Array(count),
(a,ix) => Math.round(Math.random() * max));
}
function union(a,b) {
var aSet = new Set(a), oSet = new Set();
b.forEach((v) => { if(aSet.has(v)) oSet.add(v) });
return Array.from(oSet);
}
const
random1 = makeRandom(5, 10),
random2 = makeRandom(5, 10);
const
unionArray = union(random1, random2);
console.log(random1.join(':'));
console.log(random2.join(':'));
console.log(unionArray.join(':'));