एनएफए का उपयोग किए बिना नियमित अभिव्यक्ति से डीएफए कैसे बनाएं?


12

उद्देश्य एक नियमित अभिव्यक्ति से डीएफए बनाना है और "रेगुलर एक्सपी> एनएफए> डीएफए रूपांतरण" का उपयोग करना एक विकल्प नहीं है। ऐसा करने के बारे में कैसे जाना चाहिए?

मैंने यह सवाल हमारे प्रोफेसर से पूछा लेकिन उन्होंने मुझे बताया कि हम अंतर्ज्ञान का उपयोग कर सकते हैं और कृपया किसी भी स्पष्टीकरण को देने से इनकार कर दिया। इसलिए मैं आपसे पूछना चाहता था।

"नियमित ऍक्स्प> एनएफए> डीएफए रूपांतरण" एक विकल्प नहीं है क्योंकि इस तरह के रूपांतरण को एक जटिल जटिल नियमित अभिव्यक्ति को परिवर्तित करने में बहुत समय लगता है। उदाहरण के लिए, एक निश्चित रेगेक्स "रेगेक्स> एनएफए> डीएफए" के लिए एक इंसान को 1 घंटे का समय लगता है। मुझे 30 मिनट से कम समय में रेगेक्स को डीएफए में बदलने की आवश्यकता है।


2
आपको अधिक संदर्भ प्रदान करने की आवश्यकता है। क्या (अनौपचारिक) एल्गोरिदम आप वर्तमान में नियमित अभिव्यक्ति का अनुवाद करने के लिए उपयोग कर रहे हैं? यह आपकी प्रक्रिया को एक उदाहरण के साथ समझाने में मददगार हो सकता है a(a|ab|ac)*a+। आप या तो सीधे उस एनडीएफए का अनुवाद कर सकते हैं जिसे आप डीएफए में कम कर देते हैं, या आप इसे उस चीज के लिए सामान्य कर सकते हैं जो नक्शे को डीएफए में तुरंत बदल देता है।
अमोन

क्या आपको इसे किसी भी माध्यम से विशिष्ट उदाहरणों पर करना है, या क्या आपको एक सामान्य प्रक्रिया प्रदान करनी है। कंप्यूटर द्वारा लागू किया जाना चाहिए?
बबौ

जवाबों:


18

चूंकि आप "रेगेक्स को डीएफए में 30 मिनट से कम समय में बदलना चाहते हैं", मुझे लगता है कि आप अपेक्षाकृत छोटे उदाहरणों पर काम कर रहे हैं।

इस मामले में आप ब्रोज़ोज़ोस्की के एल्गोरिथ्म का उपयोग कर सकते हैं , जो सीधे एक भाषा के नेरोड ऑटोमैटन की गणना करता है (जो कि इसके न्यूनतम नियतात्मक ऑटोमेटन के बराबर जाना जाता है)। यह व्युत्पन्न के प्रत्यक्ष अभिकलन पर आधारित है और यह प्रतिच्छेदन और पूरकता की अनुमति देने वाले विस्तारित नियमित अभिव्यक्तियों के लिए भी काम करता है। इस एल्गोरिथ्म का दोष यह है कि इसे रास्ते में गणना की गई अभिव्यक्तियों की समतुल्यता, एक महंगी प्रक्रिया की जांच करने की आवश्यकता है। लेकिन व्यवहार में, और छोटे उदाहरणों के लिए, यह बहुत कुशल है।[1]

बायां कोटेदार । चलो की एक भाषा होना एक * दो और यू एक शब्द हो। फिर यू - 1 एल = { v एक * | यू वी एल } भाषा यू - 1 एल एक कहा जाता है बाईं भागफल (या व्युत्पन्न छोड़ दिया ) के एलएल*यू

यू-1एल={v*|यूvएल}
यू-1एलएल

Nerode automatonNerode आटोमैटिक मशीन के नियतात्मक आटोमैटिक मशीन है एक ( एल ) = ( क्यू , , , एल , एफ ) जहां क्यू = { यू - 1 एल | यू एक * } , एफ = { यू - 1 एल | यू एल } और संक्रमण समारोह प्रत्येक के लिए परिभाषित किया गया है, एक एल(एल)=(क्यू,,,एल,एफ)क्यू={यू-1एल|यू*}एफ={यू-1एल|यूएल} , सूत्र द्वारा ( यू - 1 एल ) एक = एक - 1 ( यू - 1 एल ) = ( यू एक ) - 1 एल इस बल्कि सार परिभाषा से सावधान रहें। के प्रत्येक राज्य में एक के एक छोड़ दिया भागफल है एल एक शब्द से, और इसलिए की एक भाषा है एक * । प्रारंभिक अवस्था भाषा है एल , और अंतिम राज्यों के सेट के सभी छोड़ दिया quotients का सेट है एल का एक शब्द से एल

(यू-1एल)=-1(यू-1एल)=(यू)-1एल
एल*एलएलएल

,

-11=0-1={1अगर =0अगर -1(एल1एल2)=-1एल1यू-1एल2,-1(एल1एल2)=-1एल1यू-1एल2,-1(एल1एल2)=-1एल1यू-1एल2,-1एल*=(-1एल)एल*
-1(एल1एल2)={(-1एल1)एल2si 1एल1,(-1एल1)एल2-1एल2si 1एल1

एल=(()*)*()*

1-1एल=एल=एल1-1एल1=()*(()*)*=एल2-1एल1=()*=एल3-1एल2=()*(()*)*()*(()*)*=एल2एल2=एल4-1एल2=-1एल3=()*=एल5-1एल3=-1एल4=-1(एल2एल2)=-1एल2=एल4-1एल4=-1(एल2एल2)=एल2-1एल2=एल2-1एल5=-1एल5=()*=एल3
न्यूनतम ऑटोमेटन

[1]

संपादित करें । (५ अप्रैल २०१५) मुझे अभी पता चला है कि एक समान प्रश्न: डीएएफए के निर्माण के लिए क्या एल्गोरिदम मौजूद हैं जो किसी दिए गए रेक्स द्वारा वर्णित भाषा को पहचानता है? cstheory पर पूछा गया था। जवाब आंशिक रूप से जटिलता के मुद्दों को संबोधित करता है।


क्या आप इस एल्गोरिथ्म की जटिलता के बारे में अधिक कह सकते हैं?
बबौ

@babou डीएएफए के लिए एक आरईपी को परिवर्तित करना मुश्किल है, इसलिए यह निश्चित रूप से घातीय है।
जेमाइट

यह शायद उत्तर में जाना चाहिए। ओपी "एनएफए के माध्यम से मानक निर्माण बहुत धीमी गति से होता है" से शुरू होता है और उत्तर का हिस्सा "बुरी किस्मत है, वास्तव में तेज समाधान नहीं है"। यह चर्चा बनी हुई है कि यहां यह मानक निर्माण से बेहतर है या नहीं। (सीसी @jmite)
राफेल

@jmite हाँ मुझे उम्मीद थी कि मेरे सवाल का कारण यह है कि डीएफए के निर्माण के इस तरीके को तब आसान माना जाना चाहिए। (नोट: सिस्टम ने @ jmite उत्तर की सूचना देने में पूरा दिन लगा दिया)।
Babou

2

J.-E. पिन औपचारिकता और पूर्णता के मामले में बेहतर उत्तर प्रदान करता है, लेकिन मुझे लगता है कि "अंतर्ज्ञान" के लिए कुछ कहा जाना चाहिए जो आपके प्रोफेसर को संकेत दे रहा है।

इन मामलों में, सबसे आसान बात यह है कि एक नियमित अभिव्यक्ति को देखें, समझें कि यह किस भाषा को स्वीकार कर रहा है, फिर अपनी रचनात्मकता / चतुराई का उपयोग करके उस भाषा को स्वीकार करने वाले डीएफए का निर्माण करें।

ऐसा करने का कोई सीधा तरीका नहीं है, अन्य एल्गोरिदम के अलावा अन्य ने दिया है, लेकिन यहां कुछ दिशानिर्देश हैं जो उपयोगी साबित हो सकते हैं।

  1. अपने आप से पूछें, क्या मैं एक प्रोग्राम लिख सकता हूं जो केवल बूलियन या बहुत छोटे पूर्णांक चर का उपयोग करके इस आरई को स्वीकार करता है? फिर उस कार्यक्रम को लिखें, और इसे एक डीएफए में परिवर्तित करें जहां मूल्यों के हर संयोजन के लिए एक राज्य है।

  2. नियमित अभिव्यक्ति के कुछ हिस्सों की तलाश करें जिन्हें आप जानते हैं कि आप नियतात्मक रूप से स्वीकार कर सकते हैं, जहां आप जानते हैं "यदि मैं इसे देखता हूं, तो मुझे आरई के इस हिस्से से मेल खाना चाहिए।" इनमें से हमेशा टन नहीं होंगे, लेकिन इन भागों की पहचान उन हिस्सों को दिखा सकती है जो डीएफए बनाने में आसान होंगे, इसलिए आप उन हिस्सों पर अधिक समय बिता सकते हैं जिन्हें वास्तव में गैर-निर्धारणवाद की आवश्यकता होती है।

  3. NFA-> DFA के लिए सबसेट निर्माण वास्तव में एक एल्गोरिथ्म का जटिल नहीं है। इसलिए यदि यह एक असाइनमेंट है, एक परीक्षा प्रश्न नहीं है, तो यह केवल एक कार्यान्वयन को कोड करने के लिए तेज़ हो सकता है, और अपने प्रोग्राम को एनएफए को डीएफए में परिवर्तित कर सकता है। यदि आपने अपने स्वयं के कोड का उपयोग किया है, तो कोई भी प्लेगिज़्म समस्या नहीं होनी चाहिए।

पी=एनपी=पीएसपीसी और अब आप करोड़पति हैं।)

"आगे की ओर देखने का प्रयास करें", कोने काटें जब आप स्थानों में अपने अंतर्ज्ञान का उपयोग कर सकते हैं जब एल्गोरिथ्म को कई चरणों की आवश्यकता होगी लेकिन इसका परिणाम स्पष्ट है।


-2

हालांकि यह सही तरीका नहीं है लेकिन यह ज्यादातर समय काम करता है।

पहला चरण : सबसे छोटी स्ट्रिंग खोजें जिसे रेग्युलर एक्सप्रेशन द्वारा स्वीकार किया जा सकता है। दूसरा चरण : न्यूनतम स्ट्रिंग स्वीकार करने वाली मशीन के लेनदेन के साथ आवश्यक राज्यों को ड्रा करें। तीसरा चरण : सभी राज्यों के लिए शेष अल्फ़ाज़ लेनदेन को आकर्षित करते हैं।

उदाहरण के लिए: नियमित अभिव्यक्ति (0 + 1) * 1 "स्ट्रिंग 1" चरण 1: सबसे छोटी स्ट्रिंग: 1 चरण 2: दो राज्यों Q0 और Q1 के साथ समाप्त होती है। Q0 से Q1 में 1 का लेनदेन। और Q1 को स्वीकार करने की स्थिति है। चरण 3: Q0 राज्य Q0 1 के लिए लेनदेन Q1 है। अब Q0 में ही 0 ट्रांजेक्शन करें। Q1 राज्य Q1 के लिए 1 लेनदेन Q1 में रहेगा। और 0 लेन-देन Q0 में जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.