入力セットのセットがあり、各要素は最大 50 文字で構成されています。各行が 1 つの入力セットである varchar(50) 列を持つデータベース テーブルを考えてみてください。列数は通常、約 5 ~ 8 の範囲内です。行数は通常約 2 ~ 300 万ですが、最大で 1 億 5000 万になる場合があります。すべての列には、null 以外の値が必要です。このテーブルを T と呼び、その各行を RT とします。
一致するパターンを示す 2 番目の入力セットがあります。元の入力と同様に、同じ固定数の列を持つデータベース テーブルと見なすこともできます (ターゲットに一致するメタデータを追加しますが、その部分は関係ありません)。ただし今回は、値を持つ必要があるのは 1 つの列だけですが、いずれの列も null にすることができます。このテーブルを M と呼び、その各行を RM とします。このテーブルの通常のサイズは 4000 ~ 5000 行ですが、最大 40 000 まで可能です。
ここでのタスクは RT ごとにあり、一致する RM を見つける必要があります。特定の RT のマッチング ルールは次のとおりです。
RM のすべての要素が RT の対応する要素と同じである場合に一致します。(文字列の完全一致は同じと見なされます)。要素が RM で null の場合、RT の一致はチェックされません。
1試合のみ可能です。複数の一致が識別された場合、RM が最も長いものが正しいものと見なされます。ここでは、同じ長さの RM が複数ある場合は無視できます。最初に識別されたものだけを選択します。
コードは、4 GB の RAM を搭載した一般的な Windows クライアントで実行されます。したがって、MT はメモリに保持できますが、T は保持できません。
比較回数を減らすテクニックを探しています。より具体的には、特定の RT に対して MT 全体をチェックできる手法を知っていますか。そうでない場合、この問題を処理する最も効率的な方法は何ですか?
これは .NET でコーディングされる予定であり、.NET 用の既存のコードまたはライブラリは非常に高く評価されています。
ありがとう、
ケマル
ノート:
これは宿題ではありません。私は約20年前に卒業しました:)
正規表現 RM には、この問題の変形があります。ただし、現在のリリースでは、単純な文字列の同等性による一致で十分です。
以下にいくつかの例を示します。
RT = { A、B、C、D、E }
RM1 = { A,,,, } RM2 = { A, B,,, } RM3 = {A,,,D, E}
この RT では、これらすべてが一致します。しかし、ルール 2 により、一致として RM3 を選択します。この例が明確になることを願っています
- T データは実際にはデータベースに保持されません。Excel、テキスト、xml、およびいくつかの統計ソフトウェア ネイティブ データ ファイルを含む多くの形式です。その場でネイティブ形式からデータを読み取り、カーソルを保持するデータパイプ構造があります。RT はそのカーソルの一部であり、単なる文字列の配列です