2011-10-10 88 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