Tôi đã nghĩ về câu hỏi sau đây về kiến trúc của máy tính. Giả sử tôi làm trong PythonHiệu suất của danh sách (...). Chèn (...)
from bisect import bisect
index = bisect(x, a) # O(log n) (also, shouldn't it be a standard list function?)
x.insert(index, a) # O(1) + memcpy()
mà mất log n
, cộng thêm, nếu tôi một cách chính xác hiểu nó, một hoạt động bộ nhớ bản sao cho x[index:]
. Bây giờ tôi đọc gần đây rằng nút cổ chai thường là trong giao tiếp giữa bộ xử lý và bộ nhớ để bản sao bộ nhớ có thể được thực hiện bằng RAM khá nhanh. Nó hoạt động như thế nào?
Vâng, tôi không nói rằng memcpy() là O (1) - Tôi biết đó là O (n), nhưng hằng số có thể nhỏ - và tôi không chắc nó có thực sự được tối ưu hóa bởi bộ nhớ hay không. Nhưng nếu nó được tối ưu hóa để được, nói, nhanh hơn 1000 lần bạn nghĩ ngây thơ, đó có thể là một cái gì đó đáng để biết. –
Trong một số trường hợp, có thể không còn bất kỳ dấu cách nào trong danh sách, do đó toàn bộ danh sách phải được sao chép sau khi bộ nhớ miễn phí mới được cấp phát thay vì chỉ một memmove/memcpy. –
Câu trả lời là hợp lệ, nhưng đoạn đầu tiên không nhất thiết phải đúng. Một ngôn ngữ có thể xác định các hoạt động nào được thiết kế để có hiệu quả trong một số trường hợp nhất định, để thậm chí không nhìn vào mã nguồn của một triển khai cụ thể, bạn có thể tự tin về các đặc tính hiệu suất nhất định của các hoạt động đó. – LarsH