Wie erstelle ich DFA aus regulären Ausdrücken ohne Verwendung von NFA?


12

Ziel ist es, DFA aus einem regulären Ausdruck zu erstellen, und die Verwendung von "Regular exp> NFA> DFA-Konvertierung" ist keine Option. Wie soll man das machen?

Ich stellte diese Frage unserem Professor, aber er sagte mir, dass wir Intuition benutzen können und lehnte es freundlicherweise ab, Erklärungen abzugeben. Also wollte ich dich fragen.

"Regular exp> NFA> DFA conversion" ist keine Option, da eine solche Konvertierung viel Zeit in Anspruch nimmt, um einen recht komplexen regulären Ausdruck zu konvertieren. Beispielsweise dauert für einen bestimmten Ausdruck "Regex> NFA> DFA" 1 Stunde für einen Menschen. Ich muss Regex in weniger als 30 Minuten in DFA konvertieren.


2
Sie müssen mehr Kontext bereitstellen. Mit welchem ​​(informellen) Algorithmus übersetzen Sie derzeit reguläre Ausdrücke? Es kann hilfreich sein, Ihren Prozess an einem Beispiel wie dem folgenden zu erläutern a(a|ab|ac)*a+. Sie können dies entweder direkt in einen NDFA übersetzen, den Sie in einen DFA reduzieren, oder Sie können ihn auf etwas normalisieren, das sofort einem DFA zugeordnet wird.
amon

Müssen Sie dies an konkreten Beispielen mit welchen Mitteln auch immer tun, oder müssen Sie ein allgemeines Verfahren angeben, um von einem Computer angewendet zu werden?
Babou

Antworten:


18

Da Sie "Regex in weniger als 30 Minuten in DFA konvertieren" möchten, arbeiten Sie vermutlich von Hand an relativ kleinen Beispielen.

In diesem Fall können Sie den Brzozowski-Algorithmus , der direkt den Nerode-Automaten einer Sprache berechnet (von dem bekannt ist, dass er dem minimalen deterministischen Automaten entspricht). Es basiert auf einer direkten Berechnung der Ableitungen und funktioniert auch für erweiterte reguläre Ausdrücke, die eine Schnittmenge und Ergänzung ermöglichen. Der Nachteil dieses Algorithmus besteht darin, dass die Äquivalenz der dabei berechneten Ausdrücke überprüft werden muss. Dies ist ein teurer Prozess. Aber in der Praxis und für kleine Beispiele ist es sehr effizient.[1]

Linke Quotienten . Sei eine Sprache von A und sei u ein Wort. Dann u - 1 L = { v A * | u v L } Die Sprache u - 1 L einen aufgerufen wird linken Quotient (oder links Derivat ) von L .LEINu

u-1L={vEINuvL}
u-1LL

Nerode-Automat . Der Nerode Automat von ist die deterministische Automat A ( L ) = ( Q , A , , L , F ) , wobei Q = { u - 1 L | u A * } , F = { u - 1 L | u L } und die Übergangsfunktion wird für jedes a ∈ definiertLEIN(L)=(Q.,EIN,,L,F)Q.={u-1LuEIN}F={u-1LuL} , nach der Formel ( u - 1 L ) a = a - 1 ( u - 1 L ) = ( u a ) - 1 L Hüten Sie sich vor dieser eher abstrakten Definition. Jeder Zustand von A ist ein linker Quotient von L durch ein Wort und daher eine Sprache von A . Der Ausgangszustand ist die Sprache L , und der Satz von Endzuständen ist die Menge aller linken Quotienten von L durch ein Wort von L .einEIN

(u-1L)ein=ein-1(u-1L)=(uein)-1L
EINLEINLLL

ein,b

ein-11=0ein-1b={1wenn ein=b0wenn einbein-1(L1L2)=ein-1L1u-1L2,ein-1(L1L2)=ein-1L1u-1L2,ein-1(L1L2)=ein-1L1u-1L2,ein-1L=(ein-1L)L
ein-1(L1L2)={(ein-1L1)L2si 1L1,(ein-1L1)L2ein-1L2si 1L1

L=(ein(einb))(bein)

1-1L=L=L1ein-1L1=(einb)(ein(einb))=L2b-1L1=ein(bein)=L3ein-1L2=b(einb)(ein(einb))(einb)(ein(einb))=bL2L2=L4b-1L2=ein-1L3=(bein)=L5b-1L3=ein-1L4=ein-1(bL2L2)=ein-1L2=L4b-1L4=b-1(bL2L2)=L2b-1L2=L2ein-1L5=b-1L5=ein(bein)=L3
Der minimale Automat

[1]

Bearbeiten . (5. April 2015) Ich habe gerade eine ähnliche Frage entdeckt: Welche Algorithmen gibt es für die Erstellung eines DFA, der die von einem bestimmten Regex beschriebene Sprache erkennt? wurde auf cstheory gefragt. Die Antwort befasst sich teilweise mit Komplexitätsproblemen.


Können Sie mehr über die Komplexität dieses Algorithmus sagen?
Babou

@babou Das Umwandeln eines RE in einen DFA ist PSPACE-schwer, also definitiv exponentiell.
jmite

Dies sollte wahrscheinlich in die Antwort gehen. Das OP beginnt mit "Die Standardkonstruktionen über NFA sind zu langsam" und ein Teil der Antwort scheint "Pech, es gibt keine wirklich schnelle Lösung" zu sein. Es bleibt zu diskutieren, ob dies hier besser ist als die Standardkonstruktion. (cc @jmite)
Raphael

@jmite Ja, das habe ich erwartet. Der Grund für meine Frage ist, warum diese Art der Erstellung des DFA dann als einfacher angesehen werden sollte. (Hinweis: Das System hat einen ganzen Tag gebraucht, um mich über die @ jmite-Antwort zu benachrichtigen.)
Babou

2

J.-E. Pin liefert die bessere Antwort in Bezug auf Formalität und Vollständigkeit, aber ich denke, es gibt etwas zu sagen für die "Intuition", auf die Ihr Professor hinweist.

In den meisten Fällen ist es am einfachsten, einen regulären Ausdruck zu betrachten, zu verstehen, welche Sprache akzeptiert wird, und dann mit Ihrer Kreativität / Cleverness einen DFA zu erstellen, der diese Sprache akzeptiert.

Es gibt keinen einfachen Weg, dies zu tun, außer den Algorithmen, die andere gegeben haben, aber hier sind einige Richtlinien, die sich als nützlich erweisen könnten.

  1. Stellen Sie sich die Frage, ob ich ein Programm schreiben kann, das diese RE nur mit booleschen oder sehr kleinen Integer-Variablen akzeptiert. Schreiben Sie dann dieses Programm und konvertieren Sie es in einen DFA, in dem für jede Wertekombination ein Status angegeben ist.

  2. Suchen Sie nach Teilen des regulären Ausdrucks, von denen Sie wissen, dass Sie ihn deterministisch akzeptieren können, wobei Sie wissen: "Wenn ich das sehe, muss ich mit diesem Teil der RE übereinstimmen." Es wird nicht immer Unmengen davon geben, aber das Identifizieren dieser Teile kann zeigen, welche Teile leicht zu einem DFA werden, sodass Sie mehr Zeit mit den Teilen verbringen können, die wirklich Nichtdeterminismus erfordern.

  3. Die Teilmengenkonstruktion für NFA-> DFA ist eigentlich nicht so kompliziert wie ein Algorithmus. Wenn es sich also um eine Aufgabe und nicht um eine Prüfungsfrage handelt, ist es möglicherweise schneller, eine Implementierung zu codieren und Ihr Programm NFA in DFA konvertieren zu lassen. Wenn Sie Ihren eigenen Code verwendet haben, sollte es keine Probleme mit dem Plagarismus geben.

P=NP=PSPEINCE

Versuchen Sie, nach vorne zu schauen, und schneiden Sie Ecken ab, wenn Sie Ihre Intuition an Stellen einsetzen können, an denen der Algorithmus viele Schritte erfordern würde, das Ergebnis jedoch klar ist.


-2

Dies ist zwar nicht der richtige Weg, funktioniert aber die meiste Zeit.

Erster Schritt : Suchen Sie die kleinste Zeichenfolge, die vom regulären Ausdruck akzeptiert werden kann. Zweiter Schritt : Zeichnen Sie die erforderlichen Zustände mit der Transaktion des Mindestautomaten für die Zeichenkettenannahme. Dritter Schritt : Zeichnen Sie für alle Status die verbleibenden Alphabet-Transaktionen.

Zum Beispiel: Regulärer Ausdruck (0 + 1) * 1 "Zeichenfolge endet mit 1" Schritt 1: Kleinste Zeichenfolge: 1 Schritt 2: Zwei Zustände Q0 und Q1. mit der Transaktion von 1 von Q0 bis Q1. und Q1 ist der akzeptierende Zustand. Schritt 3: für Q0 Status Q0 1 Transaktion ist zu Q1. Machen Sie jetzt 0 Transaktion in Q0 selbst. Für Q1 State Q1 1 bleibt die Transaktion in Q1. Und 0 Transaktion wird in Q0 gehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.