นี่เป็นปัญหา superstring สั้น: คุณจะได้รับสตริงs 1 , ... , s nบางตัวอักษรΣและคุณต้องการที่จะหาสตริงที่สั้นกว่าΣที่มีแต่ละs ฉันเป็น subsequence ของตัวละครต่อเนื่องเช่นสตริงย่อยns1,…,snΣΣsi
เมื่อเราพูดถึงอัลกอริธึมที่แน่นอนสำหรับปัญหาการค้นหาความยาวของ superstring ที่สั้นที่สุดเทียบเท่ากับการค้นหาการบีบอัดสูงสุดCซึ่งเป็นผลรวมของการซ้อนทับสตริงทั้งหมดที่อยู่ติดกันใน superstring สุดท้ายเช่นC = ∑ i | s i | -LC .C=∑i|si|−L
เท่าที่ฉันรู้อัลกอริทึมที่แน่นอนที่เร็วที่สุดสำหรับ superstring ที่สั้นที่สุดจะทำงานใน ( 2 n ) โดยที่nคือจำนวนสตริง นี่เป็นอัลกอริทึมการเขียนโปรแกรมแบบไดนามิกที่เรียบง่ายคล้ายกับอัลกอริทึมการเขียนโปรแกรมแบบไดนามิกสำหรับเส้นทางที่ยาวที่สุด (และปัญหาอื่น ๆ ):O∗2nn
For each subset of strings S and string v in S we compute the maximum compression over all superstrings over S where v is the first string appearing in the superstring, storing this as C((v,S)). We do this by first processing all subsets with only one element, and then building up the C((v,S)) values for subsets S on k strings from those on k−1 strings. Specifically:
For each string u we look at all subsets S′ on k−1 strings that don't include u and set the value for (u,u∪S′) to the maximum over
strings v in S′ of the sum of the maximum overlap of u with v with C((v,S′)).
The final runtime is no more than O(n22n+n2l) where l is the maximum string length.
There are better algorithms if you assume that l is small, or the pairwise overlaps are small, the alphabet size is small etc, but I am not aware of any algorithm that's faster than 2n.