Vì sao thao tác thêm phần tử vào cuối mảng động (dynamic array) được coi là O(1) amortized dù đôi khi phải cấp phát lại toàn bộ mảng?
- AVì hệ điều hành cấp sẵn trang nhớ liền kề nên mở rộng mảng không cần copy
- BVì dung lượng nhân đôi nên tổng chi phí copy của n lần thêm nhỏ hơn 2nĐáp án đúng
- CVì amortized nghĩa là bỏ qua trường hợp xấu nhất khi nó xảy ra hiếm
- DVì cấp phát lại chạy nền ở luồng khác nên không tính vào chi phí thao tác thêm
Vì dung lượng được nhân đôi mỗi lần đầy. Tổng chi phí copy sau n lần thêm là 1 + 2 + 4 + … + n < 2n, tức trung bình dưới 2 thao tác copy cho mỗi lần thêm. Chi phí O(n) lẻ tẻ được "trả góp" đều vào các lần thêm O(1) trước đó.
make([]T, 0, n) trong Go hay reserve() trong C++; (2) chi phí O(n) lẻ tẻ vẫn là độ trễ có thật ở một request cụ thể, nên hệ thống nhạy độ trễ đuôi (tail latency) không thể chỉ nhìn con số amortized.Nguồn tham khảo