Iは線形時間で干し草の山の中の各針の出現箇所の数をカウントする方法を思っていました。私はAho-Corasickのアルゴリズムを使うと思っていたが、私は時間の複雑さを針の発生回数に依存させたくなかった。あなたは、文字列のセットを検索したい発生数に依存して好きではない場合Oの文字列内のサブストリングの発生回数(N)
1
A
答えて
1
はRabin–Karpを使用してください。実行時間、平均/最高の場合はO(n + m)
であるが、その最悪の場合の時間がn
テキストとm
の長さであり、O(nm)は、検索パターンの組み合わせた長さです。
あなたはn
は、テキストの長さであり、k
は、検索パターンの長さで複雑O(n + k)
、とKnuth–Morris–Prattを使用することができる唯一の1つの文字列を検索したい場合は。
0
合計発生回数だけ必要な場合(また、位置自体は気にしない場合)、Aho-Corasickを効率的に使用できます。現在、ノードv
にいるとします。現在の位置で終了する部分文字列の数。私はそれが正確に接尾辞リンクによってv
から到達可能なターミナルノードの数だと主張しています。しかし、サフィックスリンクはツリーを形成します。したがって、接尾辞リンクによって形成されるツリー内のルート上の末尾頂点の数をv
から数える必要があります。線形前処理(例えば、このツリーを明示的に構築し、深度優先探索を使用して、直線から任意の頂点へのパス上の合計を線形時間で計算することができます)で時間を計算することができます(O(1)
)。我々はまた、(例えば、高さの昇順で)正しい順序で頂点を処理し、sum[v] += sum[suffix_link(v)]
ような何かを行うことができます。その場合、実際にこのツリーを構築する必要はありません。
このアルゴリズムは、Aho-Corasickオートマトンを構築し、線形時間で「サフィックスリンクパス」の合計を計算し、通常のようにオートマトンを使用することで、 。
関連する問題
- 1. 文字列内の文字列の発生回数をカウントする
- 2. 文字列中の文字列内のサブストリングを数える方法 - Python
- 3. 文字列のサブストリング固有の整数
- 4. O(n)未満の文字列で文字を検索する
- 5. 文字列内のパターンの合計発生回数をカウントする
- 6. 文字列内でのサブシーケンスの発生
- 7. 複数の文字列を含むサブストリング
- 8. サブストリング、xsltの文字列長関数
- 9. count文字列のベクトル内の文字列の出現回数
- 10. SQL文字列値の文字の発生回数をカウントしますか?
- 11. 各文字列が配列内で発生する回数を取得する
- 12. 文字列内の文字の出現回数をカウントする
- 13. Regex文字列内の数字で複数の発生を照合する#
- 14. 文字列の並べ替えはO(n^2logn)ですか?
- 15. ランダムなgsub文字列n回
- 16. preg_replace n回一致する文字列?
- 17. 別の文字列(Perl)内の文字列の出現回数をカウントする
- 18. O(n)の文字列内の別個の部分文字列の数を数えることは可能ですか?
- 19. MySQLの列内の部分文字列の出現回数
- 20. C++文字列内の最後の(n)文字を取得
- 21. 行内のn番目の文字列内での文字列または部分文字列の検索
- 22. 解析サブストリングのSQL文字列は
- 23. O(N)未満のN擬似乱数を生成する
- 24. 列内の文字列の出現回数をカウントするR
- 25. 文字列中のサブストリングの数をカウントする
- 26. 特定の文字列内で何かが発生する回数を数えるには?
- 27. 文字列n - 時の複数の単一の文字
- 28. 配列内でN回の回数を繰り返します。
- 29. はxpathで文字列/文字n回を連結します
- 30. 配列内の文字列を文字列変数にコピーする際に問題が発生しました
固定ストリングですか?つまり、固定ストリングSが固定ストリングT内で発生した回数を数える必要がありますか? – kraskevich
それは私の間違いだった、それは複数の針のためだった、今それは正しいはずです。 – mathew7k5b