Đây là vấn đề siêu dây ngắn nhất: bạn đang trao chuỗi s 1 , ... , s n trên một số bảng chữ cái Σ và bạn muốn tìm chuỗi ngắn hơn Σ chứa mỗi s i là một dãy ký tự liên tiếp, tức là một chuỗi con.ns1,…,snΣΣsi
Khi chúng ta nói về các thuật toán chính xác cho vấn đề, việc tìm độ dài của siêu chuỗi ngắn nhất tương đương với việc tìm mức nén tối đa C là tổng của tất cả các chuỗi trùng lặp liên tiếp trong siêu chuỗi cuối cùng, tức là C = ∑ i | s i | - L .LCC=∑i|si|−L
Theo như tôi biết, thuật toán chính xác nhanh nhất để chạy siêu dây ngắn nhất trong ( 2 n ), nơi n là số các chuỗi. Đây là một thuật toán lập trình động đơn giản tương tự như thuật toán lập trình động cho đường dẫn dài nhất (và các vấn đề khác):O∗2nn
Đối với mỗi tập hợp con của chuỗi và chuỗi v trong S, chúng tôi tính toán nén tối đa trên tất cả các siêu chuỗi trên S trong đó v là chuỗi đầu tiên xuất hiện trong siêu chuỗi, lưu trữ chuỗi này dưới dạng C (( v , S )). Chúng tôi thực hiện điều này bằng cách trước tiên xử lý tất cả các tập hợp con chỉ có một phần tử và sau đó xây dựng các giá trị C (( v , S )) cho các tập hợp con S trên chuỗi k từ các chuỗi trên k - 1SvSSvv,Sv,SSkk−1 chuỗi. Đặc biệt:
Đối với mỗi chuỗi chúng ta nhìn vào tất cả các tập con S ' trên k - 1 chuỗi mà không làm bao gồm u và thiết lập giá trị cho ( u , u ∪ S ' ) đến mức tối đa trên dây v trong S ' của tổng mức tối đa trùng lặp của u với v với C (( v , S ′ )).uS′k−1uu,u∪S′vS′uvv,S′
Thời gian chạy cuối cùng không quá O ( ) trong đó l là độ dài chuỗi tối đa.n22n+n2ll
Có các thuật toán tốt hơn nếu bạn giả sử rằng nhỏ, hoặc các cặp trùng lặp nhỏ, kích thước bảng chữ cái nhỏ, v.v., nhưng tôi không biết bất kỳ thuật toán nào nhanh hơn 2 n .l2n