2011-10-10 90 views
14

任何人都知道在常见实现中ECMAScript5的Object.keys()的时间复杂性? n钥匙是O(n)吗?假设一个哈希实现,时间与散列表的大小成正比吗?Object.keys()的复杂性?

我正在寻找语言实现者或一些现实世界基准的保证。

+2

多少键你希望是具有,这样他们列举事项的时间复杂度? – Gabe

+0

我不认为它可以小于'O(n)' –

+0

@PabloFernandez,长度小于O(n) – Joe

回答

14

,似乎是在O(n) V8(铬,Node.js的)至少:

> var hash = {} 
> , c = 0; 
> 
> var s = +new Date();Object.keys(hash);console.log(+new Date() - s); 
0 
> for(var i=0; i<100000; i++, c++){ hash[c] = 1; } 
> var s = +new Date();Object.keys(hash);console.log(+new Date() - s); 
26 
> for(var i=0; i<100000; i++, c++){ hash[c] = 1; } 
> var s = +new Date();Object.keys(hash);console.log(+new Date() - s); 
49 
> for(var i=0; i<100000; i++, c++){ hash[c] = 1; } 
> var s = +new Date();Object.keys(hash);console.log(+new Date() - s); 
75 
> for(var i=0; i<100000; i++, c++){ hash[c] = 1; } 
> var s = +new Date();Object.keys(hash);console.log(+new Date() - s); 
102  
+0

这些结果对密集哈希映射有意义。随着密钥越来越稀疏,性能是否会降低? – hurrymaplelad

+0

@hurrymaplelad - 什么?所有的JS哈希键都是字符串。这段代码有效地生成了'{'1':1,'2':1,'3':1,...}'_sparse_ vs _dense_键对散列实现无效,只有数组才有意义。对于引擎来说,将数组作为一个数组来实现是没有意义的,因为数字索引通常很少。虽然如果你想测试一下,只需要将'C++'改成'c + = Math.random()',这会给你完全不相关的键。 –

+0

@cwolves:'Array'对象只是一个对象,其属性应该是整数。这些并不是非常罕见,当然有JS实现使用数组来支持'Array'实例。 – Gabe