我有一个函数可以搜索两个数组中最长的公共元素:
export SPARK_HOME=/usr/local/spark/spark24
此方法有效,但我想提高性能,因为我多次调用它。
是否有适用的性能改进?
侧面说明:数组中的元素是未排序的字符串
/**
* Return the common elements in two array
*/
function searchArrayInArray(array1, array2) {
var result = [];
for (var j = 0, e = array1.length; j < e; j++){
var element = array1[j];
if( array2.indexOf(element) !== -1 ){
result.push(element);
}
}
return result;
}
/**
* Return the common elements in two array
*/
function searchArrayInArray(array1, array2) {
var result = [];
for (var j = 0, e = array1.length; j < e; j++){
var element = array1[j];
if( array2.indexOf(element) !== -1 ){
result.push(element);
}
}
return result;
}
var result = searchArrayInArray(['a', 'b'], ['b', 'c']);
document.getElementById("result").innerHTML = JSON.stringify(result, null, 2);
答案 0 :(得分:3)
如果您担心性能,则需要使用提供良好查找时间的数据结构。像Array.prototype.indexOf
,Array.prototype.includes
和Array.prototype.find
这样的数组方法都具有 linear 查找。 Map
具有 binary 查找,而{{11}}具有恒定查找。我认为Set
在这种情况下会很理想。
Set
的直接实现-
intersection
使用const intersection = (a1 = [], a2 = []) =>
{ const s =
new Set(a1)
const result =
[]
for (const x of a2)
if (s.has(x))
result.push(x)
return result
}
console.log(intersection(['a', 'b'], ['b', 'c']))
// [ 'b' ]
-
Array.prototype.filter
可以扩展此概念以支持与任意数量的数组相交-
const intersection = (a1 = [], a2 = []) =>
{ const s =
new Set(a1)
return a2.filter(x => s.has(x))
}
console.log(intersection(['a', 'b'], ['b', 'c']))
// [ 'b' ]
答案 1 :(得分:0)
好indexOf()为O(n),因此可以使用Set()来将复杂度从O(n ^ 2)改进为O(n * log n)
url = "https://api.godaddy.com/v1/domains/available?domain=" & Range(CellC).Value & ".com"
request.setRequestHeader "Authorization", "sso-key ???:???"
答案 2 :(得分:0)
最简单的方法:
var a = [1,2,3,4,5,6,7,8,9,10];
var b = [2,4,5,7,11,15];
var c = a.filter(value => b.includes(value))
console.log(c)