Apakah ada mesin "kecil" yang efisien dapat mencocokkan ekspresi reguler?

30

Sudah diketahui bahwa ekspresi reguler dapat dikenali oleh otomat terbatas nondeterministik dengan ukuran yang sebanding dengan ekspresi reguler, atau oleh FA deterministik yang berpotensi lebih besar secara eksponensial. Lebih lanjut, diberikan string s dan ekspresi reguler r , NFA dapat menguji keanggotaan dalam waktu yang sebanding dengan |s||r|, dan DFA dapat menguji keanggotaan dalam waktu yang sebanding dengan |s|. Perlambatan untuk NFA timbul dari kenyataan bahwa pada dasarnya kita perlu melacak set keadaan yang memungkinkan robot itu berada, dan ledakan secara eksponensial untuk DFA timbul dari kenyataan bahwa negara-negara bagian tersebut merupakan elemen dari rangkaian negara bagian dari negara-negara bagian. NFA.

Apakah mungkin untuk secara efisien (yaitu, dalam waktu lebih baik daripada O(|r||s|) , dan ruang yang lebih baik daripada O(2|r|) ) mengenali ekspresi reguler, jika kita mengizinkan menggunakan mesin yang lebih kuat daripada automata terbatas? (Misalnya, apakah ada keuntungan singkat untuk mengenali bahasa biasa dengan pushdown automata, atau mesin pencacah?)

Neel Krishnaswami
sumber
2
Ketika Anda mengatakan bahwa "NFA dapat menguji keanggotaan dalam waktu yang sebanding dengan " yang Anda maksudkan, mesin RAM (deterministik) yang mensimulasikan NFA dengan cara yang jelas membutuhkan banyak waktu? Atau adakah cara lain untuk mendefinisikan "run time of NFA" yang tidak merujuk ke model komputasi lain? (Terlepas dari definisi yang masuk akal tetapi tidak terlalu berguna yang mengatakan bahwa runtime NFA untuk string s adalah | s | .)|s||r|s|s|
Radu GRIGore
Ya, itu interpretasi yang tepat dari pertanyaan saya.
Neel Krishnaswami
2
Maka menurut saya lebih alami untuk hanya bertanya ini: Apakah ada algoritma (pada mesin RAM) yang memutuskan apakah string dalam bahasa yang didefinisikan oleh ekspresi reguler r yang bekerja di o ( | s || r | ) waktu dan o ( 2 | r | ) ruang? (Terutama jika Anda mendefinisikan runtime dari pushdown automata juga dalam hal mesin RAM.)sro(|s||r|)o(2|r|)
Radu GRIGore
1
Saya tidak mengerti masalah sebenarnya. Apakah input berupa string s dan ekspresi reguler r, dan masalahnya adalah memutuskan apakah s dalam bahasa yang didefinisikan oleh ekspresi reguler r?
Robin Kothari
@Robin: ya, itu dia. Saya ingin tahu apakah Anda dapat mencocokkan ekspresi reguler lebih efisien daripada automata terbatas dengan menggunakan lebih banyak daya komputasi, atau jika fitur tambahan (mis. Tumpukan, RAM) tidak membantu.
Neel Krishnaswami

Jawaban:

20

Cukup mudah untuk menukar waktu dengan ruang, sebagai berikut.

Mengkonversi ekspresi reguler ke NFA - untuk konkret dalam algoritma membandingkan, kita akan berasumsi bahwa adalah jumlah negara NFA, sehingga Anda O ( r s ) terikat waktu untuk langsung simulasi NFA valid dan Anda O ( 2 r ) ruang yang terikat untuk menjalankan DFA yang dikonversi juga berlaku setiap kali Anda bekerja dalam RAM yang dapat mengatasi banyak memori.rO(rs)O(2r)

Sekarang, pisahkan status NFA (sewenang-wenang) menjadi himpunan bagian S i paling banyak r / k menyatakan masing-masing. Dalam setiap subset S i , kita dapat mengindeks himpunan bagian A i dari S i dengan angka dari 0 hingga 2 r / k - 1 .kSir/kSiAiSi02r/k1

Buat tabel mana i dan j berada dalam kisaran dari 0 hingga k - 1 , c adalah simbol input, dan A i adalah (indeks numerik) subset dari S i . Nilai yang disimpan dalam tabel adalah (indeks numerik) himpunan bagian dari S j : keadaan y adalah dalam T [ i , j , c , A i ] jika dan hanya jikaT[i,j,c,Ai]ijk1cSEBUAHsayaSsayaSjyT[saya,j,c,SEBUAHsaya] milik S j dan ada keadaan dalam A i yang bertransisi ke y pada simbol input c .ySjSEBUAHsayayc

Untuk mensimulasikan NFA, pertahankan indeks , satu untuk setiap S i , tentukan subset A i dari status di S i yang dapat dijangkau oleh beberapa awalan input. Untuk setiap simbol input c , gunakan tabel untuk mencari, untuk setiap pasangan i , j , himpunan status dalam S j yang dapat dicapai dari keadaan di A i dengan transisi pada c , dan kemudian gunakan biner bitwise atau operasi pada indeks numerik set negara-negara untuk menggabungkan mereka menjadi satu subset tunggal negara S jkSsayaSEBUAHsayaSsayacsaya,jSjSEBUAHsayacSj. Jadi, setiap langkah simulasi membutuhkan waktu , dan total waktu untuk simulasi adalah O ( s k 2 ) .HAI(k2)HAI(sk2)

Ruang yang dibutuhkan adalah ruang untuk semua tabel, yaitu . Analisis ruang dan waktu berlaku pada setiap RAM yang dapat mengatasi memori sebanyak itu dan yang dapat melakukan operasi biner pada kata-kata yang cukup besar untuk mengatasi memori sebanyak itu.HAI(k22r/k)

Pengorbanan ruang-waktu yang Anda dapatkan dari ini tidak cocok dengan simulasi NFA, karena ketergantungan kuadrat pada . Tapi kemudian, saya skeptis bahwa O ( r s ) adalah waktu yang tepat terikat untuk simulasi NFA: bagaimana Anda mensimulasikan satu langkah dari NFA lebih cepat daripada melihat semua (mungkin kuadratik banyak) transisi diperbolehkan dari saat ini negara aktif ke negara lain? Bukankah seharusnya O ( r 2 s ) ?kHAI(rs)HAI(r2s)

Dalam hal apa pun dengan membiarkan bervariasi, Anda bisa mendapatkan batas waktu pada kontinum antara batas DFA dan NFA, dengan ruang lebih sedikit daripada DFA.k

David Eppstein
sumber
Saya pikir koreksi Anda benar, dan jawaban Anda menjawab pertanyaan saya. Namun, pertanyaan yang ingin saya tanyakan adalah seberapa besar kekuatan komputasi tambahan membantu. (Misalnya, dengan penghitung, Anda dapat mencocokkan string dalam O (1) spasi.) Jika Anda tidak keberatan, saya akan membiarkan pertanyaan terbuka sedikit lebih lama untuk melihat apakah ada yang tahu jawaban untuk itu. ...Sebuahk
Neel Krishnaswami
@Neel: Jika solusi David adalah yang terbaik yang bisa dilakukan mesin RAM, maka tumpukan, penghitung, dll. Tidak akan membantu. (Tapi, tentu saja, ia hanya memberi batas atas, bukan batas bawah.)
Radu GRIGore
1
Sejauh yang saya tahu, solusi saya memang menggunakan "kekuatan tambahan": itu didasarkan pada pencarian tabel dan indeks integer, sesuatu yang tidak tersedia dalam model DFA atau NFA. Jadi saya tidak begitu mengerti bagaimana itu tidak menjawab bagian dari pertanyaan itu.
David Eppstein
Berikut adalah cara alternatif untuk menetapkan ini. Misalkan kita berada pada mesin RAM dengan lebar kata , di mana w lg r . Kemudian simulasi NFA membutuhkan waktu O ( s r 2 ) dan O ( r / w ) . Simulasi DFA tidak dimungkinkan jika r w (tidak tersedia cukup ruang). Konstruksi dalam jawaban ini menetapkan k r / w dan mengambil O ( s r 2 / w 2wwlgrHAI(sr2)HAI(r/w)rwkr/wHAI(sr2/w2) waktu dan menggunakan semua ruang yang tersedia (yaitu, sesuatu di sekitar ruang ). Ini pada dasarnya memanfaatkan bit-paralelisme yang tersedia di mesin RAM untuk melakukan simulasi NFA lebih cepat. 2w
DW
4

Ini bukan jawaban, tapi terlalu lama untuk dikomentari. Saya mencoba menjelaskan mengapa pertanyaan itu, seperti yang diajukan, mungkin sulit dimengerti.

Ada dua cara untuk menentukan kompleksitas komputasi untuk perangkat X .

Cara pertama dan paling alami adalah intrinsik . Kita perlu mengatakan bagaimana perangkat X menggunakan input, sehingga kita nanti dapat melihat bagaimana ukuran n dari input mempengaruhi waktu operasi perangkat. Orang juga perlu mengatakan apa yang dianggap sebagai operasi (atau langkah ). Kemudian kita biarkan perangkat berjalan pada input dan menghitung operasi.

Yang kedua adalah ekstrinsik . Kami mendefinisikan kompleksitas komputasi untuk perangkat lain Y dan kemudian kita program Y untuk bertindak sebagai simulator untuk X . Karena mungkin ada beberapa cara bagi Y untuk mensimulasikan X , kita perlu menambahkan bahwa kita seharusnya menggunakan yang terbaik. Biarkan saya mengatakan hal yang sama dengan kata-kata lain: Kita mengatakan bahwa X membutuhkan waktu pada input ukuran n jika ada simulator X diimplementasikan pada mesin Y yang membutuhkan f ( n )HAI(f(n))f(n) .

Sebagai contoh, definisi intrinsik untuk NFA mengatakan bahwa dibutuhkan n langkah untuk memproses string dengan panjang n ; definisi ekstrinsik yang menggunakan mesin RAM sebagai perangkat Y mengatakan bahwa batas atas yang paling dikenal mungkin adalah jawaban David Eppstein. (Kalau tidak, akan aneh bahwa (1) implementasi praktis terbaik yang ditunjukkan dalam jawaban lain tidak menggunakan alternatif yang lebih baik dan (2) tidak ada yang menunjukkan alternatif yang lebih baik.) Perhatikan juga bahwa secara tegas perangkat Anda X adalah ekspresi reguler , tetapi karena NFA memiliki ukuran yang sama, aman untuk menganggapnya sebagai perangkat X yang Anda lihat.

Sekarang, ketika Anda menggunakan definisi jenis kedua, tidak masuk akal untuk bertanya bagaimana membatasi fitur-fitur perangkat X mempengaruhi waktu berjalan. Namun masuk akal untuk bertanya bagaimana membatasi fitur perangkat Y mempengaruhi waktu berjalan. Jelas, memungkinkan mesin yang lebih kuat Y memungkinkan kita untuk mensimulasikan X lebih cepat. Jadi, jika kita mengasumsikan salah satu mesin paling kuat yang dapat diimplementasikan (ini mengesampingkan mesin nondeterministik, misalnya) dan menghasilkan batas bawah , maka kita tahu bahwa tidak ada mesin yang kurang kuat yang dapat melakukan lebih baik.Ω(f(n))

Jadi, dalam arti tertentu, jawaban terbaik yang bisa Anda harapkan adalah bukti dalam sesuatu seperti model probe sel yang mensimulasikan NFA membutuhkan jumlah waktu tertentu. (Perhatikan bahwa jika Anda memperhitungkan konversi NFA ke DFA, Anda perlu waktu untuk menuliskan DFA besar, jadi memori bukan satu-satunya masalah di sana.)

Radu GRIGore
sumber
4

Bahkan jika Anda percaya bahwa tidak ada yang baru atau lama untuk dipelajari tentang pencocokan ekspresi reguler, lihat salah satu makalah yang paling indah yang pernah saya temui sejak lama: Sebuah permainan ekspresi reguler oleh S Fischer, F Huch, dan T Wilke, ICFP 2010.

(MMT Chakravarty layak mendapat pujian karena merekomendasikan makalah ini.)

EDIT: Alasan mengapa makalah ini relevan adalah karena menjelaskan teknik baru (berdasarkan Glushkov dari 60ies) yang menghindari membangun NFA lengkap (apalagi DFA) yang sesuai dengan RE. Apa yang dilakukan sebaliknya menyerupai menjalankan algoritma penandaan yang mirip dengan yang terkenal untuk memutuskan penerimaan kata oleh NFA pada pohon sintaks RE. Pengukuran kinerja menunjukkan bahwa ini kompetitif, bahkan dengan perpustakaan re2 Google yang baru diterbitkan.

Kai
sumber
Makalah yang bagus untuk dibaca !!
Hsien-Chih Chang 張顯 之
1

Lihatlah artikel ini oleh Russ Cox. Ini menggambarkan pendekatan berbasis NFA, pertama kali digunakan oleh Ken Thompson, di mana string input s dapat dicocokkan dengan ekspresi reguler r dalam waktu O (| s |. C ) dan ruang O (| r |. D ), di mana c dan d adalah konstanta batas atas. Artikel ini juga merinci implementasi C dari teknik ini.


sumber
2
Saya tidak yakin itu deskripsi artikel yang akurat. Tampaknya membangun DFA dari NFA berdasarkan kebutuhan dan caching hasilnya. Tetapi ukuran cache bisa eksponensial dalam r.
David Eppstein