"Regex'i DFA'ya 30 dakikadan daha az bir sürede dönüştürmek" istediğiniz için, nispeten küçük örnekler üzerinde elinizle çalıştığınızı düşünüyorum.
Bu durumda , doğrudan bir dilin Nerode otomasyonunu (minimum belirleyici otomasyonuna eşit olduğu bilinen) hesaplayan Brzozowski algoritmasını kullanabilirsiniz . Türevlerin doğrudan hesaplanmasına dayanır ve aynı zamanda kesişim ve tamamlamaya izin veren genişletilmiş düzenli ifadeler için çalışır. Bu algoritmanın dezavantajı, yol boyunca hesaplanan ifadelerin denkliğini, pahalı bir süreç kontrol etmesini gerektirmesidir. Ancak pratikte ve küçük örnekler için çok etkilidir.[ 1 ]
Sol bölümler . Let bir dil olmak ve izin bir kelime. Daha sonra
dil denen sol bölüm (ya da türevi sol ) ve .A ∗ u u - 1 L = { v ∈ A ∗ ∣ u v ∈ L } u - 1 L LLbir*u
u- 1L = { v ∈ A*| U v ∈ L }
u- 1LL
Nerode otomatı . Nerode otomat ve olan belirleyici otomat burada , ve geçiş işlevi, her her formülüyle
tanımlanır.
Bu oldukça soyut tanıma dikkat edin. Her durumu, kelimesinin soldaki bir kelimesidir ve dolayısıyla nin bir dilidir . İlk durum dilidir ve son durumlar kümesi, soldaki tüm bölümlerin kümesidir.A ( L ) = ( Q , A , ⋅ , L , F ) Q = { u - 1 L ∣ u ∈ A ∗ } F = { u - 1 L ∣ u ∈ L } a ∈ A ( u - 1 L ) ⋅ a = a - 1 ( u - LLbir( L ) = ( Q , A , ⋅ , L , F)Q = { u- 1L ∣ u ∈ A*}F= { u- 1L ∣ u ∈ L }a ∈ A
( sen- 1L ) ⋅ a = a- 1( sen- 1L ) = ( u a )- 1L
birLbir*LL bir kelime ile .
L
Brzozowski'nin algoritması . Let harften. Aşağıdaki formülleri kullanarak sol bölümleri hesaplayabilirsiniz:
a , b
bir- 11bir- 1( L1∪ L2)bir- 1( L1∩ L2)= 0= a- 1L1∪ u- 1L2,= a- 1L1∩ u- 1L2,bir- 1bbir- 1( L1∖ L2)bir- 1L*= { 10Eğer bir = beğer bir ≠ b= a- 1L1∖ u- 1L2,= ( a- 1L ) L*
bir- 1( L1L2)= { ( a- 1L1) L2( a- 1L1) L2∪ a- 1L2si 1 ∉ L1,si 1 ∈ L1
Örnek . İçin , gittikçe olsun:
, aşağıdaki minimum otomasyonu verir.
L = ( a ( a b )*)*∪ ( b a )*
1- 1Lbir- 1L1b- 1L1bir- 1L2b- 1L2bir- 1L3b- 1L3bir- 1L4b- 1L4bir- 1L5b- 1L5= L = L1= ( a b )*( a ( a b )*)*= L2= a ( b a )*= L3= b ( a b )*( a ( a b )*)*∪ ( a b )*( a ( a b )*)*= b L2∪ L2= L4= ∅= ( b a )*= L5= ∅= a- 1( b L2∪ L2) = a- 1L2= L4= b-1( bL2∪L2) = L2∪ b- 1L2= L2= ∅= a ( b a )*= L3
[ 1 ] J. Brzozowski, Normal İfadelerin Türevleri, J.ACM 11 (4), 481–494, 1964.
Düzenle . (5 Nisan 2015) Benzer bir soruyu daha yeni keşfettim: Belirli bir normal ifade ile tanımlanan dili tanıyan bir DFA'nın oluşturulması için hangi algoritmalar var? diye sordu. Cevap kısmen karmaşıklık sorunlarını ele alıyor.
a(a|ab|ac)*a+
. Bunu doğrudan bir DFA'ya indirdiğiniz bir NDFA'ya çevirebilir veya hemen bir DFA ile eşleşen bir şeye normalleştirebilirsiniz.