首页 > 解决方案 > JavaScript 的 Map.has() 在计算大 O 时算作循环吗?

问题描述

这是我在这里的第一个问题,我希望我没有违反任何规则。所以,我在这个编程方面还很陌生,现在只做了大约 3 个月。我也在自学数据结构和算法,今天我刚刚开始解决 LeetCode 上的简单问题。

我有一个关于计算专门针对地图的函数的大 O 的问题。

        function twoSum(arr, target) {
          const len = arr.length;
    
          for (let i = 0; i < len; i++) {
            let currVal = arr[i];
            let comp = target - currVal;
          
            let firstIndex = arr.indexOf(currVal);
            let secondIndex = arr.indexOf(comp, firstIndex+1);
         
            if (secondIndex !== -1) {
              return [firstIndex, secondIndex];
            }
          }
        }

所以最初,我在计算 Big O 时只计算了 for 循环,但后来我发现对于这个函数,由于 indexOf,时间复杂度实际上是 O(n^2)。

然后我尝试使用 Maps 解决同样的问题,这样我就不必循环遍历数组两次。

        function twoSum(arr, target) {
          const indexValues = new Map();
          const result = [];
          const len = arr.length;
      
          for (let i = 0; i < len; i++) {
            let currVal = arr[i];
            let comp = target - currVal;
  
            indexValues.has(comp) ? result = [i, indexValues.get(comp)] : indexValues.set(currVal, i);
          }
    
          return result;
    
        }

根据我对地图的理解,这个时间复杂度应该是 O(n),但是当我在 LeetCode 上比较这两个函数时,它们的运行时间都是 80 毫秒。那么,长话短说,Map.has() 方法是否因某种原因算作类似于 indexOf 函数的循环?

提前致谢!

标签: javascripthashmap

解决方案


推荐阅读