Я использовал памятку, чтобы попытаться улучшить производительность рекурсивного алгоритма. Я ожидаю примерно одинаковую производительность для объектов и карт в Javascript (O (1) для операций чтения и записи).
Глядя на другие сообщения StackOverflow, они говорят, что производительность может отличаться в 2 или 3 раза в зависимости от производительности. реализация / браузер, однако, я вижу ~ 40-кратную разницу в производительности между алгоритмом реализации Objects vs Maps.
Производительность для реализации объекта в LeetCode составляет ~ 8000 мс (быстрее, чем только 5% js решений) и медленнее, чем не используя памятку).
В то время как производительность реализации карты в LeetCode составляет ~ 184 мс (быстрее, чем 70% js решений).
Ниже приведен мой код. Точно такое же решение, объектное решение не комментируется, а решение карты закомментировано.
Есть ли в моем коде большая ошибка для реализации запоминания объектов, которая делает его намного медленнее? Или это карта LeetCode против реализации объекта?
/**
* @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.
Правильное решение при использовании и Карт, и Объектов для запоминания, но огромная разница в производительности. Использование объектов для запоминания фактически приводит к снижению производительности.
Спасибо!