Kết quả tích cực: kiên trì không tốn quá nhiều. Người ta có thể chỉ ra rằng mọi cấu trúc dữ liệu có thể được thực hiện hoàn toàn bền bỉ với tối đa độ chậm .O(lgn)
Bằng chứng: Bạn có thể lấy một mảng và làm cho nó bền bỉ bằng cách sử dụng các cấu trúc dữ liệu tiêu chuẩn (ví dụ: cây nhị phân cân bằng; xem phần cuối của câu trả lời này để biết thêm chi tiết). Điều này phát sinh sự chậm lại : mỗi lần truy cập mảng mất thời gian O ( lg n ) với cấu trúc dữ liệu liên tục, thay vì thời gian O ( 1 ) cho mảng không liên tục. Bây giờ lấy bất kỳ thuật toán bắt buộc nào có thời gian chạy trong mô hình RAM là O ( f ( n ) ) , trong đó n biểu thị lượng bộ nhớ được sử dụng. Đại diện cho tất cả bộ nhớ là một mảng lớn (vớiO(lgn)O(lgn)O(1)O(f(n))n phần tử) và làm cho nó bền bỉ bằng cách sử dụng bản đồ liên tục. Mỗi bước của thuật toán bắt buộc phải chịu nhiều nhất là làmchậm O ( lg n ) , do đó tổng thời gian chạy là O ( f ( n ) lg n ) .nO(lgn)O(f(n)lgn)
Rõ ràng có thể làm tốt hơn một chút: rõ ràng người ta có thể giảm hệ số làm chậm xuống (dự kiến, thời gian khấu hao), sử dụng các kỹ thuật trong bài báo Demaine được trích dẫn bên dưới - nhưng tôi không quen với các chi tiết của công việc đó, vì vậy tôi không thể tự bảo đảm điều này. Cảm ơn jbapple cho quan sát này.O(lglgn)
Kết quả tiêu cực: bạn không thể tránh một số chậm, đối với một số cấu trúc dữ liệu. Để trả lời câu hỏi thứ ba của bạn, tồn tại các cấu trúc dữ liệu nơi được biết là làm cho chúng bền bỉ giới thiệu một số chậm.
nO(1)O(1)Ω(lglgn)
Giới hạn dưới được quy cho Mihai Patrascu, nhưng không có trích dẫn nào cho một nguồn cung cấp các chi tiết về bằng chứng của giới hạn dưới được khẳng định này.
O(1)
Ngoài ra còn có một kết nối mạnh mẽ với các ngôn ngữ lập trình chức năng. Cụ thể, mọi cấu trúc dữ liệu có thể được thực hiện theo cách hoàn toàn chức năng (không có đột biến) đã là cấu trúc dữ liệu bền vững. (Chuyện ngược lại không nhất thiết phải như vậy, than ôi.) Nếu bạn muốn nheo mắt, bạn có thể coi đây là một định lý phân loại một phần yếu: nếu nó có thể thực hiện được bằng ngôn ngữ lập trình chức năng thuần túy với cùng giới hạn như trong một ngôn ngữ bắt buộc, sau đó có một cấu trúc dữ liệu liên tục với giới hạn cùng thời gian với ngôn ngữ không liên tục. Tôi nhận ra đây có lẽ không phải là thứ bạn đang tìm kiếm - nó chủ yếu chỉ là một sự tái hiện tầm thường của tình huống.
O(lgn)
ℓdd
nO(lgn)O(lgn)O(lgn)
Bạn có thể tìm thấy nhiều lời giải thích hơn, với những bức ảnh đẹp, tại các tài nguyên sau:
Điều đó sẽ cho bạn ý chính. Có nhiều chi tiết cần quan tâm, nhưng các chi tiết nằm ngoài phạm vi của câu hỏi này. May mắn thay, đây là tất cả các công cụ tiêu chuẩn và có rất nhiều thông tin có sẵn trong tài liệu về cách xây dựng các cấu trúc dữ liệu đó. Vui lòng đặt câu hỏi riêng nếu các tài nguyên trên không đủ và bạn muốn biết thêm thông tin về các chi tiết xây dựng cấu trúc dữ liệu mảng liên tục.