データベース内のすべての文字列と特定の編集距離の文字列を一致させたいという問題があります。指定された文字列と編集距離の正規表現を生成
私の考えは、編集距離がd
からs
までのすべての文字列と一致する正規表現を生成することでした。その上r = 'abc|.abc|.bc|a.c|ab.|abc.'
と:
だから例えば私はの形でd = 1
とs = 'abc'
のための正規表現r
を生成したいです。しかし、これが非常に効率的であるかどうか、あるいはすでにその問題の良いアルゴリズムがあるのかどうかはわかりません。エディット・ディスタンスのキャラクタ・スワップを考慮したい。 'acb'
もr
の一部である必要があります。私はPHPでそれを実現し、SQLクエリを作成したい:SELECT * FROM table WHERE name RLIKE TheRegularExpression
。
このようにするのは良い方法ですか?または何をお勧めしますか?
、まず第一に、あなたはそのテーブルがかなりある場合を除き、テーブル内のすべてのレコードにインデックスを使用して解決することはできませんWHERE条件を適用することは避けてください小さい。 – millimoose
また、結果のパターンの長さは 'O(nCd)'となり、 'n'は文字列の長さ、' d'は距離です。これは潜在的に非常に大きなパターンにつながる可能性があります。たとえば、 '80'文字列の場合、希望の距離が' 5 'の場合、約2ギガバイトのREをデータベースに送ります。ただし、文字列が短く、「d」が非常に小さいか、またはnに非常に近いことが確かであれば、それは実行可能かもしれません。 – millimoose
これは、文字列がユーザーによって入力された場合、長さが一定の限度内であるかどうかを確認する必要があります。そうでなければ、DoSホールを作成します。 (ユーザー入力の非常に非効率なアルゴリズムと同様に) – millimoose