配列の長さが 5 の単純な問題の場合 (実際には、配列の長さは 20.. になる可能性があります)。
AAAAB、AAABA、BAABC、BCAAAなどの定義済みのパターン セットがあります。各パターンは、入力配列と同じ長さです。任意の整数配列を入力として取り、一致するすべてのパターンを返す関数が必要です。(配列はいくつかのパターンに一致する場合があります)できるだけ速く。
" A " は、パターン内で A の位置にあるすべての数値が等しいことを意味します。たとえば、 AAAAAは単にすべての数値が等しいことを意味し、{1, 1, 1, 1, 1}はAAAAAに一致します。
" B " は、B の位置の数が A の位置の数と等しくないことを意味します (つまり、A ではない数のワイルドカード) B で表される数は、等しくなくてもかまいません。たとえば、 ABBAAは、1 番目、4 番目、5 番目の数字が x と等しく、2 番目、3 番目の数字が x と等しくないことを意味します。 {2, 3, 4, 2, 2}はABBAAに一致します。
" C " は、この位置に任意の数字 (つまり、数字のワイルドカード) を指定できることを意味します。{1, 2, 3, 5, 1}はACBBAに一致し、 {1, 1, 3, 5, 1}はACBBAにも一致します
効率的な (比較数に関して) アルゴリズムを探しています。最適である必要はありませんが、最適からそれほど悪くないはずです。決定木のようなものだと思います...
非常に単純ですが非効率的な方法は、次のようなものです。
各パターンを入力と照合してみてください。{a, b, c, d, e}に対してAABCAと言います。かどうかをチェックします。
(a=b=e && a!=c)
パターンの数がn、パターン/配列の長さがmの場合、複雑さは約O(n*m) です
アップデート:
質問を混乱させずに簡単に理解できるようにする方法がわからないため、質問のより良い表現を自由に提案してください。
理想的なアルゴリズムには、一連のパターンを決定木に変換するなど、何らかの準備が必要です。前処理後の複雑さを、いくつかの特別なパターン セットの O(log n * log m) のようなものにすることができます (推測にすぎません)。
参考になるかもしれない数字: 事前定義されたパターン セットのサイズはおよそ 30 です。一致する入力配列の数は約 1,000 万です。
たとえば、AAAAAとAAAACの両方が定義済みのパターン セットに含まれているとします。次に、AAAAAA が一致する場合、AAAACも一致します。それを認識できるアルゴリズムを探しています。
更新 2
@Gareth Rees の答えは O(n) ソリューションを提供しますが、「 C 」があまりないという仮定の下で。(そうしないと、ストレージが巨大になり、多くの不要な比較が行われます)
また、多くの「 C 」がある状況に対処する方法についてのアイデアも歓迎します。たとえば、長さ 20 の入力配列の場合、事前定義されたパターンごとに少なくとも 10 個の「C 」があります。