sizin regexp'in motoru için çalışma zamanı üstel davranış ortaya ederse (x + x +) + y, o zaman bir DFA NFA bu doğrusal zamanda desen tanıyabilir çünkü kırık olduğunu . (A geribaşvuru ile regexp'in değil artık dil teorik anlamda bir düzenli ifade olması nedeniyle, ağırlıklı olarak)
Aslında, geri adım gerçekten ihtiyaç vardır (geribaşvuruların gibi) sadece birkaç durum vardır. Yetenekli bir uygulama, yalnızca bu köşe durumları verildiğinde geri dönüşe geçmelidir.
Dürüstlükte, DFA'lar da karanlık bir yüzeye sahiptir, çünkü bazı regexp'ler üstel boyut gereksinimlerine sahiptir, ancak boyut kısıtlamalarından daha büyük boyuttaki bir DFA'nın uygulanması daha kolaydır ve büyük DFA, girişte doğrusal olarak çalışır; X'in bir çiftinde boğucu küçük bir backtracker.
You should gerçekten regexp'nin uygulanması (ve geriye dönüş patolojik davranışı) hakkında Russ Cox mükemmel bir makale serisi okuyun: http://swtch.com/~rsc/regexp/
karar verilebilirlik ile ilgili sorunuza gelince: Yapamazsın. Çünkü regexpr için numaralı geri izleme yok. Her uygulamanın, belirli durumlarda algoritmalarında üstel büyüme ile başa çıkmak için kendi stratejileri vardır ve başkalarını kapsamaz. Bir kural buraya uygun ve orada felaket olabilir.
GÜNCELLEME:
Örneğin, bir uygulama onları çalıştırmadan önce İfadelerinin basitleştirmek için cebirsel dönüşümleri kullanabilirsiniz bir iyimserlik içerebilir: (x+x+)+y
herhangi backtracker için bir sorun olmamalı, aynı bir xxx*y
vardır.Ancak aynı optimizatör bir sonraki ifadeyi tanıyamaz ve problem yine oradadır. Orada birçok regex motorları gerçek dünyada bu şekilde yapmasalar da,
http://perlgeek.de/blog-en/perl-tips/in-search-of-an-exponetial-regexp.html
Yeap ama siz "O (2^n) olabilir" dediniz emin olmak için bir yol var mı? Regexp dönüştürmek gibi bir yol var mı bu şekilde üstel değil gösterilebilir? – mathk