辞書の場合、BFSが最適ですが、必要な実行時間はそのサイズ(V + E)に比例します。n文字の場合、辞書の全体が〜a ^ nになる可能性があります。ここで、aはアルファベットサイズです。辞書にチェーンの最後にあるはずの単語以外のすべての単語が含まれている場合は、考えられるすべての単語をトラバースしますが、何も見つかりません。これはグラフ走査ですが、サイズが指数関数的に大きくなる可能性があります。
構造を「インテリジェントに」参照して多項式時間で実行することで、より高速に実行できるかどうか疑問に思われるかもしれません。答えは、私が思うに、いいえです。
問題:
単語が辞書にあるかどうかをチェックする高速(線形)方法が与えられます。2つの単語u、vであり、シーケンスu-> a 1-> a 2-> ...->anがあるかどうかをチェックします。->v。
NP困難です。
証明:次のような3SATインスタンスを取得します
(pまたはqまたはrではない)および(pまたはqまたはrではない)
0 000 00から始めて、222222に進むことができるかどうかを確認します。
最初の文字は「終了しました」で、次の3つのビットがp、q、rを制御し、次の2つのビットが句を制御します。
許可される単語は次のとおりです。
- 0で始まり、0と1のみを含むもの
- 2で始まり、合法であるもの。これは、0と1で構成されていることを意味します(最初の文字が2であることを除いて、すべての句ビットは変数ビットに従って正しく設定され、1に設定されます(したがって、これは式が満足できることを示します)。
- 少なくとも2つの2で始まり、0と1で構成されるもの(正規表現:222 *(0 + 1)*、22221101のように、2212001ではない
0000000から222222を生成するには、次のようにする必要があります。
(1)適切なビットを反転します(例:0 100 111)。これには、3SATソリューションを見つける必要があります。
(2)最初のビットを2:2 100 111に変更します。ここで、これが実際に3SATソリューションであることが確認されます。
(3)変更2100111-> 2200111-> 2220111-> 2222111-> 2222211->2222221-2222222。
これらのルールは、チート(チェック)できないことを強制します。2 222 22に進むことができるのは、式が満足できる場合のみであり、それがNP困難であることを確認する必要があります。それはさらに難しいかもしれないと思いますが(おそらく#PまたはFNP)、その目的にはNP困難で十分だと思います。
編集:互いに素なセットのデータ構造に興味があるかもしれません。これはあなたの辞書とお互いから到達できるグループの単語を取ります。すべての頂点からルートまたは他の頂点へのパスを保存することもできます。これにより、必ずしも最短のパスではなく、パスが提供されます。