低效的JavaScript算法,如何使下面的代码更高效?
问题陈述:给定两个数组a和b编写一个函数comp(a,b)(Clojure中的compSame(a,b)来检查这两个数组是否具有具有相同重数的“相同”元素。“相同”在此表示b中的元素是a中的元素的平方,而不考虑顺序 我的解决方案:低效的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
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()
将排序作为字符串。