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