2009-04-24 27 views
10

私は、文字セットを最大ワード数を含む順列にスクランブリングするための効率的なアルゴリズムを探しています。効率的なワードスクランブルアルゴリズム

例えば、{e、e、h、r、s、t}という文字のリストが与えられているとします。私は、最大数の単語を含むような方法でそれらを注文する必要があります。これらの文字を「theres」に注文すると、「the」、「there」、「her」、「here」、「ere」という単語が含まれています。この例では5単語が含まれているので、5というスコアを持つことができます。私は最高のスコア(最も多くの単語を含む)を持つような方法で手紙を注文したい。

純粋なアルゴリズムはすべての置換を試してみることです。私はこれがO(n!)だと信じているので、上記の6文字だけで720個の異なる置換が試されます(例にはeが2回あるためいくつかの重複を含みます)。より多くの手紙については、素朴な解決策はすぐに不可能になります。

このアルゴリズムは実際には最高のソリューションを生み出す必要はありませんが、妥当な時間内に良い解決策を見つけるはずです。私のアプリケーションでは、(Monte Carlo)を数百万個の順列で推測するだけでは問題はありません。

現在、Aho-Corasickアルゴリズムを使用して順列をスコア付けしています。それは、テキストの1回のパスで辞書内の各単語を検索するので、かなり効率的です。これはまた、すべての単語がtrieに格納されていることを意味しますが、別のアルゴリズムでも別のストレージが必要な場合は、それも問題ありません。私は実際の注文と検索の実行時間だけ、辞書の設定について心配していません。必要に応じて、Bloom Filterのようなファジー辞書を使用することもできます。

私のアプリケーションでは、指定された文字のリストは約100であり、辞書には100,000を超えるエントリが含まれています。辞書は決して変更されませんが、いくつかの異なる文字のリストを注文する必要があります。

私はpath finding algorithmを試してみることを検討しています。私は出発点としてリストからランダムな文字で始めることができると信じています。その後、残りの文字はそれぞれ「パス」を作成するために使用されます。私はこれがAho-Corasickの得点アルゴリズムとうまくいくと思っています。スコアは一度に1文字ずつ作成できるからです。私はまだパスの検索を試みたことはありません。多分それはいい考えではないでしょうか?どの経路発見アルゴリズムが最良かもしれないか分かりません。

もう1つのアルゴリズムは、ランダムな文字でも始まります。次に、辞書トライは、残りの文字を含む「リッチ」ブランチについて検索される。使用できない文字を含むディクショナリブランチは、削除されます。私はこれがどのように正確に機能するかについての詳細については少し曇っていますが、スコアリング順列を完全に排除することができます。

+3

偉大な質問、よく尋ねられました! – erickson

+1

これは単語です。それはあなたの元の例題5の得点になります。 –

+0

それはNPのようなものです。何か、笑。 –

答えて

3

simulated annealingは、多くのドメインで複雑な最適化の問題に成功しています。基本的には、無作為の山登りをしながら徐々に乱数を減らします。あなたはすでにAho-Corasickスコアリングを持っているので、すでにほとんどの作業を済ませています。あなたが必要とするのは、隣人の順列を生成する方法です。そのためには、手紙のペアを入れ替えるのと同じような簡単なことがうまくいくはずです。

+0

私は以前にシミュレーテッドアニーリングについて聞いたことがありましたが、それが何のために実際には知りませんでした。それは良いアイデアのように思える、私はそれを試してみるつもりです。 – Imbue

2

遺伝子アルゴリズムの使用について考えましたか?あなたはあなたのフィットネス機能の始まりをすでに持っています。あなたは突然変異とクロスオーバー(ネイサンに感謝します)アルゴリズムを試して、どちらが最良の仕事をするかを知ることができます。

アルゴリズムでは、入力セットから可能な限り小さな単語を作成し、一度に1文字ずつ追加して、新しい単語にも新しい単語が含まれるようにすることもできます。各入力セットに対していくつかの異なる開始語を入力して、その入力先がどこにあるかを確認します。

ちょっとしたアイドル思考。あなたがオンラインアナグラムを生成することができますこのページで http://sourceforge.net/search/?type_of_search=soft&words=anagram

+0

あなたが探していた言葉は「クロスオーバー」だと思います。 –

+0

確かに。どうもありがとう。 – Rodyland

0

他の人がこれを解決する方法をご確認するのに便利かもしれません。私はしばらくそれを周り遊んできたし、それは楽しいです。それはどのように仕事をしているのかを詳細には説明していませんが、パラメータによっていくつかの洞察が得られます。 http://wordsmith.org/anagram/advanced.html

+0

この問題は、アナグラムの解決よりも難しい_lot_です。 –

+0

はい、アナグラムを解決する以上のことがありますが、それを行うことはアルゴリズムの主要な部分です。 –

+0

+1。最初のn文字が決定され、m文字が残っているときのメインアルゴリズムのどの時点でも、それらのm文字のアナグラムを見つけることは、追加できるスコアの下限を見つけるのに便利です。これは、A *検索の発見的手法として有用であろう。 –

3

はここMarkov Chainsに触発され、アイデアです:あなたの辞書に

  1. 事前計算文字遷移確率。辞書内の単語に基づいて、ある文字Xの後にすべての文字ペアの別の文字Yが続く確率でテーブルを作成します。
  2. すべての文字が使い果たされるまで、前の文字と確率テーブルに基づいて残りの文字のプールから次の文字をランダムに選択して順列を生成します。これを何度も実行してください。
  3. 遷移表の "メモリ"を増やすことで実験できます.1文字だけを戻して見てはいけませんが、2または3と言います。確率表は増加しますが、有効な単語を作成する機会は増えます。