javascript - JavaScript "in"运算符是否在后台执行循环?

标签 javascript algorithm

我正在研究一些常见算法的解决方案,我遇到了一些我很好奇的事情。我试图通过谷歌搜索和查看一些规范来自己找到答案,但我无法找到我的问题的答案。下面的算法基本上检查第一个数组中的每个项目是否在第二个数组中有一个对应的项目平方。天真的解决方案(如他们所说)将具有某种嵌套循环并被视为 O(n2)。下面写解决方案的人说这是 O(n)。

我不明白这怎么可能是 O(n),因为他在他的循环中使用了 Javascript“in”运算符。据我所知,运算符会检查它正在比较的值是否存在于对象中。 如果它不循环遍历引擎盖下的对象,它是怎么做到的?这真的是线性时间复杂度吗?

function same(arr1, arr2) {

  if (arr1.length !== arr2.length) {
    return;
  }

  let frequencyMap1 = {};
  let frequencyMap2 = {};

  for (let val of arr1) {
    frequencyMap1[val] = (frequencyMap1[val] || 0) + 1;
  }

  for (let val of arr2) {
    frequencyMap2[val] = (frequencyMap2[val] || 0) + 1;
  }

  for (let key in frequencyMap1) {
    if (!(key ** 2 in frequencyMap2)) {
      return false;
    }

    if (frequencyMap2[key ** 2] !== frequencyMap1[key]) {
      return false
    }
  }

  return true;
}

console.log(same([1, 2, 3], [1, 4, 9])); // true

最佳答案

在对象中查找键的复杂度为 O(1)for .. in 和仅 in 运算符不同。

无论对象中有多少个键,您都可以在恒定时间内访问它。 ObjectMap 有一个用于查找键的哈希表。

关于javascript - JavaScript "in"运算符是否在后台执行循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55078564/

相关文章:

c++ - 二维插值

c - 如何快速对许多正则表达式键进行字符串匹配?

javascript - 如何使用 Angular 2(测试版和更新版本)加载 RxJS(和 zone.js/reflect-metadata)?

javascript - 如何从 JavaScript 执行 Kotlin WebAssembly 函数?

javascript - 嵌套的 Angular 响应式表单和组件重用

java - 从文本文件中按单词查找最长的句子

javascript - org.springframework.http.converter.HttpMessageNotReadableException : Required request body is missing 问题

javascript - YouTube视频上的Javascript已开始

java - 当达到最大链长度时调整哈希表的大小

algorithm - MongoDB 查找和删除算法复杂性