Satz von Immerman und Szelepcsényi

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Der Satz von Immerman und Szelepcsényi ist ein Satz aus der Komplexitätstheorie und besagt, dass die nichtdeterministischen Platzkomplexitätsklassen unter Komplementbildung abgeschlossen sind. Insbesondere ist daher die Klasse NL (nichtdeterministisch logarithmischer Platz) unter Komplementbildung abgeschlossen.

Lange nahm man wie für die nichtdeterministischen Zeitkomplexitätsklassen an, dass NL nicht unter dem Komplement abgeschlossen sei, bis 1988 Immerman und Szelepcsényi unabhängig voneinander den Beweis erbrachten. Dafür wurde beiden gemeinsam der Gödel-Preis (1995) verliehen.

Formale Definition

[Bearbeiten | Quelltext bearbeiten ]

Sei s : N N {\displaystyle s:\mathbb {N} \rightarrow \mathbb {N} } {\displaystyle s:\mathbb {N} \rightarrow \mathbb {N} } eine monotone Funktion mit s ( n ) Ω ( log ( n ) ) {\displaystyle s(n)\in \Omega (\log(n))} {\displaystyle s(n)\in \Omega (\log(n))}. Dann gilt:

NSPACE ( s ( n ) ) = co-NSPACE ( s ( n ) ) {\displaystyle {\textsf {NSPACE}}(s(n))={\textsf {co-NSPACE}}(s(n))} {\displaystyle {\textsf {NSPACE}}(s(n))={\textsf {co-NSPACE}}(s(n))}

Insbesondere gilt dann NL = co-NL {\displaystyle {\textsf {NL}}={\textsf {co-NL}}} {\displaystyle {\textsf {NL}}={\textsf {co-NL}}}. Es gilt aber auch, dass aus NL = co-NL {\displaystyle {\textsf {NL}}={\textsf {co-NL}}} {\displaystyle {\textsf {NL}}={\textsf {co-NL}}} mit der Paddingtechnik das Theorem für alle s ( n ) Ω ( log ( n ) ) {\displaystyle s(n)\in \Omega (\log(n))} {\displaystyle s(n)\in \Omega (\log(n))} folgt.

Der Beweis verwendet die Beweistechnik des (nichtdeterministischen) induktiven Zählens.

Vorbemerkungen

[Bearbeiten | Quelltext bearbeiten ]

Sei L := L ( G ) {\displaystyle L:=L(G)} {\displaystyle L:=L(G)} eine Sprache über der Typ-1-Grammatik G := ( N , Σ , δ , S ) {\displaystyle G:=(N,\Sigma ,\delta ,S)} {\displaystyle G:=(N,\Sigma ,\delta ,S)} mit den üblichen Symbolen für Nichtterminale N {\displaystyle N} {\displaystyle N}, Terminale Σ {\displaystyle \Sigma } {\displaystyle \Sigma }, Produktionsregeln δ {\displaystyle \delta } {\displaystyle \delta } und dem Startsymbol S {\displaystyle S} {\displaystyle S}. Dann ist für ein Wort w Σ {\displaystyle w\in \Sigma ^{\ast }} {\displaystyle w\in \Sigma ^{\ast }} der Graph G r a p h | w | := ( ( Σ N ) | w | , α G β ) {\displaystyle Graph_{|w|}:=((\Sigma \cup N)^{\leq |w|},\alpha \Rightarrow _{G}\beta )} {\displaystyle Graph_{|w|}:=((\Sigma \cup N)^{\leq |w|},\alpha \Rightarrow _{G}\beta )} derjenige Graph, der alle Satzformen mit einer Länge höchstens der Länge von w {\displaystyle w} {\displaystyle w} enthält, wobei der Graph genau dann eine Kante zwischen zwei Satzformen hat, wenn es eine Produktion in G {\displaystyle G} {\displaystyle G} gibt. Insbesondere enthält der Graph sowohl S {\displaystyle S} {\displaystyle S} als auch w {\displaystyle w} {\displaystyle w} selbst und es gilt, dass w L {\displaystyle w\in L} {\displaystyle w\in L} genau dann, wenn es einen Pfad von S {\displaystyle S} {\displaystyle S} nach w {\displaystyle w} {\displaystyle w} in diesem Graphen gibt.

Wenn es nun möglich ist, eine nichtdeterministische, linear beschränkte Turingmaschine zu konstruieren, die genau dann akzeptiert, wenn es keinen Pfad von S {\displaystyle S} {\displaystyle S} nach w {\displaystyle w} {\displaystyle w} gibt, ist der Beweis erbracht.

Nicht-Erreichbarkeit

[Bearbeiten | Quelltext bearbeiten ]

Zunächst sei angenommen, dass die Anzahl N {\displaystyle N} {\displaystyle N} der erreichbaren Knoten von S {\displaystyle S} {\displaystyle S} bekannt ist (wir verschieben die Berechnung von N {\displaystyle N} {\displaystyle N} auf später). Dann löst folgender Algorithmus die Nicht-Erreichbarkeit.

Gegeben Graph G = ( V , E ) {\displaystyle G=(V,E)} {\displaystyle G=(V,E)}, Startknoten s {\displaystyle s} {\displaystyle s}, Zielknoten t {\displaystyle t} {\displaystyle t} und Anzahl erreichbarer Knoten N {\displaystyle N} {\displaystyle N}.

  1. Initialisiere Zähler c := 0 {\displaystyle c:=0} {\displaystyle c:=0}
  2. Für jeden Knoten v V {\displaystyle v\in V} {\displaystyle v\in V}:
    • Rate nichtdeterministisch, ob v {\displaystyle v} {\displaystyle v} von s {\displaystyle s} {\displaystyle s} erreichbar ist und falls die Antwort positiv ist:
      • Rate nichtdeterministisch einen Pfad von s {\displaystyle s} {\displaystyle s} nach v {\displaystyle v} {\displaystyle v} der Länge höchstens | V | {\displaystyle |V|} {\displaystyle |V|} und
      • falls der Pfad falsch war oder nicht zu v {\displaystyle v} {\displaystyle v} führt, breche mit nein ab,
      • falls v = t {\displaystyle v=t} {\displaystyle v=t}, breche mit nein ab (denn der Knoten ist offenbar erreichbar),
      • ansonsten erhöhe den Zähler c {\displaystyle c} {\displaystyle c} um eins.
  3. Falls c < N {\displaystyle c<N} {\displaystyle c<N}, breche mit nein ab, ansonsten gebe ja aus.

Weder N {\displaystyle N} {\displaystyle N} noch c {\displaystyle c} {\displaystyle c} können größer als | V | {\displaystyle |V|} {\displaystyle |V|} sein und verbrauchen demnach (binär kodiert) nicht mehr als log ( | V | ) {\displaystyle \log(|V|)} {\displaystyle \log(|V|)} Speicherplatz. Der Algorithmus stellt sicher, dass alle N {\displaystyle N} {\displaystyle N} Knoten, die von s {\displaystyle s} {\displaystyle s} erreichbar sind, aufgezählt werden und akzeptiert nur dann, wenn t {\displaystyle t} {\displaystyle t} keiner dieser Knoten war.

Induktives Zählen

[Bearbeiten | Quelltext bearbeiten ]

Es bleibt jetzt nur noch die bislang unbekannte Anzahl N {\displaystyle N} {\displaystyle N} der erreichbaren Knoten zu ermitteln. Die Idee ist, die Anzahl N i {\displaystyle N_{i}} {\displaystyle N_{i}} der Knoten zu berechnen, die in höchstens i {\displaystyle i} {\displaystyle i} Schritten erreichbar sind. Man lässt i {\displaystyle i} {\displaystyle i} dann induktiv hochzählen und verwendet, dass N = N | V | {\displaystyle N=N_{|V|}} {\displaystyle N=N_{|V|}} gilt. Der Algorithmus funktioniert wie folgt:

  1. Initialisiere N 0 := 1 {\displaystyle N_{0}:=1} {\displaystyle N_{0}:=1} (der Startknoten benötigt keinen Schritt um erreicht zu werden)
  2. Für jede Anzahl an Schritten i = 1 , , | V | {\displaystyle i=1,\dots ,|V|} {\displaystyle i=1,\dots ,|V|}:
    1. Initialisiere N i := 0 {\displaystyle N_{i}:=0} {\displaystyle N_{i}:=0}.
    2. {\displaystyle \star } {\displaystyle \star } Für jeden Knoten v V {\displaystyle v\in V} {\displaystyle v\in V}:
      1. Initialisiere einen Zähler c := 0 {\displaystyle c:=0} {\displaystyle c:=0}
      2. Für jeden Knoten u V {\displaystyle u\in V} {\displaystyle u\in V}:
        • Rate nichtdeterministisch, ob u {\displaystyle u} {\displaystyle u} von s {\displaystyle s} {\displaystyle s} in weniger als i {\displaystyle i} {\displaystyle i} Schritten erreichbar ist.
        • Falls ja, rate einen Pfad von s {\displaystyle s} {\displaystyle s} mit einer Länge kleiner i {\displaystyle i} {\displaystyle i} und breche ab, falls der Pfad nicht in u {\displaystyle u} {\displaystyle u} endet.
        • Falls so ein Pfad gefunden wurde, erhöhe den Zähler c {\displaystyle c} {\displaystyle c} um eins und ...
        • ... wenn u {\displaystyle u} {\displaystyle u} gleich v {\displaystyle v} {\displaystyle v} ist oder es eine Kante von u {\displaystyle u} {\displaystyle u} nach v {\displaystyle v} {\displaystyle v} gibt, erhöhe N i {\displaystyle N_{i}} {\displaystyle N_{i}} ebenfalls um eins und setze die Iteration von v {\displaystyle v} {\displaystyle v} fort (markiert mit {\displaystyle \star } {\displaystyle \star }).
      3. Falls c < N i 1 {\displaystyle c<N_{i-1}} {\displaystyle c<N_{i-1}}, breche die Berechnung ab
  3. Gebe N | V | {\displaystyle N_{|V|}} {\displaystyle N_{|V|}} zurück.

Da sich der Algorithmus lediglich drei Zähler ( c , N i , N i 1 {\displaystyle c,N_{i},N_{i-1}} {\displaystyle c,N_{i},N_{i-1}}) gleichzeitig merken muss, lässt er sich mit logarithmischem Speicherplatz realisieren. Ein formaler Beweis der Korrektheit wird dem interessierten Leser überlassen. Als Beweisidee dient folgender Hinweis: N i {\displaystyle N_{i}} {\displaystyle N_{i}} wird genau dann nicht inkrementiert, wenn alle Knoten mit einer Distanz kleiner als i {\displaystyle i} {\displaystyle i} ausprobiert wurden und kein weiterer direkt (d. h. in höchstens einem Schritt) erreichbarer Knoten gefunden werde konnte.

Nun müssen lediglich beide Algorithmen kombiniert werden.

  1. Berechne N {\displaystyle N} {\displaystyle N} für G := G r a p h | w | {\displaystyle G:=Graph_{|w|}} {\displaystyle G:=Graph_{|w|}} und s := S {\displaystyle s:=S} {\displaystyle s:=S} durch induktives Zählen.
  2. Benutze Nicht-Erreichbarkeit für G := G r a p h | w | , s := S {\displaystyle G:=Graph_{|w|},s:=S} {\displaystyle G:=Graph_{|w|},s:=S} und t := w {\displaystyle t:=w} {\displaystyle t:=w} mit zuvor berechnetem N {\displaystyle N} {\displaystyle N}.

Eine solche Turingmaschine akzeptiert genau dann, wenn es keinen Pfad von S {\displaystyle S} {\displaystyle S} nach w {\displaystyle w} {\displaystyle w} gibt und da beide Teilalgorithmen nur logarithmischen Speicherplatz benötigen, ist der Beweis komplett.

Originalpublikationen:

Lehrbücher:

Abgerufen von „https://de.wikipedia.org/w/index.php?title=Satz_von_Immerman_und_Szelepcsényi&oldid=232716386"