正規表現を効率的に照合できる「小さな」マシンはありますか?


30

正規表現は、正規表現に比例するサイズの非決定性有限オートマトン、または潜在的に指数関数的に大きい決定性FAによって認識できることはよく知られています。さらに、文字列sと正規表現と、NFAは比例してメンバーシップをテストできます、およびDFAは比例してメンバーシップをテストできます。NFAのスローダウンは、本質的にオートマトンが存在する可能性のある状態のセットを追跡する必要があるという事実から生じます。DFAの指数関数的な爆発は、その状態が、 NFA。r|s||r||s|

より強力なマシンの使用を許可する場合、正規表現を効率的に(つまり、よりも良い時間で、よりも良いスペースで)認識できますか有限オートマトンよりも (たとえば、プッシュダウンオートマトンまたはカウンターマシンを使用して通常の言語を認識することで簡潔さが向上しますか?)O(|r||s|)O(2|r|)


2
「NFAは比例してメンバーシップをテストできる」と言うとき、明らかな方法でNFAをシミュレートする(決定論的な)RAMマシンは非常に時間がかかることを意味しますか?または、別の計算モデルを参照しない「NFAの実行時間」を定義する他の方法はありますか?(文字列 NFAの実行時間はあると言う、賢明だがあまり有用ではない定義は別として)|s||r|s|s|
ラドゥグリゴール

はい、それは私の質問の正しい解釈です。
ニールクリシュナスワミ

2
それから私は単純にこれを尋ねるのがより自然なようです:文字列がで機能する正規表現によって定義された言語にあるかどうかを決定するアルゴリズム(RAMマシン上)があります時間とスペース?(特に、RAMマシンの観点からプッシュダウンオートマトンのランタイムを定義する場合。)r o | s || r |o 2 | r |sro(|s||r|)o(2|r|)
Radu GRIGore

1
私は問題を正確に理解していません。入力は文字列sと正規表現rであり、問​​題はsが正規表現rで定義された言語であるかどうかを判断することですか?
ロビンコタリ

@ロビン:はい、それだけです。より多くの計算能力を使用して、有限オートマトンよりも効率的に正規表現を照合できるか、または追加機能(スタック、RAMなど)が役に立たないかどうかを知りたいと思います。
ニールクリシュナスワミ

回答:


20

次のように、時間とスペースをトレードオフするのは簡単です。

正規表現をNFAに変換します—アルゴリズムの比較を具体的にするために、がNFA状態の数であると仮定します。そのため、NFAを直接シミュレートするためO r s 時間は有効で、O 2 r変換されたDFAを実行するためにバインドされたスペースは、その量のメモリに対応できるRAMで作業している場合にも有効です。rO(rs)O(2r)

今、に仕切りNFA(任意)の状態を部分集合は、S IせいぜいのR / kがそれぞれを述べています。各サブセット内のS は、我々は、インデックスサブセット缶A IS Iからの番号で02 R / K - 1kSir/kSiAiSi02r/k1

テーブルここで、ij0〜k 1の範囲にあり、cは入力シンボルであり、A iS iのサブセット(の数値インデックス)です。。テーブルに格納される値は、S jのサブセット(数値インデックス)です。状態yは、次の場合にのみT [ i j c A i ]にありますT[i,j,c,Ai]ijk1cAiSiSjyT[i,j,c,Ai] S jに属し、入力シンボル cでyに遷移する状態が A iにあります。ySjAiyc

NFAをシミュレートするには、各S iに 1つのインデックスを維持し、入力のプレフィックスによって到達できるS iの状態のサブセットA iを指定します。各入力シンボルcについて、テーブルを使用して、各ペアi jについてcの遷移によってA iの状態から到達できるS jの状態のセットを検索し、ビット単位のバイナリまたはこれらの状態のセットの数値インデックスを操作して、それらをS jの状態の単一のサブセットに結合するkSiAiSici,jSjAicSj。したがって、シミュレーションの各ステップには時間がかかり、シミュレーションの合計時間はO s k 2です。O(k2)O(sk2)

必要なスペースは、すべてのテーブルのスペースであり、です。時間と空間の分析は、その量のメモリをアドレス指定でき、その量のメモリをアドレス指定するのに十分な大きさのワードに対してバイナリ演算を実行できるRAMで有効です。O(k22r/k)

これから得られる時間と空間のトレードオフは、 2次依存性のため、NFAシミュレーションと完全には一致しません。しかし、その後、私はO r s がNFAシミュレーションの適切な時間制限であることに懐疑的です:現在から許可されているすべての(おそらく二次的に)遷移を見るよりも速くNFAの単一ステップをどのようにシミュレートしますかアクティブ状態から別の状態へ?O r 2 s )であってはいけませんか?kO(rs)O(r2s)

いずれの場合でも、変化させることで、DFAよりも少ないスペースで、DFAとNFAの境界の間の連続体に時間の境界を取得できます。k


あなたの訂正は正しいと思います。あなたの答えは私の質問に答えます。しかし、私が尋ねたい質問は、追加の計算能力がどれだけ役立つかということです。(たとえば、カウンターを使用すると、O(1)スペースの文字列に一致させることができます。)気にしない場合は、その質問に対する回答を少しでも長く開いて、その答えを知っている人がいるかどうかを確認します。 ...ak
ニールクリシュナスワミ

@Neel:DavidのソリューションがRAMマシンでできる限り最高の場合スタック、カウンターなどは役に立ちません。(しかし、もちろん、彼は上限のみを与え、下限は与えませんでした。)
ラドゥグリゴール

1
私の知る限り、私のソリューションは「追加のパワー」を使用しています。これは、DFAまたはNFAモデルでは利用できないテーブル検索と整数インデックスに基づいています。だから、質問のその部分にどのように答えていないのか、本当に理解していない。
デビッドエップシュタイン

これをパラメータ化する別の方法を次に示します。私たちは、ワード幅とRAMのマシン上にあると仮定ところ、ワットLG R。次に、NFAシミュレーションにはO s r 2時間とO r / w スペースが必要です。DFAのシミュレーションができない場合は、R ワット(足りないスペース利用可能)。この回答セットで構成K R / W 及びかかるO S R 2 / W 2wwlgrO(sr2)O(r/w)rwkr/wO(sr2/w2)2w

4

これは答えではありませんが、コメントするには長すぎます。提起された質問が理解しにくい理由を説明しようとしています。

デバイスXの計算の複雑さを定義する方法は2つあります。

最初の最も自然な方法は本質的です。入力のサイズnがデバイスの実行時間にどのように影響するかを後で見ることができるように、デバイスXが入力をどのように使用するかを言う必要があります。また、操作(またはステップ)として数えるものを言う必要があります。次に、入力およびカウント操作でデバイスを実行します。

2番目は外因性です。別のデバイスYの計算の複雑さを定義し、次にXのシミュレーターとして機能するようにYをプログラムします。YXをシミュレートする方法は複数ある場合があるため、最適な方法を使用することになっていることを追加する必要があります。他の言葉でも同じように言ってみましょう:XOfnマシンYに実装されたXのシミュレーターが存在する場合、サイズnの入力の時間fn 時間。

たとえば、NFAの本質的な定義では、長さnの文字列を処理するのにnステップかかると述べています。デバイスYとしてRAMマシンを使用する外部定義では、最もよく知られている上限はおそらく David Eppsteinが答えたものであると述べています。(そうでなければ、(1)他の答えで指摘された最良の実用的な実装がより良い代替案を使用しないこと、(2)ここで誰もより良い代替案を示していないことは奇妙です。)厳密に言えば、デバイスXは正規表現です、しかし、NFAは同じサイズであるため、見ているデバイスXであると考えても安全です。

Now, when you use the second kind of definition it makes little sense to ask how restricting the features of device X affects the running time. It does however make sense to ask how restricting the features of device Y affects the running time. Obviously, allowing more powerful machines Y might allow us to simulate X faster. So, if we assume one of the most powerful machines that could be implemented (this rules out nondeterministic machines, for example) and come up with a lower bound Ω(f(n)), then we know that no less powerful machine could do better.

ですから、ある意味では、あなたが期待できる最良の答えは、NFAをシミュレートするのにある程度の時間がかかるというセルプローブモデルのようなものの証明です。(NFAからDFAへの変換を考慮すると、大きなDFAを書き留める時間が必要なので、メモリだけが問題ではないことに注意してください。)


4

正規表現のマッチングについて新しいことや古いことはないと信じている場合でも、私が長い間出会った中で最も美しい論文の1つをチェックしてください。SFischer、F Huch、およびTによる正規表現のプレイ Wilke、ICFP 2010。

(MMT Chakravartyは、このペーパーを推奨した功績に値します。)

EDIT: The reason why this paper is relevant is that it describes a new technique (based on Glushkov's from the 60ies) that avoids constructing the full NFA (let alone the DFA) corresponding to the RE. What is done instead resembles running a marking algorithm similar to the well-known one for deciding acceptance of a word by an NFA on the syntax tree of the RE. Performance measurements suggest that this is competitive, even with google's recently published re2 library.


A nice paper to read!!
Hsien-Chih Chang 張顯之

1

Take a look at this article by Russ Cox. It describes an NFA-based approach, first employed by Ken Thompson, by which an input string s can be matched to a regular expression r in time O(|s|.c) and space O(|r|.d), where c and d are upper-bound constants. The article also details a C implementation of the technique.


2
I'm not convinced that's an accurate description of the article. It appears to be building the DFA from the NFA on an as-needed basis and caching the results. But the cache size could be exponential in r.
David Eppstein
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.