次の問題に対するソリューションを実装する方法:
シンボルとパターンの文字列を指定すると、いつでも追加できます。各パターンの発生頻度をカウントします。シンボルパターンと動的パターンの一致
例は:
のは、いつでも例(B A C)ための新しいパターンを登録することができA B A C D E ... ユーザーを言わせて入力シンボルの連続的な流れがあります。パターンが2番目のタイムステップの前に登録された場合、パターンは1回カウントされます。最初のパターンは、例えば(B A C)と(CとD)をカウントしなければならない重複パターンの場合
のみ(B A C)がカウントされてしまいます。
ソリューションはに近づく:
自明な解はただ、パターンごとに1つのポジションをキープパターンが一致したときに、それを進めると、1が一致したら、すべての位置をリセットすることです。これはO(n * m) のランタイムにつながり、nはストリームの長さであり、mは最も長いパターンの長さです(たとえば、すべてのパターンに長さm - 1の同じプレフィックスを持つことによって)。
代替のアプローチは、有限オートマトンを構築し、パターンに接頭辞を組み合わせることができるという事実を使用することです。
-
しかしそれにはいくつかの問題がありますか? (例えばB D EBから)
実行時にパターンを追加する方法。例えば。ストリームがA Bであり、現時点でパターン(A B C)のみが登録されているとします。ユーザは(B A C)を登録します。ストリームがA C D Eに続く場合。登録する前に最初のシンボルが発生したため、パターンは一致しません。
アイデアはAho Corasick algorithmにリンクできます。しかし、アルゴリズムはパターンのすべての出現と一致し、最初のものだけではありません。実行時にパターンを追加することはできません。