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



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

他给了我一个问题: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的基础。

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

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

如果两个字符串具有相同的哈希值怎么办?然后它们被保存在一个地方,你必须通过它们来找到你的价值。 因此,如果您运气不好,您可以使用具有相同哈希 = 结果为 O(n( 的所有带有哈希映射的键。

此外,当您添加越来越多的数字时,碰撞的可能性正在增加,因此对于批号,您最终会得到 O(n(。


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

为了查找重复项,我认为没有线性时间运行的算法。您可以通过对n log n进行排序并浏览来做到这一点

相关内容

最新更新