Понимание хэш-карт с Javascript - PullRequest
1 голос
/ 24 января 2020

Мне нужна помощь, чтобы понять, что и как использовать карты sh в javascript. У меня есть пример, где Учитывая массив целых чисел, вернуть индексы двух чисел так, чтобы они складывались в конкретную c цель.

Вы можете предположить, что каждый вход будет иметь только одно решение, и вы может не использовать один и тот же элемент дважды.

Может кто-нибудь разбить, что делает это решение hashmap и почему он лучше? Также, если кому-то будет достаточно, чтобы дать мне аналогичную проблему для практики, это было бы чрезвычайно полезно.

Заданные числа = [2, 7, 11, 15], цель = 9,

Поскольку числа [0] + числа [1] = 2 + 7 = 9, вернуть [0, 1].

My BruteForce Solution

for (var i = 0; i < nums.length; i++) {
        for (var j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] === target) {
                result.push(i);
                result.push(j);
            }
        }
    }
    return result;
}
console.log(twoSum([2, 7, 11, 15], 9));

HashMapSolution

function twoSumBest(array, target) {
    const numsMap = new Map();
    for (let i = 0; i < array.length; i++) {
        if(numsMap.has(target - array[i])) {
            return [numsMap.get(target - array[i], i)];
            // get() returns a specified element associated with the specified key from the Map object.
        } else {
            numsMap.set(array[i], i);
            //  set() adds or updates an element with a specified key and value to a Map object.
        }
    }
}

1 Ответ

2 голосов
/ 24 января 2020

Если вы хотите достичь 10, а у вас есть 7, вы уже знаете , что нужно другое число, равное 3. Таким образом, для каждого числа в массиве вам нужно только проверить если дополнительное число находится в массиве, вам не обязательно искать .

Если мы go по всем элементам массива один раз (назовем их a) и добавив их в хеш-карту с их индексом, мы снова можем go по массиву, и для каждой записи (b) мы можем проверить, содержит ли хеш-карта a (где a + b = target). Если эта запись найдена, индекс b известен, и индекс a можно получить из hashmap¹. Теперь, используя этот метод, мы повторяем массив только дважды (или только один раз, это не имеет большого значения), поэтому если у вас есть 1000 чисел, он будет повторяться 1000 раз. Ваше решение будет повторяться 1000 * 1000 раз (наихудший случай). Таким образом, подход с хеш-таблицами способ быстрее (для больших массивов).


¹ Хеш-карты очень особенные, так как время поиска ключа занимает постоянное количество времени поэтому не имеет значения, будет ли массив иметь 10 или 10 миллионов записей (сложность времени постоянна = O (1) ). Таким образом, поиск в хеш-таблице намного лучше, чем поиск внутри массива (который занимает больше времени с большим количеством записей = O (n)).

...