【发布时间】:2019-07-31 09:24:44
【问题描述】:
我正在研究一些常见算法的解决方案,并且遇到了一些我很好奇的东西。我试图通过谷歌搜索并查看一些规范来自己找到答案,但我无法找到我的问题的答案。下面的算法基本上检查第一个数组中的每个项目是否在第二个数组中都有对应的项目平方。天真的解决方案(正如他们所说)将具有某种嵌套循环并被视为 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
【问题讨论】:
-
**在做什么,我的意思是它应该做什么? -
它基本上是对第一个数组的值进行平方。我猜你可以把它想象成 key * key。
-
@NinaScholz 这是 ES2016 中引入的 exponentiation operator
-
我知道它在做什么,但为什么在代码中?
-
@JonasWilms,哦,对了,谢谢。我也应该读一下案文。这对我来说太散文了。
标签: javascript algorithm