当我通过Javascript中的键从对象中获取值时,时间复杂度是否为O(1)?

当我通过Javascript中的键从对象中获取值时,时间复杂度是否为O(1)?,javascript,Javascript,正如我所知,Javascript中的对象的行为类似于散列(关联数组)。因此,我认为当我通过对象中的键获取值时,时间复杂度将始终为O(1),如obj['a'],无论obj中有多少个键。然而,一位面试官就此向我提出了质疑 他给了我一个问题:找到两个未排序数组之间的交集(无重复) 我的解决方案是遍历第一个数组并为每个元素创建哈希,然后循环第二个数组,如果第二个数组中的元素在哈希中,则将其推送到输出 代码如下所示: function findIntersection(ary1, ary2) { va

正如我所知,Javascript中的对象的行为类似于散列(关联数组)。因此,我认为当我通过对象中的键获取值时,时间复杂度将始终为O(1),如
obj['a']
,无论
obj
中有多少个键。然而,一位面试官就此向我提出了质疑

他给了我一个问题:
找到两个未排序数组之间的交集(无重复)

我的解决方案是遍历第一个数组并为每个元素创建哈希,然后循环第二个数组,如果第二个数组中的元素在哈希中,则将其推送到输出

代码如下所示:

function findIntersection(ary1, ary2) {
  var hash = {};
  var output = [];

  ary1.forEach((v) => {
    hash[v] = true;
  });

  ary2.forEach((v) => {
    if (hash[v]) {
      output.push(v);
    }
  });

  return output;
}
我解释了复杂性是
O(m+n)
,m和n是输入数组的长度。但面试官似乎不同意这一点。他不停地问,你确定要得到一个值是O(1)吗,告诉我Javascript是如何实现
hash[v]

hash[v]
的时间复杂度不是O(1)?如果不是,如何使用正确的哈希结构重新编写代码以实现线性时间复杂度


这是我学习Javascript的基础。

这不是关于Javascript,而是关于一般的“哈希映射”

它们被称为伪常数。这意味着,对于数量较少的数字,在大多数情况下,它们会以固定时间返回值,但这并不能保证

如果两个字符串有相同的散列呢?然后它们被保存在一个地方,你必须对它们进行线性检查以找到你的价值。 所以,如果您运气不好,您可以使用hashmap的所有键使用相同的hash=结果为O(n)

另外,当你添加越来越多的数字时,碰撞的概率也在增加,所以对于很多数字,你最终得到的是O(n)


关于解决方案-我认为您拥有的解决方案最适合于合理数量的值(比如百万,甚至可能是数十亿或更少,但不是一些超高的数字)。提到这些边界是很好的,在这些边界中,您的算法是正确工作的


对于寻找重复项,我认为没有在线性时间内运行的算法。您可以使用
n log n
对其进行排序并进行检查

也许他希望您使用
Map
对象
Map
对象时间复杂度为O(logn)对吗?谢谢您的解释。关于解决方案,也许最好提到时间复杂性对于面试官来说是线性的。