web-dev-qa-db-ja.com

はしご効率問題

Wordのはしごの処理に問題があります。問題は、2つの単語と辞書ファイルが与えられた場合、2つの単語の間の最短の単語ラダーを見つけることです。だから猫と鍋という言葉を与えられたら:

猫->ベビーベッド->ポット

これは簡単な例です。あなたはその考えを理解します。

問題は時間の制約です。問題はグラフを使用することを要求します。問題の2番目の部分は最小の重みを持つラダーを見つけることを扱うため、グラフを使用することは本当に良いでしょう。

グラフを事前に生成する(プログラムの実行時に完全グラフを生成する)と、非常に長い時間がかかります。私が思いついたアルゴリズム以来、各単語を辞書内の他のすべての単語と比較して、隣接するノードを見つけました。これは、O(n ^ 2)の比較と、同じサイズの単語の文字の比較になります。それは多くのことになります。

1k 3文字のWordリストを使用してテストを実行しましたが、グラフの生成には2.6秒かかりました。つまり、200kのリストでは、グラフの生成に26時間かかります。

これを見つけた後、最初の単語から始めてグラフを生成し、次にすべての隣接ノード(文字が異なる単語)を見つけてから、最後の単語が見つかるまで前の隣接ノードのすべての隣接ノードを見つけることを考えました。または、見つからない場合はパスがありません。

プログラミング言語はC++です。これに使用できるより効率的なアルゴリズムはありますか?

3
wax147

これは、グラフのフォワードリンクの計算が難しい例ですが、reverseリンクは非常に簡単なので、代わりにインデックスを付けます。 Wordリストに目を通し、Wordに戻るすべてのリンクのエントリを作成します。たとえば、「猫」という単語は、次のインデックスエントリを生成します。

_".at" -> Set("cat")
"c.t" -> Set("cat")
"ca." -> Set("cat")
_

次に、「cot」のインデックスを作成すると、次のようになります。

_".at" -> Set("cat")
"c.t" -> Set("cat", "cot")
"ca." -> Set("cat")
".ot" -> Set("cot")
"co." -> Set("cot")
_

O(n)で実行できるこの最初のインデックス作成パスが完了したら、2番目のO(n)パスを実行して順方向リンクを取得できます。これは、元のWordを除いた、Wordの右側にあるすべてのセットの結合にすぎません。このマッピングを使用する頻度によっては、このフルパスを実行せず、必要に応じて最初のパスから計算する方が有利な場合があります。

2
Karl Bielefeldt