Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript是否;在;操作员在引擎盖下执行循环?_Javascript_Algorithm - Fatal编程技术网

JavaScript是否;在;操作员在引擎盖下执行循环?

JavaScript是否;在;操作员在引擎盖下执行循环?,javascript,algorithm,Javascript,Algorithm,我在研究一些常用算法的解决方案,我偶然发现了一些我很好奇的东西。我试图通过谷歌搜索和查看一些规范来找到答案,但我找不到问题的答案。下面的算法主要检查第一个数组中的每个项是否在第二个数组中都有对应的项平方。天真的解决方案(如他们所说)将具有某种嵌套循环,并被视为O(n2)。下面写解决方案的人说这是O(n) 我不明白这怎么可能是O(n),因为他在循环中使用Javascript“in”操作符。据我所知,操作符检查它所比较的值是否存在于对象中如果它没有穿过发动机罩下的物体,它是如何做到这一点的?这真的是

我在研究一些常用算法的解决方案,我偶然发现了一些我很好奇的东西。我试图通过谷歌搜索和查看一些规范来找到答案,但我找不到问题的答案。下面的算法主要检查第一个数组中的每个项是否在第二个数组中都有对应的项平方。天真的解决方案(如他们所说)将具有某种嵌套循环,并被视为O(n2)。下面写解决方案的人说这是O(n)

我不明白这怎么可能是O(n),因为他在循环中使用Javascript“in”操作符。据我所知,操作符检查它所比较的值是否存在于对象中如果它没有穿过发动机罩下的物体,它是如何做到这一点的?这真的是线性时间复杂性吗?

功能相同(arr1、arr2){
如果(arr1.length!==arr2.length){
回来
}
设frequencyMap1={};
设frequencyMap2={};
for(让val of arr1){
frequencyMap1[val]=(frequencyMap1[val]| | 0)+1;
}
对于(让val的arr2){
frequencyMap2[val]=(frequencyMap2[val]| | 0)+1;
}
for(让我们输入frequencyMap1){
如果(!(frequencyMap2中的**2键)){
返回false;
}
if(frequencyMap2[键**2]!==frequencyMap1[键]){
返回错误
}
}
返回true;
}

log(相同([1,2,3],[1,4,9]);//true
在对象中查找键是O(1)<代码>用于。。在和仅在中的运算符不同


无论一个对象中有多少个关键点,您都可以在固定时间内访问它
Object
Map
有一个哈希表来查找键。

这取决于具体情况。spec不保证对象的查找时间,所以这可能是O(n²)最坏的情况。但是,大多数引擎将表示对象,就像使用许多不同的键一样,然后查找时间为O(1),算法在O(n)处运行。

对于
中的
中的
有不同的答案:

中的
操作符查看对象(如有必要,查看对象的原型及其原型等),以查看该对象是否具有具有给定名称的属性。在任何半正常的JavaScript引擎中,除了原型链中的循环之外,这都不会涉及其他循环(在一个好的JavaScript引擎中,甚至不会,因为在一个好的JavaScript引擎中,对象被实现为JIT类,因此它们知道自己的结构)


for in
循环遍历对象及其原型中可枚举属性的名称。所以很自然地,这涉及到一个循环(可能是嵌套的,因为涉及到原型链)。

它在做什么,我的意思是它应该做什么?它基本上是将第一个数组的值平方。我想你可以把它看作是key*key。@NinaScholz这是在ES2016i中引入的。我知道它在做什么,但为什么在代码中出现?@jonaswillms,哦,对了,谢谢。我也应该读课文。这对我来说太难了。我知道在键/值中查找值是恒定的。我不知道相同的机制用于查找密钥。更清楚一点,在
中,
for…是O(n),而在
中,
就是O(1)。@aaron哈希表通常是基于哈希键存储在数组中的键值对列表。要从密钥中获取值,将生成散列,在密钥散列位置进行搜索(因为散列可能会发生冲突),找到具有所需密钥的密钥对,然后返回值<在
中,code>做了同样的事情,只是它不返回值。@Jonas,谢谢。在哈希表中,O(1)只是平均大小写。最坏的情况仍然是O(n),所以假设在
循环中使用
for…时,您仍然可以处理O(n²)最坏的情况。@patrick,这将假设所有哈希冲突,我打赌这不会发生在所有键上,所以我认为我们可以安全地假设这是“假设的”这种情况永远不会发生。我只是指出有一种明显的可能性,尽管可能性很小。相反,数组和通常的对象原型存储在顺序内存中,因此对于这些类型的对象,访问在所有情况下都是O(1),而不是哈希表支持的对象。