Çok büyük NFA'ları DFA'ya dönüştürmek için algoritma


12

Belirsiz olmayan sonlu otomatım var ve onu DFA'ya dönüştürmem gerekiyor.

Büyük olarak 40 000+ eyalet demek istiyorum. Şimdiye kadar bazı deneyler yaptım ve tablodan ( burada açıklandığı gibi ) arama yapan varsayılan algoritmayı programladım , ancak optimizasyondan sonra bile oldukça yavaş ve çok bellek tüketiyor. Devlet sayısının katlanarak artabileceğinin farkındayım, ancak minimize edildikten sonra ortaya çıkan DFA'nın yaklaşık 9000 durumu var ve bu katlanılabilir.

Benim sorum şu, daha hızlı veya daha fazla bellek dostu olacak bazı algoritmalar var mı?


video görünüşe göre standart belirleme algoritmasında. bkz. örneğin belirleme olmadan NFA minimizasyonu, stackoverflow
vzn

Saf NFA-> DFA dönüşümünü yaparsanız (ürün yapısını kullanarak), elde edilen DFA'nın büyüklüğü nedir? (minimizasyondan önce)
DW

2
DFA ile ne yapmak istiyorsunuz? İçerme denetimleri ile ilgileniyorsanız, bunu doğrudan yapmak için algoritmalar vardır.
Vijay D

Çok hızlı cevaplar için teşekkürler. Boyut için, RAM'im bittiğinden beri tam olarak söyleyemem, ancak daha yakından bakacağım ve soruyu genişleteceğim. Yapmak istediğim şey için, bu konuda açık bir şekilde sohbet edip edemeyeceğimden emin değilim, çünkü bu biraz firma bilgimden biraz. Ama eminim ki, sonuçta ortaya çıkan DFA'ya ihtiyacım var.
Jendas

1
Üyelik ve eşdeğerlik sorgularından DFA'ları öğrenmek için Angluin'in algoritmasını çalıştırmayı denediniz mi? Üyelik kısmı kolaydır (DFA'nızı gerekli dizede çalıştırın); eşdeğerlik için, çok sayıda rastgele dizgi çizebilir veya belirli bir uzunlukta tüm dizeleri deneyebilirsiniz. Bu sadece sezgiseldir çünkü ne zaman bittiğini asla bilemezsin, ama bu
hilenin

Yanıtlar:


6

Brzozowski'nin algoritmasını denediniz mi? En kötü çalışma süresi üsteldir, ancak özellikle bir DFA'ya dönüştürmek ve en aza indirmek istediğiniz bir NFA ile başlarken genellikle çok iyi performans gösterdiğini gösteren bazı referanslar görüyorum.

Aşağıdaki yazı alakalı görünmektedir:

Bir NFA ile başladığımız ve bunu bir DFA'ya dönüştürüp en aza indirgemek istediğimiz durumunuza uygulamaları da dahil olmak üzere DFA minimizasyonu için bir dizi farklı algoritmayı değerlendirir.

NFA'nızın güçlü bir şekilde bağlı bileşenleri (SCC) ayrışması (yönlendirilmiş bir grafik olarak kabul edilir) neye benziyor? Bileşenlerin hiçbirinin çok büyük olmadığı birçok bileşeni var mı? Eğer öyleyse, tek bir bileşen aldığınız, NFA'dan DFA'ya dönüştürdüğünüzde en aza indirin ve ardından orijinali yeni belirlenmiş sürümle değiştirdiğiniz bir böl ve fethet algoritması tasarlamanın mümkün olup olmadığını merak ediyorum. Bu tek girişli bileşenler için mümkün olmalıdır (bu bileşenin tüm kenarları tek bir tepe noktasına, giriş tepe noktasına yol açar). Rasgele NFA'lar için böyle bir şey yapmanın mümkün olup olmadığını hemen görmüyorum, ancak SCC'nin yapısının neye benzediğini kontrol ederseniz, bu tür yönlerin keşfetmeye değer olup olmadığını belirleyebilirsin .


Brzozowski'nin algoritması umut verici görünüyor, ancak bölme ve fethetme tekniği daha da fazla! Benim durumumda bunu yapmak gerçekten çok kolay ve büyük kod değişiklikleri gerektirmiyor. Bunu yapacağım ve eğer işe yararsa cevabını kabul edeceğim.
Jendas

2
Geldim

2

bu, orijinal / uzun zaman önce "DFA'yı belirle / DFA'yı en aza indir" stratejisi dışında, bilinen / mevcut algoritmalar anlamında çok iyi çalışılmış bir problem değildir. belirleme adımının sorunlu olduğunu belirtiyor gibi görünse de, üstel boşluk / zaman daha kötü bir duruma sahip olduğu göz önüne alındığında, bu tipik bir durumdur. ortalama performansta önemli ölçüde değişiklik gösterebilen birkaç DFA minimizasyon algoritması olduğunu unutmayın .

daha gayri resmi olarak "determinizasyon olmadan NFA minimizasyonu" olarak da bilinir . bu makalede gösterildiği gibi P = Pspace olmadıkça temelde bile yaklaşık algoritmaların olmadığı anlamında zor olduğu bilinmektedir:

Ancak bu kağıt determinized DFA 1 bulmakta dayalı olmayan bazı algoritmaları genellikle nadiren araştırdı davayı dikkate almadığını st :

Belirsiz otomatadaki durum ve geçiş sayısını azaltmak için farklı teknikler sunuyoruz. Bu teknikler, sol ve sağ dillerin dahil edilmesiyle ilgili, devletler kümesi üzerindeki iki ön siparişe dayanmaktadır. Tam hesaplamaları NP-zor olduğundan, NFA'nın aynı şekilde azaltılmasını sağlayan polinom yaklaşımlarına odaklanıyoruz.

genel olarak mümkün olan en verimli şekilde büyük NFA / DFA dönüşümlerini / minimizasyonlarını vb. işleyebilen halka açık bir paket / uygulamanın AT&T FSM kütüphanesine dikkat edin .

fsmcompactbazen yeterli olabilecek bir stratejisi vardır:

Bir transdüserin veya ağırlıklı alıcının belirlenemediği veya çok büyüdüğü durumlarda, farklı bir optimizasyon yararlı olabilir - fsmcompact. Bu işlem, bir giriş etiketinin, çıkış etiketinin ve maliyetin her üçünü tek bir yeni etikete kodlar, klasik (ağırlıksız alıcı) belirleme ve minimizasyon gerçekleştirir ve daha sonra kodlanmış etiketleri orijinal değerlerine geri çözer. Bunun avantajı her zaman tanımlanmış olması ve çıktı etiketlerini veya maliyetleri yollar boyunca taşımamasıdır. Sonucun ne deterministik ne de minimal olması dezavantajlıdır.


ayrıca bkz . NFA indirimleri hakkında Ilie, Navarro, Yu
vzn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.