Mảng trong JavaScript rất dễ sửa đổi bằng cách thêm và bớt các mục. Nó phần nào che giấu thực tế rằng hầu hết các mảng ngôn ngữ có kích thước cố định và yêu cầu các hoạt động phức tạp để thay đổi kích thước. Có vẻ như JavaScript làm cho nó dễ dàng viết mã mảng hoạt động kém. Điều này dẫn đến câu hỏi:
Tôi có thể mong đợi hiệu suất nào (về độ phức tạp theo thời gian O lớn) từ việc triển khai JavaScript liên quan đến hiệu suất mảng?
Tôi giả sử rằng tất cả các triển khai JavaScript hợp lý có ít nhất các chữ O lớn sau đây.
- Truy cập - O (1)
- Appending - O (n)
- Chi tiêu trước - O (n)
- Chèn - O (n)
- Xóa - O (n)
- Hoán đổi - O (1)
JavaScript cho phép bạn điền trước một mảng đến một kích thước nhất định, sử dụng new Array(length)
cú pháp. (Câu hỏi bổ sung: Đang tạo một mảng theo cách này O (1) hoặc O (n)) Đây giống như một mảng thông thường và nếu được sử dụng như một mảng có kích thước trước, có thể cho phép O (1) thêm vào. Nếu logic đệm tròn được thêm vào, bạn có thể đạt được O (1) trước. Nếu một mảng mở rộng động được sử dụng, O (log n) sẽ là trường hợp trung bình cho cả hai.
Tôi có thể mong đợi hiệu suất tốt hơn cho một số điều so với giả định của tôi ở đây không? Tôi không mong đợi bất kỳ điều gì được nêu trong bất kỳ thông số kỹ thuật nào, nhưng trên thực tế, có thể là tất cả các triển khai chính đều sử dụng các mảng được tối ưu hóa đằng sau hậu trường. Có các mảng mở rộng động hoặc một số thuật toán tăng hiệu suất khác đang hoạt động không?
PS
Lý do tôi tự hỏi điều này là tôi đang nghiên cứu một số thuật toán sắp xếp, hầu hết trong số đó dường như giả sử thêm và xóa là các phép toán O (1) khi mô tả tổng thể O lớn của chúng.
length
tính và phân bổ trước không gian là hai việc hoàn toàn khác nhau.
array[5]
trên a new Array(10)
là O (1) không?
.length
nhưng đó là về nó.) Mảng thực sự không khác nhiều so với các đối tượng đơn giản.