Javscript Производительность объектов против карт для задач конкурса - PullRequest
0 голосов
/ 18 февраля 2020

Я использовал памятку, чтобы попытаться улучшить производительность рекурсивного алгоритма. Я ожидаю примерно одинаковую производительность для объектов и карт в 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.

Правильное решение при использовании и Карт, и Объектов для запоминания, но огромная разница в производительности. Использование объектов для запоминания фактически приводит к снижению производительности.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...