2011-10-10 42 views
14

Bất cứ ai cũng biết sự phức tạp về thời gian của Object.keys của ECMAScript5() trong việc triển khai phổ biến? Có phải là O(n) cho các phím n không? Là thời gian tỷ lệ thuận với kích thước của bảng băm, giả sử một thực hiện băm?Object.keys() phức tạp?

Tôi đang tìm kiếm sự đảm bảo của người triển khai ngôn ngữ hoặc một số điểm chuẩn trên thế giới thực.

+2

bao nhiêu phím nào bạn mong đợi để được có, như vậy mức độ phức tạp thời gian để đếm chúng quan trọng? – Gabe

+0

Tôi không nghĩ rằng nó có thể nhỏ hơn 'O (n)' –

+0

@PabloFernandez, chiều dài ít hơn O (n) – Joe

Trả lời

14

Nó dường như là O(n) trong V8 (chrome, Node.js) ít nhất:

> 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

Những kết quả này có ý nghĩa đối với bản đồ băm dày đặc. Hiệu suất có suy giảm khi các phím bị thưa thớt hơn không? – hurrymaplelad

+0

@hurrymaplelad - Cái gì? Tất cả các khóa băm JS là các chuỗi. Mã này có hiệu quả tạo ra các phím '{'1': 1, '2': 1, '3': 1, ...}' _sparse_ vs _dense_ không có ý nghĩa đối với việc triển khai băm, chỉ mảng. Và nó thực sự không có ý nghĩa gì đối với một động cơ để thực hiện một băm như một mảng vì các chỉ mục số thường khá hiếm. Mặc dù nếu bạn muốn kiểm tra vì một lý do nào đó, bạn chỉ cần thay đổi 'C++' thành 'c + = Math.random()', nó sẽ cung cấp cho bạn các khóa hoàn toàn không liên kết. –

+0

@cwolves: Đối tượng 'Array' chỉ là đối tượng có thuộc tính được mong đợi là số nguyên. Đó không phải là điều hiếm hoi, và chắc chắn có các triển khai JS sử dụng các mảng để trả về các cá thể 'Array'. – Gabe

Các vấn đề liên quan