Tôi thấy rằng có rất nhiều tranh cãi về sự phức tạp tiệm cận của List.Add()
. Nguồn của nó tôi nghi ngờ là trường hợp xấu nhất kịch bản that causes underlying array to resize và sẽ hợp lý là hoạt động O(n)
. Tuy nhiên, array grows twice in size mỗi danh sách thời gian hết dung lượng. Điều đó làm cho số lượng thay đổi kích thước cần thiết cho các yếu tố n
tỷ lệ thuận với log(n)
.Độ phức tạp tiệm cận của List.Add là gì?
Điều đó không có nghĩa là sự phức tạp tiệm cận của hoạt động Add
trong trường hợp trung bình sẽ là O(n/log(n))
?
Điểm chuẩn thực sự cho List.Add()
ở bên dưới. Tuy nhiên, điểm chuẩn không thực sự biểu cảm cho hoạt động như vậy - chúng tôi có thể hết bộ nhớ trước khi bất kỳ độ lệch nào từ đường thẳng (trong thang logarit) trở nên hiển thị.
Khi mảng tăng trưởng thực sự thì các phần tử N/2 hiện có được di chuyển. Đó là lý do tại sao bạn nghĩ đó là log N. Nhưng sự tăng trưởng năng lực mới chưa được công bố theo cấp số nhân. Điều đó phản tác dụng. Phần tử đầu tiên được di chuyển nhật ký N lần. Các phần tử N/2 cuối cùng được di chuyển 0 hoặc 1 lần. – usr