【问题标题】:Is the time complexity O(1) when I get a value from an object by a key in Javascript? [duplicate]当我通过 Javascript 中的键从对象中获取值时,时间复杂度是否为 O(1)? [复制]
【发布时间】:2018-10-19 09:16:26
【问题描述】:

据我所知,Javascript 中的对象就像一个哈希(关联数组)。因此,我认为当我通过像 obj['a'] 这样的 Object 中的键获取值时,无论obj 中有多少键,时间复杂度都将始终为 O(1)。然而,一位面试官就此向我提出质疑。

他给了我一个问题:find the intersection between two unsorted arrays (no duplicate)

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

代码如下:

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 是输入数组的长度。但面试官似乎不同意这一点。他一直问你确定hash[v]得到一个值是O(1),告诉我Javascript是如何实现hash[v]的。

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

这打击了我学习 Javascript 的基础。

【问题讨论】:

  • 也许他想让你使用 Map 对象
  • Map 对象时间复杂度是 O(logn) 对吧?

标签: javascript


【解决方案1】:

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

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

如果两个字符串具有相同的哈希值怎么办?然后它们被保存在一个地方,你必须通过它们线性地找到你的价值。 所以如果你运气不好,你可以让所有带有 hashmap 的键都具有相同的 hash = 结果是 O(n)。

此外,当您添加越来越多的数字时,冲突的可能性也在增加,因此对于很多数字,您最终会得到 O(n)。


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

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

【讨论】:

  • 感谢您的解释。关于解决方案,也许最好提到时间复杂度对于面试官的合理数量的值将是线性的。
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2019-11-09
  • 2017-07-10
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多