Thực hiện cấu trúc dữ liệu bất biến (liên tục) giống như mảng với lập chỉ mục nhanh, nối thêm, trả trước, lặp


11

Tôi đang tìm kiếm một cấu trúc dữ liệu liên tục tương tự như mảng (nhưng không thay đổi), cho phép lập chỉ mục nhanh, nối thêm, trả trước và lặp lại (địa phương tốt).

Clojure cung cấp Vector liên tục, nhưng nó chỉ để nối nhanh. Scala's Vector có thêm và bổ sung thời gian liên tục một cách hiệu quả, nhưng tôi không thể hiểu được cách thức triển khai, vì nó dựa trên cùng cấu trúc dữ liệu (vectơ ánh xạ bit) như vectơ Clojure, và, như tôi hiểu, trie vector ánh xạ bit không thể có tiền gửi nhanh mà không có một số thủ thuật.

Tôi quan tâm không sẵn sàng để sử dụng triển khai nhưng trong một mô tả về cách tự thực hiện cấu trúc dữ liệu như vậy.

Câu trả lời:


13

Ứng cử viên rõ ràng là một cây nhị phân cân bằng liên tục . Tất cả các thao tác bạn liệt kê có thể được thực hiện trong thời gian hoặc , sử dụng sao chép đường dẫn . Để biết thêm chi tiết về cách đạt được thời gian chạy này, hãy xem cuốn sách của Chris Okasaki được tham khảo bên dưới hoặc câu trả lời của tôi ở đây .O ( lg n )O(1)O(lgn)

Tất nhiên, là một biến thể, mỗi lá của một cây như vậy có thể chứa một mảng bất biến (một chuỗi các giá trị liên tiếp). Điều này làm cho việc cập nhật một giá trị kém hiệu quả hơn, nhưng nó có thể hoạt động tốt cho tình huống của bạn, nếu bạn không bao giờ có ý định sửa đổi một giá trị hiện tại, chỉ cần nối thêm và trả trước. Theo cách này, vectơ của bạn được biểu diễn dưới dạng một chuỗi các chuỗi bất biến, được biểu diễn dưới dạng cây nhị phân cân bằng với các mảng bất biến trong các lá. Điều này cho phép lập chỉ mục nhanh (logarit trong số lượng lá), nối và nối nhanh, và lặp lại nhanh. Sự phức tạp tiệm cận trong trường hợp xấu nhất là không tốt hơn, nhưng hiệu suất trong thực tế có thể tốt hơn đáng kể.

Tài liệu tham khảo tiêu chuẩn là cuốn sách "Cấu trúc dữ liệu chức năng thuần túy" năm 1998 của Chris Okasaki.
Xem thêm


Cảm ơn bạn. Có vẻ như cây RRB là ứng cử viên tốt và họ đã thực hiện Clojure (chưa đầy đủ).
Tvaroh

Tôi đoán Okasaki cho chúng ta biết làm thế nào để đạt được những thời gian chạy dưới sự bất biến và kiên trì?
Raphael

1
@Raphael, yup. Tôi đã thêm tài liệu tham khảo để giải thích cách bạn đạt được thời gian chạy (bắt đầu câu trả lời của tôi).
DW

4

Tôi đã mô tả một triển khai cấu trúc dữ liệu như vậy trong bài viết của mình về kết hợp biểu thức chính quy gia tăng - xem http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation và văn bản bên dưới và bên trên phần đó .

Đó là một loạt các cây có chiều cao không đổi (như cây B hoặc 2-3 cây). Về cơ bản, đó là một cây (2,3), có các lá (N, 2N-1), để tránh chi phí cho mỗi phần tử. Mảng (A, N, 2N-1) là một mảng có độ dài trong phạm vi N..2N-1.) N lớn hơn cung cấp cho bạn chi phí nhỏ hơn nhưng tuyến tính làm tăng sự phức tạp của việc tách và ghép. Các hoạt động như lập chỉ mục, chia tách và ghép nối rất giống với cách chúng hoạt động trong 2-3 cây, khái quát hóa thành (N, 2N-1) ở cấp độ lá.


Liên kết bị phá vỡ; vui lòng cung cấp một tài liệu tham khảo phù hợp, mạnh mẽ (cho phép mọi người tìm thấy bài viết của bạn mà không cần liên kết).
Raphael

Tôi đã không xuất bản bài báo trên bất kỳ tạp chí nào, chỉ trên trang web cá nhân của tôi. Có lẽ nên đặt nó trên Arxiv, ý kiến ​​hay.
jkff

Tôi chủ yếu nghĩ về tác giả, tiêu đề và năm - điều đó làm cho việc Google trở nên dễ dàng hơn nếu cần. Đưa nó vào arXiv sẽ còn tốt hơn nữa, đúng vậy!
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.