Düzenli ifadelere verimli bir şekilde uyan “küçük” makineler var mı?


30

Düzenli bir ifadenin, normal ifadeyle orantılı büyüklükte olmayan belirli olmayan bir sonlu otomat tarafından veya potansiyel olarak üssel olarak daha büyük olan deterministik bir FA ile tanınabileceği iyi bilinmektedir. Ayrıca, bir dizesi ve normal ifade verildiğinde , NFA üyeliği orantılı olarak test edebilir. ve DFA üyeliği orantılı olarak test edebilir. . NFA için yavaşlama, esasen otomatın içinde olabileceği muhtemel durum kümelerini izlememiz gerektiği ve DFA için katlanarak patlayan devletlerin devletlerin güçlerinin unsurları olduğu gerçeğinden kaynaklanmaktadır. NFA.r | s | | r | | s |sr|s||r||s|

Daha güçlü makineler kullanmaya izin verirsek , verimli bir şekilde (yani, den daha iyi zaman ve den daha iyi zaman alan ) normal ifadeleri tanıyabilir mi? sonlu otomatlardan daha mı? (Örneğin, normal dilleri pushdown otomatalı veya tezgahlı makinelerle tanımada başarı kazanımları var mı?)O ( 2 | r | )O(|r||s|)O(2|r|)


2
"NFA üyeliği |s||r| " ile orantılı olarak test edebilir mi derken , NFA'yı açık bir şekilde simüle eden (deterministik) bir RAM makinesinin bu kadar zaman alacağını mı söylüyorsunuz ? Yoksa başka bir hesaplama modeline atıfta bulunmayan "NFA'nın çalışma zamanını" tanımlamanın başka bir yolu var mı? (Dışında dize herhangi NFA çalışma zamanı söylüyor çok faydalı mantıklı değil tanımından ise .)| s |s|s|
Radu Grigore

Evet, sorumun doğru yorumu bu.
Neel Krishnaswami,

2
O zaman bana basitçe şunu sormak daha doğal gözüküyor: Bir dizgenin da çalışan normal ifade tarafından tanımlanan dilde olup olmadığına karar veren bir algoritma var mı? zaman ver o ( | s || r | ) o ( 2 | r | ) boşluğu? (Özellikle, bir push-automata'nın çalışma zamanını RAM makinesi açısından da tanımlarsanız.)sro(|s||r|)o(2|r|)
Radu GRIGore

1
Sorunu tam olarak anlamıyorum. Giriş bir s dizgisi ve normal bir ifade mi, ve sorun, s'nin normal ifade r tarafından tanımlanan dilde olup olmadığına karar vermektir.
Robin Kothari

@ Robin: evet, işte bu. Daha fazla hesaplama gücü kullanarak normal ifadelerin sonlu otomatlardan daha verimli bir şekilde eşleştirilip eşleştirilemeyeceğini veya ek özellikler (örneğin yığın, RAM) yardımcı olmuyorsa bilmek isterim.
Neel Krishnaswami

Yanıtlar:


20

Aşağıdaki gibi, mekan için zaman kazanmak için yeterince kolay.

Biz o varsayıyoruz karşılaştıran algoritmalarda somutluktan için - bir NFA düzenli ifade dönüştürün , NFA durum sayısıdır böylece o Ç ( r s ) zaman doğrudan NFA simüle gitmekte geçerli olduğundan ve Ç ( 2 r ) Dönüştürülmüş DFA'yı çalıştırmak için bağlı alan, bu kadar fazla belleği ele alabilen bir RAM'de çalışırken de geçerlidir.rO(rs)O(2r)

Şimdi, içine NFA (keyfi) durumlarını bölüm alt kümeleri S i en fazla bir r / k her belirtiyor. Her bir alt-kümesi içinde S i , biz göstergesi alt-kümeleri bir i arasında S i arasındaki bir sayı ile 0 bulundunuz 2 R / K - 1 .kSir/kSiAiSi02r/k1

Bir tablo inşa burada i ve j, 0 ila aralığındadır k - 1 , c bir giriş sembolüdür ve bir ı (sayısal göstergesi) 'in bir alt kümesidir S i . Tabloda depolanan değer, bir S j alt kümesidir (sayısal indeksi) : bir y durumu T [ i , j , c , A i ] durumunda ve sadeceT[i,j,c,Ai]ijk1cAiSiSjyT[i,j,c,Ai] ait S j ve bir durumu vardır , A ı edilene geçişler y giriş sembolü c .ySjAiyc

Korumak NFA simüle etmek için endeksleri, her biri için bir S i alt grubu belirten, A ı in durumlarının S i girişi bazı ön-ek ile ulaşılabilir. Her bir giriş için, sembol , c , her çifti için, aramak için masalar kullanmak i , j , devletler grubu S j bir durumdan ulaşılabilir A I ile ilgili bir geçiş ile , c , ve daha sonra bir bit-bazında ikili kullanmak ya da Bunları tek bir S j durumunun bir alt kümesinde birleştirmek için bu durum kümelerinin sayısal endeksleri üzerinde işlem yapılmasıkSiAiSici,jSjAicSj. Bu nedenle, simülasyon her aşaması zaman alır ve simülasyon için toplam süre olan O ( s k 2 ) .O(k2)O(sk2)

Gereken alan tüm tabloların bir alandır . Zaman ve alan analizi, bu kadar fazla belleğe hitap edebilecek ve bu kadar fazla belleği giderecek kadar büyük olan kelimelerde ikili işlemler yapabilen herhangi bir RAM'de geçerlidir.O(k22r/k)

Bu aldığım zaman-mekan değiş tokuş mükemmel çünkü üzerinde kuadratik bağımlılık, NFA simülasyonu uymuyor . Ancak, N ( N ) simülasyonu için O ( r s ) 'nin doğru zamana bağlı olduğuna kuşkuluyum : NFA'nın tek bir adımını şu anda izin verilen tüm (muhtemelen kuadrik olarak birçok) geçişe bakmaktan daha hızlı nasıl simüle edersiniz? başka bir devlet için aktif durum? O ( r 2 s ) olmamalı mı ?kO(rs)O(r2s)

Her durumda, değişmesine izin vererek , DFA ile NFA sınırları arasındaki süreklilikte, DFA'dan daha az alana sahip zaman sınırlamaları alabilirsiniz.k


Düzeltmenizin doğru olduğunu düşünüyorum ve cevabınız sorduğum soruyu cevaplıyor. Bununla birlikte, sormak istediğim soru, hesaplama gücünün ne kadar yardımcı olduğudur. (Örneğin, O (1) uzayda bir k dizesini eşleştirebilirsiniz .) Sakıncası yoksa, birisinin cevabını bilip bilmediğini görmek için soruyu bir süre daha açık bırakacağım. ...ak
Neel Krishnaswami

@Neel: Eğer David'in çözümü bir RAM makinesinin yapabileceği en iyisiyse , o zaman istif, sayaç vb. Yardımcı olmaz. (Ancak, elbette, yalnızca üst sınırlar verdi, alt sınırlar değil.)
Radu GRIGore

1
Söyleyebileceğim kadarıyla, çözümüm "ek güç" kullanıyor: DFA veya NFA modellerinde bulunmayan bir şey olan tablo aramalarına ve tam sayı endekslerine dayanıyor. Bu yüzden sorunun bu kısmına nasıl cevap vermediğini anlamıyorum.
David Eppstein

İşte bunu parametreleştirmenin alternatif bir yolu. Kelimesini genişliği olan bir RAM makinesi üzerinde varsayalım burada, w lg r . Daha sonra NFA simülasyonu O ( s r 2 ) zaman ve O ( r / w ) alan alır. DFA simülasyon mümkün değilse r ağırlık (yeterli alanı). Bu yanıt setleri inşaat k R / W alır ve O ( s r 2 / w 2wwlgrO(sr2)O(r/w)rwkr/w Zamanı ve kullanımları mevcut tüm uzay (yani civarında şey 2 w boşluk). Temel olarak NFA simülasyonunu daha hızlı yapmak için bir RAM makinesinde bulunan bit-paralellikten faydalanıyor. O(sr2/w2)2w
DW

4

Bu bir cevap değil, yorum yapmak için çok uzun. Sorunun neden belirtildiği gibi anlaşılmasının zor olduğunu açıklamaya çalışıyorum.

Bir aygıt X için hesaplama karmaşıklığını tanımlamanın iki yolu vardır .

İlk ve en doğal yol içseldir . Bir kişinin X cihazının girişi nasıl kullandığını söylemek gerekir , böylece daha sonra girişin n boyutunun cihazın çalışma süresini nasıl etkilediğine bakabiliriz . Ayrıca bir operasyonun (veya adımın ) neyin önemli olduğunu söylemesi gerekir . Daha sonra sadece cihazın giriş üzerinde çalışmasına ve işlem yapmasına izin veriyoruz.

İkincisi dışsal . Başka bir aygıt Y için hesaplama karmaşıklığını tanımlarız ve sonra Y'yi X için bir simülatör olarak davranacak şekilde programlıyoruz . Y'nin X'i taklit etmesinin birden fazla yolu olabileceğinden , en iyisini kullanmamız gerektiğini eklememiz gerekir. Beni başka deyişle aynı diyelim: Biz söylemek X'in alır boyutta bir girişi zaman n bir simülatör mevcutsa X makine üzerinde uygulanan Y o alır f ( n ) zaman.O(f(n))f(n)

Örneğin, NFA için içsel bir tanım bu alır söylüyor n adım uzunluğu bir dizi işleme n ; Y cihazı olarak bir RAM makinesi kullanan dışsal bir tanım, en iyi bilinen üst sınırın muhtemelen David Eppstein'ın cevapladığı şey olduğunu söylüyor . (Aksi takdirde (1) en iyi pratik uygulama daha iyi bir alternatif ve kullanmayan diğer yanıtında işaret garip olurdu (2) Hiç kimse burada daha iyi bir alternatif gösterdi.) Not da kesinlikle cihazınız konuşan o X'i düzenli ifadedir , ancak NFA aynı boyuta sahip olduğundan, onu bakıyor olduğunuz cihaz X olarak almak güvenlidir .

Şimdi, ikinci tür bir tanım kullandığınızda, aygıt X'in özelliklerinin kısıtlanmasının çalışma süresini nasıl etkilediğini sormak çok mantıklı olmaz . Bununla birlikte, Y cihazının özelliklerinin kısıtlanmasının çalışma süresini nasıl etkilediğini sormak mantıklıdır . Açıkçası, izin daha güçlü makineler Y bize simüle etmek için izin verebilir X daha hızlı. Biz (örneğin nondeterministic makineleri dışarı bu kuralları,) uygulanabilecek en güçlü makinelerin birini üstlenecek ve bir alt sınır ile gelip Yani, eğer , o zaman biliyoruz hiçbir az güçlü makine yapabileceği daha iyi.Ω(f(n))

Bu nedenle, bir anlamda umut edebileceğiniz en iyi cevap, NFA'yı simüle etmek için belirli bir zamana ihtiyaç duyan hücre probu modeli gibi bir şeyin kanıtıdır. (NFA’yı DFA’ya dönüştürürseniz, büyük DFA’yı yazmak için zamana ihtiyacınız olduğunu unutmayın; bu nedenle hafıza tek sorun değil.)


4

Düzenli ifade eşleştirmesi hakkında öğrenilecek yeni veya eski bir şey olmadığını düşünseniz bile, uzun süredir karşılaştığım en güzel makalelerden birini inceleyin: S Fischer, F Huch ve T'nin düzenli ifadeleriyle ilgili bir oyun Wilke, ICFP 2010.

(MMT Chakravarty, bu makaleyi önerme kredisini hak ediyor.)

EDIT: Bu yazının alakalı olmasının nedeni, RE'ye karşılık gelen NFA'nın (DFA'dan bağımsız olarak) tam NFA'nın oluşturulmasından kaçınan yeni bir teknik (Glushkov'un 60'larına dayanarak) tanımlamasıdır. Bunun yerine, RE'nin sözdizimi ağacı üzerinde bir NFA tarafından bir kelimenin kabul edilmesine karar vermede bilinenlere benzer bir işaretleme algoritması çalıştırmaya benzer. Performans ölçümleri, Google'ın yakın zamanda yayınlanan re2 kitaplığında bile bunun rekabetçi olduğunu göstermektedir.


Okumak için güzel bir kağıt!
Hsien-Chih Chang,

1

Russ Cox'un bu makalesine bir göz atın . Bu, bir giriş dizgesi ilk Ken Thompson tarafından kullanılan bir NFA dayalı bir yaklaşım, tarif ler normal ifade eşleştirilebilir r (| zaman O'da s |. C (| ve uzay O) R |. D , olduğu) c ve d , üst sınır sabitleridir. Makalede ayrıca bir C teknik uygulaması ayrıntılandırılmıştır.


2
Bunun makalenin doğru bir açıklaması olduğuna ikna olmadım. DFA'yı NFA'dan ihtiyaç duyulduğu şekilde oluşturmak ve sonuçları önbelleğe almak gibi görünüyor. Ancak, önbellek boyutu r cinsinden üstel olabilir.
David Eppstein
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.