Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
低效的JavaScript算法,如何使下面的代码更高效?_Javascript - Fatal编程技术网

低效的JavaScript算法,如何使下面的代码更高效?

低效的JavaScript算法,如何使下面的代码更高效?,javascript,Javascript,问题陈述:给定两个数组a和b编写一个函数comp(a,b)(Clojure中的compSame(a,b)来检查这两个数组是否具有具有相同重数的“相同”元素。“相同”在此表示b中的元素是a中的元素的平方,而不考虑顺序 我的解决方案: function comp(array1, array2){ var test; if( array1.length <= 0 || array2.length <= 0 || array1 == null || array2 == null

问题陈述:给定两个数组ab编写一个函数comp(a,b)(Clojure中的compSame(a,b)来检查这两个数组是否具有具有相同重数的“相同”元素。“相同”在此表示b中的元素是a中的元素的平方,而不考虑顺序

我的解决方案:

function comp(array1, array2){

  var test;

  if( array1.length <= 0 || array2.length <= 0 || array1 == null || array2 == null || array2.length != array1.length || array1==undefined || array2==undefined){
    return false;
  }else{
    for(i=0; i<array2.length; i++){
      for(j=0; j<array1.length; j++){
        if(array2[i] === Math.pow(array1[j],2)){
          test = true;
          break;
        }else{
          test = false;
        }
      }
      if(test==false)
        return false;
    }

    if(test === true)
      return true;
    else
      return false;
  }
}
var a1 = [80, 2, 65, 68];
var a2 = [6401, 4, 4225, 4624];
因为我想要的最终结果是,如果为真,则返回真,如果为假,则返回假。程序解决所有测试用例,但超时。

换句话说:

  • 将第一个数组平方
  • 对第一个数组排序
  • 对第二个数组进行排序
  • 现在,如果任何元素与另一个数组中的对应元素不匹配,则不存在匹配项
  • 否则他们会匹配
  • 代码:

    function comp(array1, array2){
    
        var test;
    
        if( !array1 || !array2 ){
            return false;
        }
    
        if ( array1.length != array2.length ){
            return false;
        }
    
        // first squre the array
        array1_squared = array1.map( function( val ){ return Math.pow( val, 2 ); } );
    
        // then sort both arrays
        array1_squared.sort()
        array2.sort()
    
        // then compare
        for ( var i=0 ; i < array1_squared.length ; i+= 1 ){
            if ( array1_squared[i] != array2[i] ) {
                return false;
            }
        }
    
        return true;
    }
    
    函数comp(array1,array2){
    var检验;
    如果(!array1 | |!array2){
    返回false;
    }
    if(array1.length!=array2.length){
    返回false;
    }
    //首先求数组的平方
    array1_平方=array1.map(函数(val){return Math.pow(val,2);});
    //然后对两个数组进行排序
    数组1_平方排序()
    array2.sort()
    //然后比较
    对于(var i=0;i
    更多详情,因为:

    从概念上讲,我认为这更容易理解。一个区别是我在循环外做平方运算。您正在循环中进行平方运算,这意味着您正在将长度^2倍平方,而不是长度倍平方。这就造成了一些CPU周期的浪费。此外,在数组上循环时,最终在数组上循环,这将给出长度**2的循环执行。相比之下,排序速度相当快,只需一个循环就可以得到实际答案。

    这是我的代码

    function comp(arr1, arr2)
    {
        // make sure the arrays are set and are of equal length (if not they obivously don't match)
        if(arr1 == null || arr2 == null || arr1.length != arr2.length)
            return false;
        // sort arrays
        var intSorter = function(a,b){return a-b;};
        arr1.sort(intSorter);
        arr2.sort(intSorter);
        for(var i=0;i<arr1.length;i++)
        {
            var v = arr1[i];
            // if square of value in arr1 does not equal the value in arr2, arrays don't match
            if(v*v!=arr2[i])
                return false;
        }
        return true;
    }
    // test it!
    console.info(comp([2,6,3,8,4,5], [25,64,16,36,4,9]));
    console.info(comp([2,6,3,8,4,5], [25,64,17,36,4,9]));
    console.info(comp([2,6,3,8,4,5], [25,64,16,36,4,9,9]));
    
    功能组件(arr1、arr2)
    {
    //确保数组已设置且长度相等(如果未设置,则它们可能不匹配)
    如果(arr1==null | | arr2==null | | arr1.length!=arr2.length)
    返回false;
    //排序数组
    var intSorter=函数(a,b){返回a-b;};
    arr1.分拣(内部分拣机);
    arr2.分拣(内部分拣机);
    
    对于(var i=0;inegative array length?一件突出的事情是,在检查
    array1.length
    之前,您正在检查
    array1==null
    。如果后者为真,则运行前者将产生错误。请添加一些数组进行测试,并获得所需的结果。
    If(test==true)返回true;否则返回false;
    可以简化为:
    返回测试===true;
    您可以提供一些测试数据吗?您创建了
    array1_平方
    但从未使用过它:)是的,只是将
    array1.sort()更改为array1_平方。sort()
    尽管现在正在检查,但仍然收到不正确的答案。感谢您捕捉到了这一点!@Dragorn421也捕捉到了一个重要的细节:排序操作的是字符串,而不是数字。这可能是问题所在。尝试一下他的代码,看看是否能做到这一点:他使用了基本相同的算法。谢谢@conormance!是的,添加了
    intSorter()
    函数,工作得很好!感谢您的支持和额外的输入。我甚至不知道您必须使用compareFunction,因为默认情况下,
    sort()
    将排序作为字符串。