JavaScript:提高性能以查找两个数组中的常见元素

时间:2019-03-22 16:58:47

标签: javascript node.js algorithm performance

我有一个函数可以搜索两个数组中最长的公共元素:

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);

3 个答案:

答案 0 :(得分:3)

如果您担心性能,则需要使用提供良好查找时间的数据结构。像Array.prototype.indexOfArray.prototype.includesArray.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)