いくつかの文字列フラグメントがある場合、すべてのフラグメントを含む可能な限り短い単一の文字列(「出力文字列」)を見つけたいと思います。フラグメントは、出力文字列で互いにオーバーラップできます。
例:
文字列フラグメントの場合:
BCDA
AGF
ABC
次の出力文字列はすべてのフラグメントを含み、単純な追加によって作成されました。
BCDAAGFABC
ただし、この出力文字列はオーバーラップを採用しているため、優れています(短い)。
ABCDAGF
^
ABC
^
BCDA
^
AGF
この問題のアルゴリズムを探しています。厳密に最も短い出力文字列を見つけることは絶対に重要ではありませんが、短いほど良いです。私は、入力フラグメントのすべての順列を追加してオーバーラップを削除しようとする明らかな単純なアルゴリズム(NP-Completeのように見える)よりも優れたアルゴリズムを探しています。
私は解決策に取り組み始めましたが、それは非常に興味深いものです。他の人が何を考えているのか知りたいです。しばらくの間、この質問に進行中の作業を追加します。
あなたが尋ねているのは、すべてのケースで機能するアルゴリズムがない、最短の共通スーパーストリング問題です。しかし、これは一般的な問題であり(圧縮およびDNAシーケンシングにおいて)、いくつかの近似アルゴリズムがよく知られています。
「Greedy」アルゴリズムは、最も効果的であると一般に認められています(最悪のケースが最も悪い場合など)。
詳細については、論文 Jonathan Turnerによる最短の共通スーパーストリング問題の近似アルゴリズム を参照してください。