Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Javascript理解Hashmaps_Javascript_Arrays_Hashmap_Maps_Frontend - Fatal编程技术网

用Javascript理解Hashmaps

用Javascript理解Hashmaps,javascript,arrays,hashmap,maps,frontend,Javascript,Arrays,Hashmap,Maps,Frontend,我需要帮助理解在javascript中使用什么以及如何使用哈希映射。我举了一个例子 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标 您可以假设每个输入都有一个解决方案,并且不能两次使用同一个元素 有人能分析一下这个hashmap解决方案在做什么以及为什么它更好吗?如果有人能给我一个类似的问题来练习,那将非常有帮助 给定nums=[2,7,11,15],target=9 因为nums[0]+nums[1]=2+7=9, 返回[0,1] 我的暴力解决方案 for (var i =

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

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

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

给定nums=[2,7,11,15],target=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));
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.
        }
    }
}
for(变量i=0;i
HashMapSolution

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));
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.
        }
    }
}
函数twoSumBest(数组,目标){
const nummap=新映射();
for(设i=0;i
如果你想达到10而你有7,你已经知道需要的另一个数字是3。因此,对于数组中的每个数字,您只需检查互补数是否在数组中,而不必搜索它

如果我们检查所有数组条目一次(我们称它们为a),并将它们与索引一起添加到hashmap中,我们可以再次检查数组,对于每个条目(b),我们可以检查hashmap是否包含a(其中a+b=目标)。如果找到该条目,则b的索引是已知的,a的索引可以从hashmapª中检索。现在使用这个方法,我们只迭代数组两次(或者只迭代一次,没什么大不了的),所以如果你有1000个数字,它将迭代1000次。您的解决方案将迭代1000*1000次(最坏情况)。因此,哈希表方法要快得多(对于较大的数组)



1哈希映射非常特殊,因为查找密钥所需的时间是恒定的,所以数组中有1000万个条目还是1000万个条目并不重要(时间复杂度为常量=O(1))。因此,在哈希表中查找要比在数组中搜索好得多(这需要更多的时间来处理更多的条目=O(n))。

一个循环是O(n),两个嵌套的循环是O(n²)…第五行的结尾应该在逗号之前。@jonaswillms如果OP不知道哈希表/哈希映射是如何工作的。。。假设O表示法的知识是一个延伸。。。同样,循环的数量并不是复杂性的指标。如果
Map.has
只使用线性搜索,那么只有一个外部循环这一事实不会改变总体复杂性-您的评论可能会导致传播函数调用总是O(1)的普遍观点。