かなり一般的な質問がありますが、長くなって申し訳ありません。これは MySQL 関連だけではなく、どのスクリプト言語でも実行できますが、これを説明するより良い方法が見つかりませんでした。ユニークな言葉のリストがあります。現在、それらは MySQL のテーブルにありますが、実装はそれほど重要ではなく、テキスト ファイルにある場合もあります。各単語は正確に 6 文字です。単語は、いくつかのわずかに異なる形式に従います。私の目標は、一意性を維持しながら各単語を 6 文字から 4 文字に短縮することです。
私は主題をグーグルで検索しましたが、データの最小化/最適化/衝突などのすべてのものは有用な結果を提供しませんでした:(だからここにいます.
以下に例を示します。
--------------
words
--------------
word short
------ ----
1A0001
1A0002
1A0003
AA0001
AA1001
AB0001
2BAC11
2BAC34
--------------
ご覧のとおり、次の一般化された正規表現で表すことができる 3 つの形式があります。
^[0-9][A-Z][0-9][0-9][0-9][0-9]$ - matches 1A0001 1A0002 1A0003
^[A-Z][A-Z][0-9][0-9][0-9][0-9]$ - matches AA0001 AA1001 AB0001
^[0-9][A-Z][A-Z][A-Z][0-9][0-9]$ - matches 2BAC11 2BAC34
したがって、フォーマットに基づいて、さまざまな文字を削除して、単語を 4 文字の長さにし、それらを一意に保つことができます。
^[0-9][A-Z][0-9][0-9][0-9][0-9]$ - drop 1, 3
^[A-Z][A-Z][0-9][0-9][0-9][0-9]$ - drop 3, 4
^[0-9][A-Z][A-Z][A-Z][0-9][0-9]$ - drop 1, 4
更新を行うための一時テーブルをshort
使用するための値を作成します。私が言ったように、実装は説明にとってそれほど重要ではありません。要約すると、次のようになります。regexp/concat/substring
words
select concat(substring(word,2,1), substring(word,4,3)) from words where word regexp '^[0-9][A-Z][0-9][0-9][0-9][0-9]$';
select concat(substring(word,1,3), substring(word,6,1)) from words where word regexp '^[A-Z][A-Z][0-9][0-9][0-9][0-9]$';
select concat(substring(word,2,2), substring(word,5,2)) from words where word regexp '^[0-9][A-Z][A-Z][A-Z][0-9][0-9]$';
これは、テーブルが最終的にどのように見えるかです:
--------------
words
--------------
word short
------ ----
1A0001 A001
1A0002 A002
1A0003 A003
AA0001 AA01
AA1001 AA11
AB0001 AB01
2BAC11 BA11
2BAC34 BA34
--------------
以下を使用することの一意性を確認できますshort
。
mysql> select short from words group by short having count(short) > 1;
Empty set (0.00 sec)
mysql>
これは非常に単純化されたシナリオです。実際には、単語はより長く、より多くの形式があります。フォーマットが同じであっても、同じ文字をドロップすると衝突が発生することword
がshort
あります。したがってshort
、一意になるように変更する必要があります。最大の難点は、すべてword
が実際には人間が理解できるものであるため、short
バージョンも人間が理解でき、元の に似ている必要があるという事実から生じword
ます。これは、短いバージョンの一意性を確保するためのある種のハッシュ アルゴリズムを作成できないことを意味します。それだけでは十分ではありません。元の単語に多少似ている必要があります。現在、などに交換しようと考え0
てO
います。
これは実装の問題というよりも科学の問題であると感じたのではないでしょうか。実装の唯一の重要な側面はパフォーマンスです。いつまでも待たなくていいように、良いパフォーマンスをしたいです。
誰か似たようなものを見たことがありますか?
それを行う方法をどこから探し始めますか?