2

だから私は3から20文字の長さの単語のデータベースを持っています。大きな単語に含まれるすべての小さな単語を見つけるPHPで何かをコーディングしたいと思います。たとえば、「内向き」という言葉には、「雨」、「勝つ」、「取り除く」などの言葉があります。

最初に、Wordsテーブル(Words3からWords20、単語内の文字数を示す)にフィールドを追加することを考えました。たとえば、「LetterCount」...たとえば、「rally」は10000000000200000100000010として表されます。文字A、文字Bの0インスタンス、...文字Lの2インスタンスなど。次に、各テーブル(または、見つかった単語のターゲット長が指定されている場合は1つのテーブル)のすべての単語を調べて、各単語のLetterCountからソース単語のLetterCount(上記の例では「内側」)。

しかし、それでは、MySQLデータベースとPHPスクリプトに過度の負荷がかかり、すべての単語のLetterCountを呼び出したり、すべての数字をソース単語の数字と比較したりすることになると思い始めました。

これを行うためのより簡単で、おそらくより直感的な方法はありますか?何らかの形でオーバーヘッドに役立つ場合は、ストアドプロシージャを使用できます。いくつかの提案をいただければ幸いです。ありがとう!

4

1 に答える 1

6

これはかなり効率的であるはずの簡単な解決策ですが、特定のサイズの単語までしか機能しません(単語を構成する文字がより低い値の低頻度の文字であるかどうかに応じて、おそらく約15〜20文字が分解されますまたはより高い値の高頻度文字):

  1. 頻度に応じて、各文字に素数を割り当てます。e2、t= 3、 = 5など、ここまたは同様のソースaからの周波数値を使用します
  2. 単語リスト内の各単語の値を、その単語内の文字のプライム値を乗算して事前に計算し、テーブルのbigintデータ型列に格納します。たとえばtea、値は3*2*5=30。です。単語に文字が繰り返されている場合は、係数を繰り返しteatて、値が。になるようにします3*2*5*3=90
  3. などの単語がrain、などの別の単語の中に含まれているかどうかを確認する場合は、の値がの値を除算するinwardかどうかを確認するだけで十分です。この場合、、、は、で割り切れるので、単語は単語の中にあります。raininwardinward = 14213045rain = 7315142130457315raininward
  4. bigint列9223372036854775807は最大で、約15〜20文字まで細かくする必要があります(単語内の文字の頻度によって異なります)。たとえば、ここから最初の20文字の単語を取得しました。これはanitinstitutionalism、であり、その値は6901041299724096525bigint列にほとんど収まりません。ただし、14文字の単語xylopyrographyの値は635285791503081662905、大きすぎます。非常に大きなものは、別の方法を使用して特殊なケースとして処理する必要があるかもしれませんが、それでも比較的効率的であるほど十分に少ないことを願っています。

クエリは、ここで準備したデモのように機能します:http ://www.sqlfiddle.com/#!2/9bd27/8

于 2012-04-10T21:51:27.317 に答える