Javascript Javscript竞赛问题中对象与地图的性能
我使用memoization来尝试提高递归算法的性能。我希望Javascript中的对象和映射具有相同的性能(读写为O(1)) 看看其他StackOverflow帖子,他们说根据实现/浏览器的不同,性能可能会有2倍或3倍的差异,但是,我发现对象与映射实现算法之间的性能差异约为40倍 在LeetCode上,对象实现的性能约为8000ms(比仅5%的js解决方案快,比不使用Memonization慢) 而map在LeetCode上的实现性能约为184ms(比70%的js解决方案快) 下面是我的代码。完全相同的解决方案,对象解决方案未注释,而映射解决方案被注释掉 我的代码在对象记忆实现方面是否犯了一个很大的错误,这会使它慢得多?或者这是LeetCode映射与对象实现的区别Javascript Javscript竞赛问题中对象与地图的性能,javascript,performance,dictionary,object,Javascript,Performance,Dictionary,Object,我使用memoization来尝试提高递归算法的性能。我希望Javascript中的对象和映射具有相同的性能(读写为O(1)) 看看其他StackOverflow帖子,他们说根据实现/浏览器的不同,性能可能会有2倍或3倍的差异,但是,我发现对象与映射实现算法之间的性能差异约为40倍 在LeetCode上,对象实现的性能约为8000ms(比仅5%的js解决方案快,比不使用Memonization慢) 而map在LeetCode上的实现性能约为184ms(比70%的js解决方案快) 下面是我的代码。
/**
* @param {number[]} nums
* @param {number} S
* @return {number}
*/
var findTargetSumWays = function(nums, S) {
//let memo=new Map();
let memo={};
return helper(0,S);
function helper(numsPointer,S){
let numWays=0;
if(numsPointer==nums.length&&S===0){return 1;} //base case. All nums in array used and Sum matches
if(numsPointer==nums.length){return 0;} //all nums in array used
//if(memo.has(numsPointer+":"+S)){return memo.get(numsPointer+":"+S);}
if(memo[numsPointer+":"+S]){return memo[numsPointer+":"+S];}
let curr=nums[numsPointer];
numWays+=helper(numsPointer+1,S+curr);
numWays+=helper(numsPointer+1,S-curr);
//memo.set(numsPointer+":"+S,numWays); //store results
memo[numsPointer+":"+S]=numWays;
return numWays;
}//helper
};
LeetCode的问题是:
给您一个非负整数列表,a1、a2、…、an和目标S。现在您有2个符号+和-。对于每个整数,您应该从+和-中选择一个作为其新符号。
了解分配符号使整数和等于目标S的方法
当同时使用贴图和对象进行记忆时,解决方案是正确的,但性能差异巨大。使用对象进行记忆实际上会导致性能损失
谢谢大家! 对于CodeReview来说,这可能是一个更好的问题,而不是StackOverflow。它是否有效???映射解决方案和对象解决方案都有效。虽然映射解决方案比对象解决方案快40倍左右,但我希望有类似的性能。IIRC映射针对添加/删除对象进行了显式优化,而对象为继承和键映射做了额外的工作。一段时间以来,地图的速度一直比物体快。