web-dev-qa-db-ja.com

平均正規表現アルゴリズムの時間の複雑さは何ですか?

私は正規表現の使用に慣れていないので、有限状態マシンに基づいたbasic理論を理解しています。

私はアルゴリズム分析が得意ではありませんが、基本的な線形検索という正規表現の比較がわかりません。表面的には線形配列検索のように見えるので、私は尋ねています。 (正規表現が単純な場合。)

正規表現エンジンの実装についてもっと知りたいのですが?

47
avgvstvs

これは最も人気のあるアウトラインの1つです: 正規表現のマッチングは単純かつ高速である 。文字列に対してDFAでコンパイルされた正規表現を実行することは確かにO(n)ですが、最大でO(2 ^ m)の構築時間/スペースが必要になることがあります(m =正規表現のサイズ)。

46
porges

Deterministic/Non-Deterministic Finite Automataという用語を知っていますか?

実数正規表現(私が言うとき実数私は正規表現を認識する正規表現を指します、ほとんどすべてのプログラミング言語に含まれる正規表現ではなく、後方参照など)をDFA/NFAに変換でき、両方をプログラミング言語で機械的に実装できます(NFAをDFAに変換できます)

あなたがしなければならないのは:

  1. 正規表現をオートマトンに変換する方法を見つける
  2. お好みのプログラミング言語でオートマトンの認識を実装する

このように、正規表現を指定してDFAに変換して実行し、指定したテキストと一致するかどうかを確認できます。

これはO(n)に実装できます。DFAは(Turing Machine)のように後戻りしないため、文字列と一致します。か否か。これは、重複するカウントの一致を取り込んでいない場合を想定しています。そうしないと、戻って再度一致を開始する必要があります...

8
Oscar Mederos

古典的な正規表現は、実際には高速ですが、最悪の場合の振る舞いが非常に悪い方法(標準DFA)または妥当な最悪の場合の動作を保証する方法(NFAとして保持)で実装できます。標準のDFAは、基本的にバックトラック検索であることを利用して、多くの追加の一致する文字とフラグをサポートするように拡張できます。

標準的なアプローチの例はどこにでもあります(たとえば、Perlに組み込まれています)。 http://code.google.com/p/re2/ に、最悪の場合の動作を主張する例があります-実際、最悪の場合に予想したよりも優れているため、余分なトリックを1つか2つ見つけました。

これにまったく興味がある場合、または病理学的入力を確実にロックするように作成できるプログラムを作成することに関心がある場合は、 http://swtch.com/~rsc/regexp/regexp1.html を参照してください。 。

5
mcdowella