【问题标题】:Understanding Hashmaps with Javascript用 Javascript 理解 Hashmaps
【发布时间】:2020-05-11 02:45:48
【问题描述】:

我需要帮助了解什么以及如何在 javascript 中使用哈希映射。我有一个例子 给定一个整数数组,返回两个数字的索引,使它们相加为特定目标。

您可以假设每个输入都只有一个解决方案,并且您不能两次使用相同的元素。

有人能分解一下这个 hashmap 解决方案的作用以及为什么它更好吗?此外,如果有人足以给我一个类似的问题来练习,那将非常有帮助。

给定 nums = [2, 7, 11, 15],目标 = 9,

因为 nums[0] + nums[1] = 2 + 7 = 9, 返回 [0, 1]。

我的蛮力解决方案

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.
        }
    }
}

【问题讨论】:

  • 一个循环是 O(n),两个嵌套循环是 O(n²) ...
  • 第 5 行的结尾 ) 应该在逗号之前。
  • @JonasWilms 如果 OP 不是 HashTable/HashMap 的工作方式...假设 O 表示法的知识是一个延伸...而且循环的数量确实不是复杂性的指示。如果Map.has 只使用线性搜索,那么只有一个外部循环不会改变整体复杂性 - 您的评论可能会导致传播普遍的想法,即函数调用总是 O(1)。跨度>

标签: javascript arrays hashmap maps frontend


【解决方案1】:

如果你想达到 10 并且你有 7,你已经知道需要的另一个数字是 3。所以对于数组中的每个数字,你只需要 检查 补数是否在数组中,你不一定要搜索

如果我们遍历所有数组条目一次(我们称它们为 a)并将它们添加到带有索引的 hashmap 中,我们可以再次遍历数组并且对于每个条目 (b),我们可以检查 hashmap 是否包含a(其中 a + b = 目标)。如果找到该条目,则 b 的索引是已知的,并且可以从哈希映射中检索 a 的索引¹。现在使用这种方法,我们只迭代数组两次(或者只是一次,没那么重要),所以如果你有 1000 个数字,它将迭代 1000 次。您的解决方案将迭代 1000 * 1000 次(最坏情况)。所以哈希表方法方式更快(对于更大的数组)。


¹ Hashmaps 非常特殊,因为查找键所需的时间是固定的,因此数组有 10 或 1000 万个条目都没有关系(时间复杂度是恒定的 = O(1))。因此,在哈希表中查找比在数组内部查找要好得多(这需要更多时间,条目越多 = O(n))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多