2016-08-26 1 views
0

「料理」などの単語があり、その単語から作成できるすべての可能な単語のグラフを、各文字を他のすべての文字に置き換えて生成したい場合を考えてみましょう。重要な制限:文字の集合が単語であるかどうかを辞書に尋ねることはできますが、それは辞書へのインタフェースの限界です。辞書にすべてのn文字の単語を尋ねることはできません。その上すべての文字置換単語を生成するのに時間がかかりますか?

          cook 
           /  |  \ 
           aook  ...  zook 
          /| \   /| \ 
          aaok ... azok  zaok ... zzok 

とを次のような私はこれを想像

は、DAGを生成する再帰アルゴリズムになります。明らかに実際にはこれらの順列の多くは実際の言葉ではないと拒否されますが、最終的には生成されるすべての「言葉」を含むDAGを持つことになります。グラフの高さは、入力語の長さに1を加えたものになります。

最悪の場合、各置換は単語になります。最初のレベルは1語、第2レベルは25、次レベル(25 * 25)などです。したがって、nが単語の長さである場合、これはアルゴリズムが最悪の場合の時間複雑度が25^nであり、最悪の場合の記憶複雑性が25^nであることを意味すると考えていますか?

+0

このアルゴリズムは、間違っているか非効率的に聞こえます。グラフはなぜDAGですか?最初の文字を変更して最初のレベルを開始するのはなぜですか?最初の3文字を変更せずに、おなら - >ファームのようなトランジションが許可されていますか(または元の値に変更されていますか)? – user2357112

+0

グラフは指示と非循環のためDAGです。最初のレベルは最初の文字を変更することから始まります。なぜなら、各位置の文字をすべてのバリエーションに変更することによって、すべての可能な単語を生成しているからです。そして、あなたは最終的にそうすることによっておなら - >農場に行きます...しかし、あなたはまた手続き的にその言葉を歩いて 'ダーツ'、 '砦'などを生成します。すべての可能な単語のバリアントを生成する方法に関する別の提案がある場合は、それを聞いてうれしいです。 –

+1

元の単語の任意の数の文字を変更してすべての単語を見つけるだけの場合は、長さnのすべての単語のリストを単純に辞書から取り出すことができます。 – Faibbus

答えて

0

これは、ツリーとして表示するのではなく、グラフとして表示する方が良いでしょう。

nを入力とします。これは単語の長さです。

Wをすべて長さ$ n $の意味のある単語とします。

次のように単純なグラフGを構築:Gの頂点がWあります。 w1w2の2つの単語は、1つのチャーターで異なる場合にのみそれらを接続するエッジを持っています。

は次に何がやりたいことは以下の通りです:

Wに単語wを考えると、グラフGwの連結成分を見つけます。

これは、通常、depth-first search(DFS)またはbreadth-first search(BFS)で行われます。あなたのアルゴリズムはBFSのようなものですが、1つの場所が置換されたものだけでなく、単語のすべての近傍を生成する必要があるたびに、正しくはありません。

我々は$ n個の小さな$をとることができるので、時間の複雑さは、理論的には(非常に大きな大きなO定数とが)結果のサイズに

を直線的であるしかし、あなたはまた、メモリの同じ大きさを持つべきですどの単語が既にチェックされているかを記憶する。

+0

あなたは以前これを見ました!しかし、私が記述した状況をスキップし、開始単語と終了単語の間の接続経路を見つけるための解決策に行きました。これは私が求めているものではありません...私が記述した問題には何も検索がありません。単語グラフの生成。 –

0

辞書で見つかる単語のみを生成すると、時間の複雑さは辞書のサイズによって制限されるため、O(min(|D|, 25^n))にする必要があります。

関連する問題