2010-06-14 29 views
5

Tôi muốn có một đại diện cho các chuỗi với các hoạt động nối và chỉnh sửa nhanh. Tôi đã đọc bài báo "Ropes: an Alternative to Strings", nhưng có bất kỳ cải tiến đáng kể nào trong lĩnh vực này kể từ năm 1995 không?Biểu diễn chuỗi: cải tiến qua dây giềng?

EDIT: Một khả năng tôi đã xem xét trước đây là sử dụng 2-3 finger tree với các chuỗi như lá, nhưng tôi chưa thực hiện phân tích chi tiết về điều này; điều này cho phép bổ sung/xóa thời gian liên tục được phân bổ trên các đầu và lôgarit (trong số các đoạn của chuỗi nhỏ hơn) nối, ngược lại với ngược lại đối với các sợi dây.

+1

Tôi đã đề cập đến chủ đề này trong vài giây từ http://wiki.sharpdevelop.net/AvalonEdit.ashx và muốn biết chính xác điều tương tự :-) Hãy xem ... – jdehaan

+0

Loại cải tiến nào là bạn hy vọng tìm thấy? –

+0

Nhanh hơn tiệm cận, hoặc các yếu tố không đổi, hoặc sử dụng bộ nhớ ít hơn. –

Trả lời

1

Đây là câu hỏi cũ! Tôi tự hỏi nếu có ai đọc điều này. Nhưng nó vẫn hấp dẫn. Trong bình luận của bạn, bạn nói bạn tìm kiếm:

nhanh hơn asymptotics, hoặc liên tục yếu tố, hoặc sử dụng bộ nhớ ít

Vâng, dây thừng có O (1) chèn, và O (n) lặp lại. Bạn không thể làm tốt hơn thế. Substrings và lập chỉ mục rõ ràng sẽ tốn kém hơn. Nhưng hầu hết các trường hợp sử dụng cho các tài liệu lớn không yêu cầu chỉnh sửa hoặc truy cập ngẫu nhiên. Nếu bạn chỉ nối vào cuối, một vector/danh sách các chuỗi 1D có thể cải thiện hằng số thời gian chèn. Tôi đã từng sử dụng nó trong JavaScript bởi vì nó có chuỗi ký tự chậm như vậy.

Người ta nói rằng biểu diễn bộ nhớ kém hiệu quả hơn việc sử dụng chuỗi. Tôi nghi ngờ rằng: Nếu bạn làm việc trong một ngôn ngữ có bộ sưu tập rác, thì dây thừng cho phép bạn sử dụng cùng một thể hiện đoạn dây ở nhiều nơi. Trong một sợi dây đại diện cho một tài liệu HTML, sẽ có nhiều yếu tố của DIV, SPANLINK. Điều này thậm chí có thể xảy ra tự động giả định các thẻ này được biên dịch hằng số thời gian, và bạn thêm chúng vào dây trực tiếp. Ngay cả đối với các cụm từ ngắn như vậy, tài liệu dây sẽ giảm kích thước đáng kể, với cùng một thứ tự độ lớn như chuỗi gốc. Các chuỗi dài hơn sẽ tạo ra lợi ích ròng.

Nếu bạn cũng làm cho cây đứng đầu chỉ đọc, bạn có thể tạo các nhánh con (cụm từ dài hơn được biểu thị bằng dây thừng), xảy ra nhiều lần hoặc được chia sẻ qua dây dựa trên dây. Nhược điểm của việc chia sẻ này là các phần dây shard như vậy không thể thay đổi: để chỉnh sửa chúng, hoặc để cân bằng cây bạn cần phải sao chép đồ thị đối tượng. Nhưng điều đó không quan trọng nếu bạn chủ yếu là nối và lặp lại. Trong một máy chủ web, bạn có thể giữ một subrope mà repesents tuyên bố CSS stylesheet được chia sẻ trên tất cả các tài liệu HTML phục vụ bởi máy chủ đó.

+0

Vâng, tôi đang đọc :) "Bạn không thể làm tốt hơn thế." Nhưng tôi có thể làm, ví dụ: O (1) nối (và vẫn O (n) lặp lại). Tôi, tất nhiên, nhận thức được rằng cấu trúc dữ liệu liên tục cho phép chia sẻ. –

Các vấn đề liên quan