II. 4. Komplexität von Algorithmen II.4.1. Grundlagen

Werbung
II. 4. Komplexität von Algorithmen
Man möchte die „Güte“ von Algorithmen messen. Es kann viele Gütekriterien geben.
Wichtige sind Rechenzeit und Speicherplatz. Wir wählen als Rechnermodell
(natürlich) die TM, und zwar eine TM mit k zweiseitig – unendlichen Bändern.
II.4.1. Grundlagen
Definition: Wenn für jedes Inputwort der Länge n die Turingmaschine M höchstens
T(n) Schritte macht, bevor sie hält, so heißt M eine T(n)–beschränkte
TM oder eine TM der Zeitkomplexität T(n). Die von M akzeptierte
Sprache heißt ebenfalls von der Zeitkomplexität T(n).
Definition: Wenn M für jedes Inputwort der Länge n auf jedem Band höchstens S(n)
Zellen (Felder) examiniert, so heißt M von der Speicherkomplexität
S(n). Die von M akzeptierte Sprache heißt dann ebenfalls von der
Speicherkomplexität S(n).
Beispiel:
Wir betrachten die Sprache
L = { wcwR : w∈ { 0, 1 }* }
Es gibt eine TM M mit 2 Bändern, die das Input links von c auf Band 2 kopiert.
Wenn c gefunden ist, wird die zweite LSV im gerade kopierten Wort nach links und
die erste LSV gleichzeitig im Input weiter nach rechts bewegt und die Zeichen unter
den LSV’s werden verglichen. Wenn alle Symbole gleich und Strings gleich lang, so
wird akzeptiert.
Offenbar macht M höchstens n+1 Schritte für Input der Länge n. Daher hat L die
Zeitkomplexität n+1. L hat auch die Speicherkomplexität n+1.
Bemerkung:
1. Bei obiger Definition ist stets S(n) ≥ n.
2. Wir nehmen an, dass T(n) ≥ n+1 ist, denn das ist die Zeit, um das Input zu lesen
und festzustellen, dass das Ende erreicht ist. TM, die das nicht tun, betrachten wir
nicht. Zeitkomplexität T(n) heißt also max( n+1, [T(n)]+1 ).
Definition: Eine NTM M hat die Zeitkomplexität T(n), wenn sie für jedes Inputwort
der Länge n bei jeder Folge von Wahlmöglichkeiten höchstens T(n)
Schritte macht. M hat die Speicherkomplexität S(n), wenn bei jeder
Folge von Wahlmöglichkeiten M auf jedem Band höchstens S(n) Zellen
examiniert bei einem Inputwort der Länge n. Entsprechend für die
akzeptierten Sprachen.
Definition: Die Familie aller Sprachen der Zeitkomplexität T(n) wird mit DTIME(T(n))
bezeichnet ; die Familie aller Sprachen nichtdet. Zeitkomplexität T(n)
wird mit NTIME(T(n)) bezeichnet.
Analog für DSPACE(S(n)) und NSPACE(S(n)). Solche Familien heißen
auch Komplexitätsklassen.
Beispiel:
L = { wcwR : w ∈ {0, 1}* } ∈ DTIME(n) und also auch ∈ NTIME(n).
Im folgenden betrachten wir nur Zeitkomplexität.
Ein wesentlicher Teil der Komplexitätstheorie befasst sich mit den Beziehungen
zwischen Komplexitätsklassen.
Beispiele sind die folgenden Sätze:
Satz: Ist L ∈ DTIME(T(n)), so wird L akzeptiert in T2(n) Zeit von einer TM mit
einem Band.
(o. B.)
Satz: Ist L ∈ NTIME(f(n)), so gibt es eine (von L abhängige) Konstante c, so dass L
in DTIME(cf(n)) liegt.
(o. B.)
II.4.2. Praktisch unlösbare Probleme
Nach II.2 wissen wir, dass es Probleme gibt, die mit einem Computer nicht lösbar
sind. Jetzt werden wir sehen, dass es unter den entscheidbaren Problemen so
schwierige gibt, dass sie – jedenfalls was praktische Belange angeht – auch nicht in
voller Allgemeinheit mit einem Computer gelöst werden können. Von einigen dieser
Probleme kann man beweisen, dass sie expotentiell viel Zeit zur Lösung erfordern.
Bei anderen ist zwar bislang ein solcher Beweis nicht gelungen, doch liegt die
Vermutung nahe, dass exponentiell viel Zeit zur Lösung erforderlich ist. Der
Hauptgrund für solche Vermutung ist folgender: Gäbe es nur für eines dieser
Probleme einen „schnellen“ Algorithmus zur Lösung, so gäbe es automatisch für alle
diese Probleme einen „schnellen“ Algorithmus. Da aber inzwischen viele Hunderte
von (vielfach praktisch relevanten) Problemen nachweislich zu dieser Klasse
gehören und für viele dieser Probleme seit Jahrzehnten intensiv nach „schnellen“
Algorithmen vergeblich gesucht wurde, kommt man zu dieser Vermutung.
Die Klassen Π und ΝΠ
Frage: Wann ist ein Problem effizient (bzgl. Zeit) lösbar?
Naheliegend:
Wenn es in einer Zeit lösbar ist, die polynomial von der Länge des
Imputs abhängt.
Zwar scheint zweifelhaft, dass ein Algorithmus der Komplexität n100 effizient ist, doch
stellt sich andererseits heraus, dass die meisten praktischen Probleme mit
polynomialer Komplexität gelöst werden können in Zeiten mit sehr niedrigen
Polynomgraden.
Wir definieren deshalb Π als die Klasse aller Sprachen, die durch DTM mit
polynomialer Zeitkomplexität akzeptiert werden, d. h. Π =
U DTIME ( p( n )) .
p ( n ) Polynom
Analog definiert man ΝΠ =
U NTIME ( p ( n )) .
p ( n ) Polynom
Trivialerweise gilt Π ⊆ ΝΠ. Es gibt (, wie wir noch sehen werden) viele Probleme in
ΝΠ, von denen man nicht weiß, ob sie in Π liegen.
Die Frage, ob Π = ΝΠ gilt, ist offen (Vermutung ist, dass das nicht gilt) und wird als
das herausragende ungelöste Problem der Informatik angesehen.
Definition: Die Sprache L’ heißt reduzierbar auf die Sprache L in polynomialer
Zeit, L' ≤ L , wenn es eine TM M mit der Zeitkomplexität T(n) gibt, so
dass T(n) ein Polynom in n ist und M erzeugt aus dem Input x das
Output y, so dass x ∈ L' g .d .w. y ∈ L .
Lemma 1:
Sei L' ≤ L. Dann gilt
(a) L ∈ Π ⇒ L' ∈ Π
(b) L ∈ ΝΠ ⇒ L' ∈ ΝΠ
Beweis:
(von (a); (b) analog).
Werde also L akzeptiert in der Zeit p2(n) und sei L’ in der Zeit p1(n) reduzierbar durch
M = (∑, K) auf L, wobei p1(n) und p2(n) Polynome sind.
Sei dann x ∈ ∑ * mit |x| = n und y das Output der Reduktion mit Input x. Dann ist
y≤ p1(n) (da höchstens ein Symbol / Schritt ausgegeben werden kann). Um nun zu
testen, ob y ∈ L, sind höchstens p2(p1(n)) Schritte nötig, also insgesamt kommt man
mit p1(n) + p2(p1(n)) Schritten aus, um zu testen, ob x ∈ L’. Dies ist aber ein
Polynom in n.
Lemma 2
Beweis:
Die Hintereinanderausführung (Komposition) von 2 Reduktionen in
polynomialer Zeit ist wieder eine solche.
Analog zum Beweis von Lemma 1.
Man könnte die Frage Π = ΝΠ so angehen wollen, indem man nach einem
„schwersten“ Problem in ΝΠ fragt. "Schwerstes" Problem in dem Sinne, dass jedes
andere Problem aus ΝΠ „leicht“ auf dieses „schwerste“ Problem reduziert werden
kann. „Leicht“ wäre hier offenbar mit „in polynomialer Zeit“ gleichzusetzen. Diese
Überlegung führt zur
Definition:: Eine Sprache L heißt ΝP-vollständig, wenn L ∈ ΝΠ und jede Sprache
aus ΝΠ ist in polynomialer Zeit auf L reduzierbar.
Eine Sprache L heißt NP-schwer, wenn jede Sprache aus ΝΠ in
polynomialer Zeit auf L reduzierbar ist.
Bemerkung: 1. Hätte man eine NP-vollständige Sprache L, so wäre nach Definition
Π = ΝΠ gleichbedeutend mit L ∈ Π (wegen Lemma1).
2. Hat man eine NP-vollständige Sprache L0, so kann man die NPVollständigkeit einer anderen Sprache L1 ∈ ΝΠ dadurch beweisen,
dass man zeigt, dass L0 in polynomialer Zeit auf L1 reduzierbar ist.
(wegen Lemma 2)
3. Mann kann den Vollständigkeitsbegriff allgemein fassen und zwar
bezüglich einer beliebigen Klasse von Sprachen (oben ΝΠ) und bezüglich allgemeiner Reduktionen (oben Reduktion in polynomialer Zeit)
Einige ΝP-vollständige Probleme
Um für eine erste Sprache NP-Vollständigkeit zu zeigen, muss man nachweisen,
dass jede Sprache aus ΝΠ auf diese in polynomialer Zeit reduziert werden kann.
Wir wählen hierzu das (auch historisch erste) sogenannte Erfüllbarkeitsproblem für
Boolsche Ausdrücke:
B. A. (aussagenlogische Formeln) werden gebildet aus Variablen, Klammern und
den logischen Operatoren ∧ (logisch UND),∨ (logisch ODER) und ¬ (Negation) mit
der Rangfolge ¬, ∧, ∨. Gelegentlich benutzen wir auch die Implikation → mit der
Bedeutung x → y ≡ ¬x ∨ y.
Die Variablen sind der Werte 0 (false) und 1 (true) fähig, wie auch B. A., wobei sich
der Wert eines B. A. nach den üblichen Regeln bestimmt (E1 ∧ E2 hat den Wert 1
g. d. w. E1 und E2 den Wert 1 haben usw.).
Ein B. A. heißt erfüllbar, wenn es eine Belegung seiner Variablen gibt derart, dass
sein Wert 1 ist.
z. B. ist x1 ∧ x2 erfüllbar (x1 = 1, x2 = 1), aber x1 ∧ ¬x1 ist nicht erfüllbar.
Das Erfüllbarkeitsproblem ist nun: Ist der B. A. E erfüllbar?
Wir stellen das Problem mittels einer Sprache Lerf wie folgt dar:
Seien die Variablen des Ausdruckes x1, ..., xk.
xi sei codiert durch das Symbol x gefolgt von der dualen Darstellung von i, z.B. x3:
x11.
Das Alphabet von Lerf ist dann {∨, ∧, ¬, (, ), x, 0,1}
Lerf ist die Menge aller codierten erfüllbaren B. A.
Es gilt nun der
Satz von Cook:
Das Erfüllbarkeitsproblem ist NP-vollständig.
Man zeigt dazu
a) Lerf ∈ ΝΠ
b) Für L ∈ ΝΠ gilt: L ≤ Lerf
Weitere ΝΠ-vollständige Probleme sind:
−
Erfüllbarkeitsproblem für B. A. in 3KNF – L3erf
−
Hamilton-Kreis-Problem: Gibt es im ungerichteten Graphen G = (K,R) einen
Hamilton-Kreis, d. h. einen Kreis, der durch jeden Knoten genau einmal
hindurchgeht?
−
Problem des Handlungsreisenden: Gegeben ist ein ungerichteter vollständiger
Graph G, dessen Kanten mit natürlichen Zahlen gewichtet sind, und eine
natürliche Zahl λ. Gibt es eine Rundreise, d. h. einen Hamiltonkreis des
Gesamtgewichtes ≤ λ? (Oder als Optimierungsproblem formuliert: Man
konstruiere eine Rundreise minimalen Gewichts)
Die Beweise erfolgen immer gemäß Bemerkung 2, d. h. man zeigt für die fragliche
Sprache L: L ∈ ΝΠ und wählt eine NP-vollständige Sprache L’ und zeigt L’ ≤ L.
Beispiel: Knotenhüllenproblem
Gegeben sei ein ungerichteter Graph G=(K,R) mit Knotenmenge K und
Kantenmenge R.
Eine Teilmenge A ⊆ K heißt Knotenhülle von G, wenn für jede Kante (v, w) ∈ R
v oder w in A liegt.
Das Knotenhüllenproblem ist: Gegeben ein Graph G und eine natürliche Zahl k.
Besitzt G eine Knotenhülle der Größe ≤ k? ( d. h. eine Knotenhülle A mit A ≤ k).
Darstellung als Sprache:
k binär, dann Liste der Knoten ki, codiert z. B. k2 als k10, dann Liste der Kanten
(ki, kj), codiert z. B. (k2, k3) als (k10k11).
Lkh besteht aus allen solchen Strings, die k und G repräsentieren, so dass G eine
Knotenhülle der Größe ≤ k besitzt.
Satz 4.4
Lkh ist NP-vollständig.
Beweis:
Lkh ∈ ΝΠ: Wähle nichtdeterministisch k Knoten und teste, ob diese eine Hülle bilden dies ist möglich in einer Zeit, die proportional zum Quadrat der Länge des Inputstringes ist.
Jetzt wird gezeigt, dass L3erf ≤ Lkh:
Sei E = E1 ∧ E2 ∧ .. . ∧ Eq ein B. A: in 3KNF mit Ei = (α i1 ∨ α i 2 ∨ α i 3 ) , α ij Literale.
Wir konstruieren einen ungerichteten Graphen G = (K,R) mit
K= {(i, j ) : 1 ≤ i ≤ q, 1 ≤ j ≤ 3}
R = R1 ∪ R2 = {((i , j ), (i, k )) : j ≠ k }∪ {((i, j ), (k , l )) : i ≠ k ∧α ij = ¬α kl }
Beispiel: E = ( x1 ∨ x 2 ∨ x 3 ) ∧ ( x1 ∨ x 3 ∨ x 4 ) :
(1,1)
x1
x1
(1,2)
x2
x
(1,3)
x3
x4
Behauptung:
(2,1)
(2,2)
(2,3)
G besitzt eine Knotenhülle der Größe ≤ 2q g. d. w. E ist erfüllbar.
Beweis:
a) Sei E erfüllbar. Dann gibt es eine Belegung, so dass für jedes i (1 ≤ i ≤ q) ein
α iν i den Wert 1 hat. Man streiche die q Knoten (i, ν i ) aus K. Die verbleibenden 2q
Knoten bilden eine Überdeckung A von G: Sei (v,w) ∈ R.
Wenn (v,w) ∈ R1, so ist v ∈ A oder w ∈ A, da nur einer der drei Knoten (i,1),
(i,2), (i,3) in A fehlt.
Wenn (v,w) = ((i,j), (k,l) ∈ R2 und (i,j) ∉ A, so αij= 1 und also αkl = 0, also (k,l) ∈ A.
b) G habe Knotenhülle A der Größe ≤ 2q. Für jedes i enthält A dann genau 2 Knoten
der Form (i,j), denn anderenfalls hätte eine Kante der Form ((i,j), (i,k)) keinen
Knoten in A. D. h. für jedes i fehlt in A genau ein Knoten (i, νi). Dann sei α iν i
gerade mit 1 belegt. Es entsteht kein Konflikt, denn α iν i = ¬α jν j für i ≠ j ist
ausgeschlossen, weil dann ((i,ν i ), ( j ,ν j )) ∈ R2 und keiner der Knoten in A ist.
Man überlegt sich leicht, dass eine TM in polynomialer Zeit aus E das zugehörige
Wort von Lkh erzeugt.
Im Beispiel wäre eine mögliche Belegung
x1 = 0, x2 = 0, x3 = 0, x4 = 1
Wenn man etwa x1 und x3 streicht, so erhält man eine Hülle.
Herunterladen