Tôi đang tìm kiếm một cấu trúc dữ liệu mà các cửa hàng một tập hợp các chuỗi trên một bộ ký tự , khả năng thực hiện các hoạt động sau đây. Chúng tôi biểu thị D ( S ) là cấu trúc dữ liệu lưu trữ các thiết lập của chuỗi S .
Add-Prefix-Set
trên : được cung cấp một số bộ T của chuỗi (có thể trống), có kích thước được giới hạn bởi một hằng số và có độ dài chuỗi được giới hạn bởi một hằng số, trả về D ( { t s | t ∈ T , s ∈ S } ) . Cả hai hằng bounding là toàn cầu: họ đều giống nhau cho tất cả các đầu vào T .Get-Prefixes
trên : trả về { a | a s ∈ S , a ∈ Σ } . Lưu ý rằng tôi không thực sự quan tâm những gì cấu trúc được sử dụng cho bộ này, miễn là tôi có thể liệt kê nội dung của nó trong O ( | Σ | ) thời gian.Remove-Prefixes
trên : trả về D ( { s | a s ∈ S , a ∈ Σ } ) .Merge
: Cho và D ( T ) , lợi nhuận D ( S ∪ T ) .
Bây giờ, tôi thực sự muốn thực hiện tất cả các hoạt động này trong thời gian , nhưng tôi ổn với cấu trúc thực hiện tất cả các hoạt động này trong thời gian o ( n ) , trong đó n là độ dài của chuỗi dài nhất trong kết cấu. Trong trường hợp hợp nhất, tôi muốn thời gian chạy o ( n 1 + n 2 ) , trong đó n 1 là n cho lần đầu tiên và n 2 the n cho cấu trúc thứ hai.
Một yêu cầu bổ sung là cấu trúc là bất biến, hoặc ít nhất là các hoạt động trên trả về các cấu trúc 'mới' sao cho con trỏ đến các cấu trúc cũ vẫn hoạt động như trước.
Một lưu ý về khấu hao: điều đó là tốt, nhưng bạn phải coi chừng sự kiên trì. Khi tôi sử dụng lại các cấu trúc cũ mọi lúc, tôi sẽ gặp rắc rối nếu gặp phải trường hợp xấu nhất với một số hoạt động cụ thể trên cùng một cấu trúc (vì vậy bỏ qua các cấu trúc mới mà nó tạo ra).
Tôi muốn sử dụng cấu trúc như vậy trong thuật toán phân tích cú pháp mà tôi đang làm việc; cấu trúc trên sẽ giữ giao diện tôi cần cho thuật toán.
Tôi đã xem xét sử dụng một Trie , nhưng vấn đề chính là tôi không biết làm thế nào để hợp nhất cố gắng một cách hiệu quả. Nếu bộ chuỗi chỉ Add-Prefix-Set
bao gồm các chuỗi ký tự đơn, thì bạn có thể lưu trữ các bộ này trong một ngăn xếp, điều này sẽ cung cấp cho bạn thời gian chạy cho ba thao tác đầu tiên. Tuy nhiên, cách tiếp cận này cũng không hoạt động để hợp nhất.
Cuối cùng, lưu ý rằng tôi không quan tâm đến các yếu tố : đây là hằng số cho tất cả những gì tôi quan tâm.
Add-Prefix-Set
trong đó)
Add-Prefix-Set
hoặc bạn bắt đầu với một chuỗi các chuỗi tùy ý?