Weniger als gestern, aber immer noch okay.
Der Dienstagmorgen. Habt ihr Fragen zu der Veranstaltung von gestern?
Zu diesem entscheidbar, aufzählbar Halteproblem, Reduktion, den Kosmos?
Habt ihr da Fragen zu? Du weißt?
Jetzt gerade oder gestern? Jetzt gerade.
Zu leise
Er sagt nein. Das ist aber auf ganz laut.
Kannst du mich echt nicht verstehen, oder?
Okay. Du wolltest doch nur Zeit schinden. Da habt
ihr wirklich keine Fragen zu gestern. Ich meine, finde
ich gut, aber... Oh ja, wie viele,
die denn jetzt hier sind, waren denn auch gestern da?
Guck mal, das ist gar nicht so wenig.
Das ist sogar ziemlich viel. Sehr schön. Na gut,
wenn ihr alle keine Fragen habt, bei den Präsenzaufgaben ab heute,
Da wird das auch nochmal ein bisschen geübt.
Da gibt es irgendwie, die erste Aufgabe habe ich gerade vergessen.
Ich glaube, es gibt etwas, wo man nachweisen soll,
dass ein Problem entscheidbar ist, sprich ein Algorithmus für angeben.
Und danach geht es darum, eben einmal so eine Unentscheidbarkeit
zu zeigen, an einem nicht zu komplizierten Problem.
Das heißt, man muss gar nicht so viel machen,
aber man muss sich da irgendwie so ein bisschen reindenken in
diese ganzen Widerspruchsbeweisgeschichten und sowas.
Genau, das sollt ihr da einmal üben.
Und auf dem Aufgabenzettel kommt das dann auch einmal dran.
Da gibt es einmal so ein Teil,
da wird DFAs und kontextfreie Grammatiken wiederholt mit Inscheidbarkeitsfragen
im Grunde genommen und dann gibt es auch da
ein Unentscheidbarkeitsproblem
Gut, dann Zeit- und Platzkomplexität ist heute das Thema.
Ich hatte das gestern ja schon mal kurz angedeutet.
Bisher haben wir halt so Touring-Maschinen oder auch generell irgendein Berechnungsmodell,
kann auch irgendwie, gib jede Menge Berechnungsmodell,
gibt noch sowas wie RAM, das ist eine Random Access Machine,
die macht im Grunde genommen das,
was eine von Neumann-Architektur kann.
Dann gibt es irgendwie komische Kalküle, es gibt irgendwie T-Programme,
Java-Programme und so weiter. Und bisher haben wir uns nur damit beschäftigt,
welche Art von Problemen wir damit lösen können und welche wir eben nicht lösen können.
Das haben wir uns gestern so ein bisschen angeguckt,
dass man irgendwie gesagt hat,
okay,
da gibt es irgendwie
eine Grenze
Und dann haben wir gesagt, irgendwie entscheidbare Probleme,
das ist gut und nicht entscheidbare Probleme ist schlecht.
Und jetzt das große Aber, wenn man irgendwie von einem Problem weiß,
dass es entscheidbar ist, reicht das im Allgemeinen noch nicht.
Weil wenn man so lange dafür braucht,
dass das nicht mehr praktikabel ist,
kann man sich jetzt drüber unterhalten, was praktikabel bedeutet,
wenn ich irgendwie für eine Probleminstanz weiß,
ich brauche da tausend Jahre für, dann ist das wahrscheinlich nicht mehr praktikabel.
Aber im Normalfall ist ja schon sowas, wie wenn ich weiß,
ich brauche einen Tag, um das zu lösen.
Das würde man ja im Allgemeinen auch schon nicht mehr haben.
Und deswegen wollen wir uns auch noch mit der Frage beschäftigen,
wie viel Zeit und wie viel Platz wir brauchen,
um ein Problem zu lösen
Und weniger ist gut, also je weniger Zeit wir brauchen,
je schneller das geht und je weniger Platz wir brauchen, desto besser.
So, wovon wird das abhängen? Einmal natürlich von den Problemen,
ist klar, also irgendwie einfache Probleme wie irgendwie zwei Zahlen zu addieren,
das darf natürlich schneller gehen,
als jetzt irgendwie ein großes Problem wie, keine Ahnung,
die so und so vierte Stelle der Zalpie zu berechnen oder sowas dauert,
darf gerne länger dauern.
Davon hängt das ab und eben auch von der Größe der Probleminstanz,
wenn ihr irgendwie zwei kleine Zahlen addieren wollt,
dann darf das schneller gehen,
als wenn die beiden Zahlen groß sind.
Also zwei, dreistellige Zahlen zu addieren,
dauert natürlich weniger lange als irgendwie zwei 20-stellige Zahlen
zu addieren
Das muss man irgendwie reinkodieren in die Art und Weise,
wie man darüber gleich argumentieren will. Unten steht noch meine Probleminstanz,
das ist eine mögliche Eingabe,
also wenn wir irgendwie einen Algorithmus für diese Sprache haben,
sprich ich will zwei Zahlen addieren,
dann sind eben Probleminstanzen solche Triebel, das ist eine Jahrinstanz,
weil zwei plus drei gleich fünf ist,
das ist jetzt eine 9-Instanz,
weil zwei plus drei eben nicht sechs ist,
sind aber beides Instanzen des Problems.
Und die Größe der Instanz hängt dann eben von der Länge
der Zahlen ab.
Ja, formalisiert für eine Touring-Maschine
Wenn ich eine Touring-Maschine habe und ich lasse die irgendwie auf eine Eingabe rechnen,
dann braucht ihr irgendwie so und so viele Schritte,
bis sie entweder blockiert oder eben das Wort akzeptiert.
Und dann sagen wir einfach, die Zeit, die die Touring-Maschine braucht,
das ist eben die Anzahl der Schritte, die sie da macht,
sprich die Anzahl der Konfigurationen, die sie besucht.
Das kann man sich darüber unterhalten,
ob man irgendwie die Schritte zählen will oder die Konfiguration.
Wir zählen die Konfiguration. Das heißt,
auch wenn ich irgendwie in der ersten Konfiguration starte und da
vielleicht schon blockiere oder so, dann habe ich halt einen Schritt gemacht.
Wenn man das rausnimmt und sagt irgendwie, ich zähle nur die Schritte,
dann muss man da eben überall minus eins rechnen,
macht nachher in der Laufzeitanalyse keinen großen Unterschied.
Also wir erzählen einfach
die Konfigurationen
Platz, so viel, wie sie eben maximal Felder besucht in der Rechnung.
Das kann ja passieren, dass sie irgendwie anfängt zu rechnen,
vielleicht irgendwie 20 Zellen benutzt und dann am Schluss irgendwie aber nur auf fünf noch arbeitet oder so,
aber dann hat sie halt irgendwann mal temporär 20 Zellen besucht und dann sagen wir eben,
der Platzbedarf ist 20 Zellen.
Macht auch Sinn, weil ihr vielleicht zwischendurch irgendwie Nebenrechnungen macht,
für die ihr Speicher braucht und so weiter,
auch wenn ihr den nachher wieder freigebt,
habt ihr den ja im Laufe der Rechnung gebraucht.
Lars, kann das Licht da ausgemacht werden?
Ich meine, ja,
es kann,
Boah. Genau, das ist erstmal für eine Rechnung. Beispiel da drunter,
wenn man irgendwie so eine Rechnung hat, eins, zwei,
drei, vier, fünf Konfigurationen, die da sind,
also habe ich irgendwie fünf Zeiteinheiten gebraucht und ich habe vier Felder besucht,
weil ich streng genommen dieses vierte hier in der vierten Konfiguration,
das habe ich ja zumindest mal besucht,
dass ich das jetzt nicht benutzt habe,
ist was anderes,
aber ich habe es besucht,
also habe ich
sozusagen auch irgendwie gebraucht
Und deswegen zählt das mit. Wenn man das nicht machen würde,
also wenn man sagt, irgendwie zählen,
die ich leer lasse, die zählen nicht mit,
dann wird erstens die Definition viel komplizierter und zweitens könnt ihr
dann mit den leeren Zellen im Grunde genommen zählen.
Dann könnt ihr so zusammenmachen,
wie irgendwie die leeren Zellen nehmen und dann irgendwie einen Marker setzen und
dann wieder leere Zellen nehmen und einen Marker setzen und dann zählt ihr mit den leeren Zellen.
Das will man alles nicht. Deswegen zählt jede besuchte Zelle
halt eine Platzeinheit, auch wenn ich die nicht benutze.
Das ist jetzt für eine Rechnung,
was uns ja aber interessiert, ist nicht gegeben die Rechnung,
wie lange brauche ich, sondern irgendwie gegeben Eingabewort,
wie lange darf ich maximal brauchen,
ich will irgendwie
solche Schranken haben
Das macht man mit solchen Funktionen. Sieht jetzt erstmal
ein bisschen kompliziert aus. Das, was hier passiert,
gucken wir uns mal das hier in diesem Max erstmal an.
Ich nehme mir für ein gegebenes N. Nehmen wir mal ein Ende ist 10,
dann gucke ich mir jetzt alle Wörter der Länge 10 an
und gucke immer, wie viele Schritte die Touring-Maschine drauf macht.
Und jetzt brauchst du ja vielleicht für eine Eingabeinstanz der Länge
10 irgendwie nur zwei Schritte für eine andere 100 Schritte,
für eine andere 50 Schritte oder so.
All die Zahlen nehme ich mir,
packe die in diese Menge und nehme mir davon
das Maximum
Und meine Funktion T von N, N war im Beispiel
von ihm irgendwie die 100, Quatsch, die 10.
Die System vor 10 muss dann eben größer sein. Das heißt,
das T, ich tue in das T eine Zahl rein und dann weiß ich,
auf Wörtern dieser Länge rechne ich maximal so lange,
wie mir das T von Anders sagt.
Ein T von N gleich Endquadrat ist,
dann darf ich auf Wörtern der Länge 100 Schritte machen,
auf Wörtern der Länge 5, 25 Schritte,
auf Wörter der Länge 6, 36 Schritte und so weiter.
Und halt nach oben begrenzt,
also dieses T von N kann durchaus an einigen Stellen mal größer sein,
macht nichts, aber es soll insgesamt eben eine Schranke von
oben sein
Ja. Ist klar. Klar, klar, klar.
Ich kann das bestimmt noch auf zwei andere Art und Weise sagen,
also wenn es nicht klar ist, wenn ich nochmal aufzuhören.
Nehmen wir mal an, ihr habt, nehmen wir mal an,
ihr habt Grafen und ihr macht jetzt nicht,
ihr nehmt jetzt quasi als Eingabegröße eine bestimmte charakteristische Eigenschaft der Grafen und nicht irgendwie die Länge der Grafen.
Das macht man nämlich üblicherweise, nimmt man jetzt einfach als Länge,
als Größe der Grafen, die Anzahl der Knoten.
Das stimmt nicht so ganz, weil wenn man das irgendwie mit Nadiazenz-Matrix machen würde,
dann ist es irgendwie quadratisch so groß,
aber man nimmt es diese Anzahl der Knoten.
Und jetzt könnt ihr euch ja bestimmt vorstellen,
dass für ein bestimmtes Problem auf den Grafen,
wenn ich jetzt einen Grafen mit 100 Knoten habe und kaum Kanten da drin,
dann ist das wahrscheinlich ziemlich schnell auszurechnen.
Wenn da ganz viele Kanten drin sind, ist es schwieriger auszurechnen.
Wenn das irgendwie kompliziert angeordnet ist, keine Ahnung,
hier so ein Teil des Grafen,
dann nur mit einer Verbindung, hier ein Teil des Grafen,
können es auch komplizierter auszurechnen sein, als jetzt bei irgendwelchen anderen Konstellationen.
Deswegen nimmt man sich jetzt alle Grafen, die 100 Knoten haben,
und guckt, wo ist da der Worst Case?
Also für welchen Grafen auf 100 Knoten brauche ich am längsten?
Das ist der maximale Zeitbedarf, den ich eben bei Grafen der Größe 100 habe.
Und das soll durch diese Funktion Tee von N beschränkt sein.
Deswegen nennt man das auch eine Worst-Case-Abschätzung,
weil ich eben nicht irgendwie sowas wie den Mittelwert nehme oder irgendwie eine Best-Case-Abschätzung,
sondern ich mache halt eine Schranke für den Worst-Case.
Anderes Beispiel wäre, wenn ihr Aris von Zahlen sortieren wollt,
wenn ich euch schon ein komplett sortiertes Arry von Zahlen gebe,
ist das wahrscheinlich ziemlich schnell zu sortieren.
Ihr lest einmal drüber und stellt fest, oh,
ich habe gar nichts zu tun. Dann braucht ihr irgendwie
nur Ende Schritte, wenn ihr in Zahlen habt.
Wenn das ganz, ganz durcheinander gewürfelt ist,
braucht ihr halt
irgendwie länger
Das will ich irgendwie abschätzen. Also erstens Worst-Case-Abschätzung. Zweitens
, hier steht, das sind Funktionen von N nach R.
Nach R macht natürlich streng genommen keinen Sinn,
weil irgendwie ich kann nicht 3,5 Schritte brauchen.
Ich kann irgendwie drei Schritte brauchen oder vier Schritte brauchen,
aber nicht 3,5. Macht man deswegen, weil man dann eben
für T von N nachher so Funktionen nehmen kann,
wie irgendwie Endquadrat minus N halbe. Dann kann ich sagen,
irgendwie die Anzahl meiner Schritte ist durch diese Funktionen beschränkt.
Und wenn eben bei T von N dann sowas rauskommt,
wie irgendwie 3,5, dann weiß ich hier,
ich darf höchstens 3,5 Schritte brauchen, was gleichbedeutend damit ist,
dass ich drei Schritte maximal brauchen darf.
0,5 Schritt kann ich nicht machen
Platzschrank im Grunde genommen das Gleiche, einziger Unterschied,
ich schreibe hier unten hin, nicht,
dass ich in Karschritten akzeptiere, sondern mit Platzbedarf K.
Also ich besuche dann maximal K-Zellen. Auch da wieder eine Worst-Case-Abschätzung,
ich nehme mir irgendwie alle Wörter der Länge N, gucke,
wie lange, wie viel Platz die Touring-Maschine darauf braucht,
all die Casts sammle ich mir in der Menge,
nehme das Maximum davon und S von N muss eben größer sein.
Dann kann ich sagen, sie ist so beschränkt.
Da steht das nochmal, was ich eben gesagt habe,
dass man das eine Worst-Case-Komplexität nennt
Und dass eben T&S nur deswegen Abbildung auf reelle Zahlen sind,
damit man eben später mit solchen Funktionen arbeiten kann. Wenn man jetzt sowas hat,
nehmen wir mal an, ihr kommt irgendwie,
irgendwie kriegt ihr raus, dass eure TM so zeitbeschränkt ist,
dann dürft ihr eben auf einem Wort der Länge zehn,
jetzt tut ihr irgendwie der Szene in dieses TVN rein,
dann kommt da irgendwie zehn Quadrat, also 100 raus,
minus zehn halber, also fünf,
also kommt da irgendwie 95 raus.
Das heißt, auf Wörtern der Länge zehn dürft ihr
maximal 95 Schritte brauchen
Dass bei diesen Wörtern der Länge 10 jetzt vielleicht auf Wörter dabei sind,
wo ihr irgendwie nur fünf Schritte braucht, ist egal.
Wir machen halt so eine Worst-Case-Abschätzung. Und auf dem Wort
der Länge 3 kommt halt irgendwie 7,5 raus,
dann rundet man das ab und dann ist das 7. Darf ich maximal sieben Schritte brauchen.
Fragen bis dahin. Das ist eine Zeitkomplexität für Thuringen, für deterministische Touring-Maschinen.
Wenn man das jetzt für nicht deterministische Touring-Maschinen machen will,
hat man das Problem,
dass eine nichtdeterministische Touring-Maschine ja mehrere Rechnungs,
mehrere Rechnungen auf einem Wort haben kann,
weil sie nichtdeterministisch
irgendwie raten kann
Jetzt guckt man sich erst mal wieder eine fest vorgegebene Erfolgsrechnung
an und definiert das da im Grunde genommen genauso wie bei einer determistischen Touring-Maschine.
Wenn ich die Rechnung festhalte, sage ich,
sie benötigt so viel Zeit,
wie sie eben in dieser Rechnung Konfiration besucht und so viel Platz,
wie sie maximal Felder besucht, ist also genauso wie bei einer DTM,
nur dass sie eben diese Erfolgsrechnung festgehalten habe.
Und dann sage ich, diese nicht-deterministische Touring-Maschine akzeptiert so
ein Wort aus der Sprache mit der Zeitbeschränkung Tee,
wenn die kürzeste Erfolgsrechnung auf wie eben
Teeschritte braucht
Also bei der DTM gibt es ja nur eine Rechnung auf einem Wort,
gucke ich mir die an und zähle die Konfiguration.
Bei der NTM gibt es mehrere Rechnungen auf einem Wort,
nehme ich mir die kürzeste und sage, okay,
so lange hat die nicht die terministische Tourenmaschine jetzt gebraucht.
Und bei der Platzschranke eben genauso, ich nehme mir die kürzeste Erfolgsrechnung,
gucke, wie viel Platz hat sie da gebraucht und das ist dann die Platzbeschränkung.
Und dann kann ich mir auch wieder solche Funktionen einführen,
dann kann ich eben sagen, die NTMSTN-Zeit beschränkt genau dann,
wenn und jetzt wieder so eine Menge,
ich nehme mir wieder alle Worte der Länge N,
die in der Sprache drin sind und gucke,
ob M eben,
mit welcher Zeitbeschränkung M akzeptiert,
all diese Zahlen sammle ich in der Menge und das TVN
muss größer sein
SN genauso. Nur mit Plattschranke.
Wenn ich jetzt... Das ist von Jesus
Also du machst das so, dass du,
also nur zehn Schritte ist wahrscheinlich ungewöhnlich,
weil das wäre dann konstant dann, wäre es sozusagen egal,
wie groß die Eingabelänge ist, du sagst,
du brauchst immer nur zehn Schritte, das kommt eher selten vor.
Nehmen wir mal mindestens linear an, nehmen wir mal an,
du sagst, irgendwie brauchst du so viele Schritte, wie das Wort lang ist.
Ja, dass du zumindest die Zeit hast, einmal drüber zu lesen oder so.
Und dann gilt das aber für alle Worte dieser Länge.
Also wenn du jetzt ein Wort der Länge 100 nimmst,
dann gibt es ja ganz viele davon, also bei,
wenn das Alphabet aus Null und Einsen besteht,
habe ich irgendwie zwei hoch 100 viele Worte der Länge 100
und alle diese Wörter haben die gleiche Zeitschranke.
Aber Wörter unterschiedlicher Länge haben halt im Allgemeinen unterschiedliche Zeitschranken,
weil ich eben deren Länge in diese Funktion TVN reintue
Gibt auch Ausnahmen, wenn ihr irgendwie so Sprachen habt wie Wort beginnt mit A.
Da ist egal, wie lange das, wie lange das Wort ist.
Ihr guckt euch immer nur den ersten Buchstaben an,
wenn dann As akzeptiert hat, wenn ein B ist,
akzeptiert ihr nicht. Also das ist so ein Beispiel,
wo man eine konstante Zeitranke tatsächlich mal hat.
Ja. Dann gibt es noch zwei so Sätze,
die sind nicht ganz, die sind nicht so wichtig.
Ich wollte nur, dass ihr die mal gesehen habt.
Man kann mit so Bandkompressionen an Speicherbedarf rummogeln und die Maschine ein bisschen schneller machen.
Da steht, wenn ihr so eine platzbeschränkte Touring-Maschine habt,
die irgendwie durch so eine Funktion S von N Platz beschränkt ist,
also von mir aus S von N gleich Endquadrat,
dann gibt es zu jeder reellen Zahl R eine zehnmal SN-Platzbeschränkte Touring-Maschine,
die äquivalent ist.
Wenn der C halt ein Halb nimmt, bedeutet das,
ihr braucht nur halb so viel Platz.
Wenn der C ein Viertel nimmt, heißt das,
ihr braucht nur ein Viertel, so viel Platz.
Und was ähnliches könnt ihr mit Zeitschranken machen, wenn sie TN-Zeit beschränkt ist,
dann gibt es noch eine äquivalente, zehnmal, oh,
da muss ein Tee stehen, zehnmal TN, zeitbeschränkte Touring-Maschine.
Wenn die Touring-Maschine irgendwie Endquadrat zeitbeschränkt ist,
dann könnt ihr eine konstruieren,
die ein Halb-Endquadrat
Zeit beschränkt ist
Wichtig dabei ist, man kann hier halt sehen,
das ist nur so ein linearer Faktor,
das C. Also wenn ihr irgendwie eine SN platzbeschränkte Touring-Maschine habt oder eine TN zeitbeschränkte Touring-Maschine,
dann könnt ihr nicht sowas machen,
wie da irgendwie die Wurzel ziehen oder irgendwie solche Geschichten,
sondern ihr könnt halt nur so einen linearen Faktor davor schmeißen.
Beweise sind so ein bisschen wuschelig und ist auch so ein bisschen komisch rumgetwickt,
weil man im Grunde genommen mehrere Bandzellen der vorgegebenen Touring-Maschine zu einer Bandzelle zusammenfasst.
Und dann hat man halt nicht mehr als Alphabet Nullen und Einsen,
sondern hat man halt als Alphabet Buchstaben dreimal die Null,
den Buchstaben dreimal die Eins und so weiter.
Und dann kann man eben die Übergänge dementsprechend kodieren,
dass man mehrere Schritte in der Ein-Touring-Maschine in einem Schritt der neuen Touring-Maschine macht.
Ich glaube aber, das benutzt man heutzutage eigentlich nicht mehr.
Ich wollte nur einmal gesehen habe und nachher brauche ich es einmal ganz kurz. So,
jetzt die wichtigen Komplexitätsklassen, wenn man jetzt solche Zeitschranken eingeführt hat,
also man hat jetzt irgendwelche Funktionen S und T,
die Eigenschaften hier sollen nur bedeuten,
also SN größer gleich Eins macht man üblicherweise in der Komplexitätstheorie,
weil man halt sagt, naja,
mindestens eine Zelle werde ich irgendwie benutzen und Tee von Endgrößer gleich N plus Eins,
sagt man üblicherweise,
weil man sagt,
jeden Buchstaben der Eingabe werde ich mir schon mal irgendwie
mindestens einmal angeguckt haben
Braucht ihr euch nicht merken da oben, ist nur damit,
dass mit dem Skript übereinstimmt und auch sonst stimmt.
So, jetzt kann man diese Zeitschranke nehmen,
das T von N und kann sagen,
in deterministisch Zeit von T von N tue ich all die Sprachen rein,
die von einer Touring-Maschine akzeptiert werden können, die TN zeitbeschränkt ist.
Also wenn ich als T von N beispielsweise Endquadrat nehme,
dann ist in dieser Klasse D-Time-Endquadrat, sind alle Sprachen drin,
die ich mit Endquadratzeit akzeptieren kann.
Und was kennen wir denn so
Wenn ihr zum Beispiel D-Time-N nehmt, also alles,
was ihr in Linearzeit machen könnt,
dann sind da zum Beispiel so Dinge wie ein Sortiertproblem nicht drin.
Weil für Sortieren braucht ihr irgendwie,
wenn ihr Merch-Sort vielleicht schon mal gesehen habt,
sodass das irgendwie läuft irgendwie in N mal Login,
das wäre dann in sowas nicht drin.
So, und das Gleiche kann man dann mit Endtime,
also nicht deterministisch, Zeit machen. Da sagt man hier einfach,
da soll es eine nicht dieterministische Touring-Maschine, die Sprache halt akzeptieren.
Das kann man mit deterministischem Platz machen und dann eben eine
Platzschranke von der deterministischen Touring-Maschine und mit nicht deterministisch Platz.
Da nimmt man eine Platzbeschränkte,
nicht dieterministische Touring-Maschine
Das ist erstmal so ganz generell. Und jetzt interessiert man sich für
ganz bestimmte Funktionen hier und führt für die nochmal neue Klassen ein.
Das sind vor allem die Klassen P. Da sagt man,
es gibt so ein Polynom-P, sodass dann eben eine Touring-Maschine existiert,
die PN-Zeit beschränkt ist und die Sprache akzeptiert.
Dann NP für nicht deterministisch, Polynomialzeit, P-Space für deterministisch,
polynomieller Platz und NP-Space für nicht deterministisch durch polynomieller Platz.
Und die sind deswegen so wichtig, weil man mit Polynom
erstens eine relativ gute Theorie machen kann. Und zweitens,
weil man in der Praxis festgestellt hat, dass Probleme,
die ich irgendwie in Polymonialzeit lösen kann,
dass die deswegen eine herausragende Bedeutung haben,
weil man da immer sagen kann, das ist effizient lösbar.
Also alles, was in P liegt,
würde man sagen, das ist nicht nur entscheidbar,
sondern das kann ich auch mit vertretbarem Aufwand machen.
Bei P-Space kann man schon anfangen,
sich darüber zu unterhalten, ob das noch so stimmt,
aber da kann man auch noch ziemlich viel machen.
Das, was nachher da drüber kommt,
also so Komplexitätsklassen wie irgendwie Exponentialzeit,
da gilt das dann irgendwie nicht mehr.
Da würde man dann sagen,
oh Gott,
das ist
nicht mehr praktikabel lösbar
So, jetzt kann man das doch so definieren,
wegen dieser Speedup- und Kompressionssätze. Das ist auch die einzige Stelle,
wo ich das brauche, dass man irgendwie sagen kann,
P ist eben die Vereinigung über alle Polynome N-Hochi, von denen da die Zeitkomplexitätsklassen nehmen.
Also wenn ihr hier diese beiden Definitionen vergleicht,
hier würde man dann all die Dinger nehmen,
wo hier halt ein End steht, Endquadrat, N-Hoch 3,
N-O-4, N-O-5 und so, all diese deterministischen Touring-Maschinen würde man nehmen.
Und hier steht eben gerade ein Polynom. Und dass ein Polynom jetzt auch so was sein kann,
wie irgendwie N-Hoch 3 plus N-Quadrat, das macht nichts,
weil man das dann ja Endhoch 3 plus Endquadrat kann man irgendwie nach oben abschätzen,
durch zweimal N-Hoch 3, zweimal ja noch 3 kommen,
mit diesem Speedup-Satz nochmal durch einen Halb teilen,
dann steht da genau N-Hoch 3 und dann hat man eine Touring-Maschine,
die gerade Endhoch 3
Zeit beschränkt ist
Deswegen tut sich das nichts, kann man das auch so machen.
So, Fragen bis dahin. Also jetzt haben wir Zeitkomplexität für
eine DTM eingeführt, Zeitkomplexität für eine NTM und Platzkomplexitäten.
Und dann haben wir diese Komplexitätsklassen eingeführt, insbesondere MP,
NP, P-Space und NP-Space,
wo man dann eben gesagt hat,
bei P gibt es irgendwie ein Polynom,
sodass meine Touring-Maschine eben bei einer Rechnung auf einem Wort
der Länge N maximal P von N viele Schritte braucht,
wobei P dann eben das Polynom ist
Was ist noch eine Frage? Nein. Fragen bis dahin
. Was war denn das letzte Beispiel? Achso,
das ist eigentlich nicht so wichtig, das sollte nur illustrieren,
warum diese Klasse P und die da gleich sind.
Man hat ja bei dem D-Time hier,
da würden jetzt hier halt nach und nach all diese N-Hochi stehen,
also er noch 1, er noch 2, er noch 3,
er 04, dass das alles da drin ist,
ist klar, weil das sind ja auch alles Polynome.
Jetzt könnte man noch fragen, naja, aber ein Polynom
kann ja auch sowas sein wie N-Hoch 3 plus Endquadrat.
Das wäre ja in dem anderen
nicht drin
Aber ich kann ja N hoch 3 plus N-Quadrat nach oben
abschätzen durch zweimal N-Hoch 3, also aus dem Endquadrat,
in der noch 3 machen.
Zweimal noch 3. Und dann konnte ich mit diesem linearen Speed-Up-Geschichten hier,
da kann ich aus dieser zweimal N-Hoch 3 Zeit beschränkten,
eine einhalbmal, zweimal N hoch 3 Zeitbeschränkt machen.
Das ist dann N-Hoch 3 und dann ist das
in einer Komplexitätsklasse wieder drin.
Noch mehr Fragen.
Dann gilt das noch
So ähnlich wie bei diesen Geschichten, wenn man irgendwie sagt,
ein NFA kann erstmal mehr als ein DFA,
weil der ja irgendwie dieses zusätzliche Feature des Nicht-Determinismus hat.
Und da stellt man später fest, mit der Potenzautomatenkonstruktion,
oh, der kann doch nicht mehr. Hier kann man ihm auch sagen,
wenn ich irgendwie eine Zeitschranke F habe für eine deterministische Touring-Maschine
und hier eine Zeitschranke App für eine nicht-deterministische Touring-Maschine,
dann muss da mindestens so viel drin sein wie in dem D-Time-F,
weil wenn ich den Nicht-Determinismus gar nicht ausnutze,
dann habe ich ja trotzdem nicht die theministische Touring-Maschine,
nur dass sie eben ihr Feature nicht ausnutzt.
Deswegen gilt da überall
diese Timemengen-Beziehung
Und die spannende Frage ist dann eben immer, gilt das vielleicht auch andersrum?
Also komme ich irgendwie um den Nicht-Determinismus herum?
Genau. Und das dritte, also hier bei diesem P-Teilmenge,
NP, da werden wir nachher sehen,
dass das irgendwie eine offene Frage ist, ob das andersrum auch gilt.
Und wir werden ein bisschen darüber reden,
warum diese Frage so zentral ist in der Informatik.
Und bei dem Unteren kann man tatsächlich zeigen, dass das gleich ist.
Das machen wir aber nicht mehr. So, jetzt einmal,
das war jetzt ja alles Komplexität für Touring-Maschinen. Und jetzt kann man sich fragen,
welche Aussagen hat das eigentlich über unsere gängigen Computer, dass ich irgendwie mal irgendwann erzählt habe, dass ein Computer sowas tun kann wie eine Touring-Maschine und auch andersrum. Ist ja schön und gut,
aber das mit den Komplexitäten kann man sich jetzt vielleicht nicht so vorstellen,
weil wenn ich irgendwie eine Touring-Maschine habe und die soll irgendwie was ausrechnen,
den Rödel, die da auf dem Band rumgeht,
immer mal wieder über das ganze Band rüber,
also wir hatten ja auch so Geschichten wie,
wenn ich irgendwo auf einer anderen Stelle des Bandes einen Zähler habe und ich will den immer erhöhen,
also wenn ich sowas wie A,
auch ein Beo-Rennen akzeptieren will und ich will das mit einem Zähler machen,
nicht mit wegstreichen von den Symbolen,
dann mache ich mir irgendwo rechts davon einen Zähler,
gehe immer nach links, streiche mir ein A an,
gehe nach rechts, erhöhe den Zähler um eins,
gehe wieder nach links zu hängen, A,
streiche mir das an,
gehe nach rechts und erhöh den Zähler um eins,
da kann man jetzt erst mal denken,
das müsste irgendwie viel,
viel langsamer sein,
als wenn ich im Java-Programm oder so einfach mit einer Vorschleife
über das Area rübergehe und irgendwie einen Zähler währenddessen immer um
eins erhöhe
So, jetzt kann man aber feststellen, dass man nicht nur diese Simulation machen kann,
sondern dass man die eben auch mit relativ wenig Aufwand machen kann.
Also das ist ein Computer, eine Touring-Maschine simulieren kann,
das ist irgendwie klar. Wenn ihr irgendwie einziges Problem ist,
ja das unendliche Band und das kann man dann so machen,
dass man eben sagt, okay,
ich benutze halt so viel Speicher,
wie da ist und wenn ich dann irgendwie noch mehr brauche,
dann fordere ich den irgendwie an und dann baue ich mir sowas ein,
dass ich irgendwie dann stoppe mit der Berechnung,
warte bis irgendwie ein Operator eine neue Festplatte eingebaut hat und
dann mache ich mit der Rechnung weiter,
kriegt man also hin
Und andersrum, dass eine Touring-Maschine einen Computer simulieren kann,
kriegt man auch hin, was man dazu macht,
ist, man nimmt halt irgendwie so eine gängige,
imperative Programmiersprache oder eben auch eine gängige Rechnerarchitektur und zeigt,
dass die Touring-Maschine das alles machen kann,
was dieser Computer auch machen kann.
Wenn man dann eine Mehrband-Touring-Maschine nimmt, so irgendwie mit
ein paar Bändern, dann kann man sich halt vorstellen,
auf dem Einband schreibt man irgendwie die ganzen Variablen hin.
Ja, Gott, so solche If-Stand-Ls-Geschichten kriegt man auch irgendwie hin,
Brötchen, Ausdruck auswerten und demnach dann irgendwie in den Programmcode
an eine bestimmte Stelle springen, kriegt man da auch hin,
Why-Schleifen kriegt man auch hin
Dann kann man das mit Naturing-Maschine simulieren. Und der Aufwand ist tatsächlich
nur ein Polynom. Also es ist gar nicht so schlimm,
dass man jetzt irgendwie denken würde, vier Schritte beim Computer,
da brauche ich doch bei der Touring-Maschine mindestens, weiß ich nicht,
zigtausend Schritte für, sondern es gibt halt irgendwie ein Polynom,
das ist auch gar nicht so groß,
sodass die Touring-Maschine eben einen Computer simulieren kann.
So, das oberste ist Wiederholung. Bei unseren Scheibbarkeiten dümm. Genau. So,
Church-Touring-These nochmal, die sagt eben,
dass jede intuitiv berechenbare Funktion auch von der Turing-Maschine berechenbar ist und dann sagt sie eben in ihrer Ganzheit,
sagt sie nachher, dass das auch für alle anderen erdenkbaren Rechnermodelle geht,
die mächtig genug sind, sprich Turing-Maschine,
Computer und so weiter, die können alles,
also alle intuitiven Funktionen berechnen und die können auch alle das Gleiche.
Das ist die Church-Touring-These und die erweiterte Church-Touring-These sagt jetzt,
dass alle diese Modelle in Polynialzeit ineinander umwandelbar sind.
Deswegen kriegt diese Klasse P eine ganz besondere Bedeutung,
weil wenn ein Problem in P ist,
für irgendein Rechnermodell, dann weiß ich,
das ist da für alle Rechnermodelle drin,
sprich es lässt sich auf allen Rechnermodellen
effizient lösen
Das wiederum sagt dann, dass es reicht in der Algorithmik,
sich ein Rechnermodell zu nehmen, was relativ dicht an wirklichen Computern
ist und damit dann eben Pseudo-Code und dann über Algorithmen zu argumentieren.
Da braucht man nicht die ganze Zeit immer mit Turing-Maschinen arbeiten. Da nochmal in Rot,
Church-Turing-These, alle hinreichten mächtigen Berechnungsmodelle sind Äquivalent,
wobei die, die uns interessieren,
halt Turing-Maschine und reale Computer sind und erweiterte Church-Turing-These,
wenn ich zwei Rechnermodelle habe,
dann kann ich eben ein Polynom angeben,
sodass ich Tee-Rechenschritte des Einrechnermodells in PVT in Rechnerschritten bei dem
anderen Modell
Heißt zwei solche Modelle lassen sich ein Pulli und ihren Mehraufwand ineinander umwandeln.
So, das war das, was ich eben schon erzählt habe.
Komplexitätsklasse P erhält jetzt eine besondere Bedeutung. Aber ein Problem mit P. Und dann,
das hatte ich vorhin auch schon mal erzählt,
man nimmt jetzt eben, oder nennt man,
hat so mit Erfahrung gemerkt,
dass eben in P genau die Probleme liegen,
die sich effizient lösbar lassen,
die sich effizient lösen lassen
Deswegen diese Klasse P und deswegen führt man das zwar ein,
diese ganzen Zeit- und Platzkomplexitäten für Touring-Maschinen,
denkt jetzt aber gleich relativ häufig einfach in diesem,
in so einer abstrakten Pseudo-Code-Sprache, bei der man sich schon vorstellen kann,
dass man die auch irgendwie in C oder so implementieren kann und sagt dann da eben auch jeder Schritt,
eine Zeiteinheit, jede Variable, eine Platzeinheit und dann guckt man,
was da rauskommt.
So, da nochmal, warum man jetzt annimmt,
dass solche Probleme in P, warum die effizient lösbar sind,
da erstmal nochmal die Definition im Polinialzeit bedeutet,
es gibt irgendwie so ein Polynum P,
Instanz der Länge N lässt sich dann in P
in Schritten lösen
Und wenn ihr jetzt beispielsweise so ein Polynom wie Endquadrat
habt und ihr habt eine Eingabe der Länge 10,
dann dürft ihr halt irgendwie 100 Schritte brauchen.
Wenn in der Eingabe der Länge 50 hat, dürfte 2500 Schritte brauchen.
Das wächst halt immer noch irgendwie quadratisch, sprich,
wenn irgendwie die Eingabelänge um den Faktor 5 wächst,
von 10 auf 50, wächst halt die Zeit,
die ihr habt, quadratisch, um den Faktor 25.
Das sagt man aber noch, ja, das ist okay.
Wenn ihr aber sowas habt wie so einen exponentiellen eine exponentielle Zeitschranke.
Wenn ihr dann eine Eingabe der Länge zehn habt,
dürft ihr irgendwie tausend Schritte brauchen, also 1024, aber irgendwie ungefähr
1000. Und wenn ihr da von zehn auf Eingabelänge 50 hüpft,
dann braucht ihr plötzlich eine Billiardeschritte. Und das geht dann
relativ schnell außerhalb dessen, was man gut lösen kann.
Kann man auch noch jetzt irgendwie sich direkt mit Zeit und so Gedanken machen,
aber mit richtiger Zeit wird das alles ziemlich unhandlich.
Deswegen spricht man eher so über solche Schritte. Und man
sieht hier halt schon, dass das irgendwie ziemlich abraucht.
Also ihr könnt euch auch mal überlegen, wenn ihr hier
100 einsetzt, dann kommt da irgendwie 10.000 rein raus.
Das ist auch immer noch sehr gut handhabbar.
Wenn ihr aber hier irgendwie 100 einsetzt,
dann habt ihr irgendwie eine Billiarde, mal eine Billiarde Schritte.
Das ist irgendwie völlig aufscope
Also sprich, exponentielle Zeitschranken wachsen einfach mit der Eingabelänge viel,
viel schneller als Pudinum Yelle.
Das heißt, so was wird definitiv nicht mehr praktikabel sein,
aber so Polynome, damit kann man super gut arbeiten.
Und man hat eben auch festgestellt, dass dieser Fortschritt irgendwie in Rechnerarchitekturen,
dass alles immer irgendwie schneller ging und so,
dass die sich immer alles irgendwie mit Polynomen ausdrücken.
Also es war nie so, dass man plötzlich irgendwie Probleme lösen konnte,
die man, also die völlig jenseits dessen waren,
was man vorher lösen konnte, sondern einfach nur dadurch,
dass man,
da steckten immer nur Polynome drin
Also der Speed-Up war immer irgendwie durch ein Polynom ausdrückbar.
Und dann kann man eben noch auch in der Praxis feststellen,
dass man für die meisten Probleme,
für die man so einen Algorithmus in P finden kann,
tatsächlich auch einen findet mit einem kleinen Polynom.
Also ihr habt nicht mit so Polynomen zu tun wie Nho50 oder so,
sondern wenn man ein Problem praktisch lösen kann,
aber meistens so polynome Endquadrat, Nhoch3, irgendwie sowas.
Und dann gibt es manchmal so Probleme,
die irgendwie lange Zeit nicht schnell lösbar waren und
dann findet irgendwann einer ein Polyonialzeitalgorithmus und manchmal ist der dann
sowas wie N hoch 10 oder noch 11 oder irgendwie so
ein Ding
Und dann merkt man, okay,
jetzt haben wir ein Polininialzeitalgorithmus und meistens lässt er sich dann schnell,
schnell, schnell wirklich verbessern und dann ist das irgendwann doch
wieder in N-Hoch 3 oder sowas.
Also so wirklich realistische Probleme, die sich mit einem hohen Polinom
nur lösen lassen, gibt es eigentlich nur ganz wenige.
So, wir merken uns, Polinomen sind wichtig.
Und was es jetzt meistens interessiert, ist aber quasi nur der
wirklich relevante Teil eines Polinoms. Wenn ihr euch das Polynom hier anguckt,
zehnmal in Hoch 3 plus zehnmal Endquadrat,
minus 50 mal End plus 25,
der relevante Teil ist der so mant mit dem höchsten Exponenten
Und da kann man auch noch den Faktor wegschmeißen. Warum ist das so,
wenn ihr immer größere Werte in die beiden Polynome einsetzt,
dann werdet ihr feststellen, die sind im Grunde genommen gleich.
Also wenn ihr da irgendwie für N eine Million einsetzt,
dann ist dieses N hoch 3 gegenüber dem minus 50 mal
N sehr, sehr dominant.
Sprich, dieses minus 50 mal N spielt nachher überhaupt keine Rolle mehr.
Und der Faktor 10, der wird auch im Grunde genommen immer unwichtiger.
Man sagt dann, dass die beiden Funktionen asymptotisch gleich sind,
weil die sich quasi in der Unendlichkeit
aneinander annähern
Das, was für uns wichtig ist, ist,
sich zu merken irgendwie, okay,
die beiden Polynome verhalten sich dadurch im Grunde genommen gleich,
dass wenn man große Werte einsetzt, nähern die sich an.
Und so ein Polynom ist eben immer bestimmt durch seinen größten Sumanten
hier, der durch den Sumanten mit dem größten Exponenten.
So, wenn man das formalisieren will, gibt es diese
O- oder auch Landau-Notationen. Und warum die wichtig ist,
kann man eben sich auch ganz gut bei so einem Algorithmus mal überlegen.
Stupide lineare Suche, also ihr kriegt einen Array A
von so und so vielen Strings.
Und ihr sucht irgendwie einen bestimmten Namen da drin
Wenn ihr jetzt, also das ist jetzt keine Touring-Maschine mehr,
sondern jetzt sagt man, naja,
Touring-Maschinen sind ja jetzt auch nicht so praxisrelevant.
Von daher, wir nehmen irgendwie lieber eine imperative Programmiersprache
und zählen da die Schritte, die wir brauchen.
Wie viele Schritte braucht man denn da?
Also wann liefert das Ding... Oh, der Worst Case
, wir wollen ja Worst Case machen.
N, fast.
Endklingt gut
Nee, klingt immer noch gut,
weil es ist fast das Gleiche, aber, nee,
auch noch nicht. Wie kommst du denn auf N?
Genau, stimmt. Was passiert in der ersten Zeile?
In der allerersten, was passiert da alles?
Wenn ihr ein bisschen tiefer einsteigt in den Source-Code.
Was muss da alles passieren? Oder für die,
was müsste im Assembler-Code
alles passieren
In der ersten Zeile. Nicht in der zweiten, was passiert in
der ersten Zeile. Da wird noch kein Name verglichen.
Ja, was passiert, wenn ich eine Vorschleife durchgehe?
Da passiert viel, viel mehr, als da steht.
Da steht irgendwie VI gleich 0 bis 9. Da passiert eine
Erhöhung immer. I wird immer um eins erhöht bei jedem
Durchlauf. Dann ein Vergleich. Ich muss ja gucken,
ob ich schon am Ende bin. Ja,
und im Grunde genommen kann man sich jetzt noch drüber streiten,
vielleicht nur noch so ein If-Senels-Konstrukt, dass ich da reingehe oder nicht.
Also auf einer Ebene da drunter, auf Prozessebene passiert da
noch mehr
Das sind schon irgendwie zwei oder drei Operationen drin.
Dann gibt es hier dreimal den, dann gibt es hier den Vergleich,
wie schon irgendwie bei viermal in vielen Operationen im Worst Case.
Und dann kommt noch so ein Return to, dann Return falls dazu oder so.
Also wenn man das noch ein bisschen mehr aufschlüssel,
du hast natürlich total recht mit dem N,
aber wenn man das noch ein bisschen mehr aufschlüsselt,
sich überlegt, was da quasi auf Assembler-Ebene passiert,
dann passiert da noch mehr als nur diese n-viele Schritte.
Da passieren irgendwie viermal Endschritte oder irgendwie sowas. Das möchte man
aber alles nicht haben, sondern man möchte dann sagen,
naja, das, was wirklich relevant ist,
ist halt, dass es endviele Schritte sind.
Das ist eine viel schönere Aussage,
als wenn ich darüber philosophiere,
was dann bei diesem Vor noch alles
passiert oder so
Dann kommt noch dazu, dieses N-minus 1 oder N plus 1,
will ich das Return noch mitzählen oder nicht.
Das ist mir auch irgendwie nicht so wichtig,
sondern in dem N steckt eigentlich alles drin an Info,
was ich haben wollte. Deswegen eben auch dieses,
dass man nicht solche Polynome haben möchte bei der Algorithmenanalyse,
sondern irgendwie solche, so schön kompakte,
dass man eben auf das wirklich Wesentliche sich beschränken kann.
Dass man hier eben sieht, es ist eine lineare Suche,
die braucht endviele Schritte. Und bei dieser O-Notation,
die wir jetzt einführen wollen,
da wird man dann eben genau auch sagen,
oh von N viele Schritte brauche ich,
wobei das O eben diese Konstante einfach unterdrückt
So, da nochmal Zeit- und Platzkomplexität im Uniform Mars,
nennt man das, wenn wir solche Algorithmen vorliegen haben wieder oben,
dann wollen wir eben sagen,
eine elementare Anweisung zählt einen Schritt und eine benutzte Variable zählt eine Platzeinheit.
So, jetzt kommt die Ohnnotation. Ich bin mir gerade nicht ganz sicher,
aber ich glaube, auf der nächsten Folie kommt die Ohnnotation, also keinen Schreck kriegen.
Ah, doch noch nicht. Wir werden nachfolgen,
Konstante Faktoren ignorieren, verschwinden in der U-Notation,
Konzentration auf das Wesentliche, Abstrahieren von verschiedenen Rechenarchitekturen,
weil wir eben, wenn wir dann sowas haben,
wie O von N hoch 3,
dann wissen wir im Grunde genommen,
ja,
bei der einen Rechenarchitektur ist dann noch ein Faktor davor oder
auch nicht oder so,
das ist uns
da nicht
so wichtig
Guter Vergleich von Algorithmen möglich, ist auch sehr praxisbewährt.
Werdet ihr im nächsten Semester in ARD noch
sehr viel exzessiver haben und man kann anfängliche Spankungen ignorieren.
Aber in der Unnotation, die beiden da,
das werden wir nachher als im Prinzip leicht ansehen,
kann man sich jetzt auch darüber streiten,
ob das dann gut ist oder nicht.
Aber wie gesagt, so in der Praxis hat sich das
ziemlich bewährt, dass man damit Algorithmen vergleichen kann.
Jetzt kommt die Folie mit der Unnotation
um.
In der Klausur gebe ich typischerweise die dritte Zeile hier und ersetze ein Symbol durch ein falsches.
Und dann frage ich, wo ist der Fehler?
Zum Beispiel mache ich dann das, es existiert hier,
da lasse ich dann den dritten Strich weg.
Nein, Blödsinn. Das ist nur dafür, dass ihr
das mal seht, wie man das formal definieren würde.
Das Wichtige ist, also wir brauchen eigentlich auch nur die oberste hier,
dieses O von G von N. Und die Aussage soll sein,
eine Funktion F ist dann in O von G von N,
wenn irgendwie eine reelle Zahl C existiert, sodass ihr F von N nach oben durch zehnmal G von N begrenzen könnt.
Und der andere Kram mit diesem es existierten N null,
der das für alle N, das soll nur bedeuten,
das muss nicht schon am Anfang gelten,
sondern das darf dann eben erst irgendwie auch ab dem ab irgendeiner konstanten N null gelten, zehn oder zwanzig oder irgendwie sowas.
Und das, wofür wir das primär brauchen, ist,
dass man dann halt so Sachen sagen kann,
wie wenn ihr für G von NN-Quadrat nehmt,
also in O von Endquadrat, was ist da alles drin,
erstmal alle Funktionen, die sowieso kleiner sind,
also beispielsweise sowas wie N, Ist kleiner gleich, Endquadrat,
also ist das da auch irgendwie drin mit Konstante 1. Ihr könnt aber auch so Sachen machen,
wie das Endquadrat, minus, nee,
Endquadrat plus 5N. Das ist halt auch in O von Endquadrat drin.
Da verschwindet jetzt sozusagen dieser andere Somant, weil ihr könnt ja
hier als konstante C irgendwie die Zahl 6 nehmen oder irgendwie sowas.
Dann habt ihr plötzlich sechs Endquadrat auf der einen Seite und auf
der anderen Seite steht immer noch dieses Endquadrat plus 5N,
gilt dann auch. Und dann will man halt manchmal noch,
dass das nicht gleich gilt,
sondern erst ab einem bestimmten Wert,
weil vielleicht eine von den Funktionen am Anfang so ein bisschen
rumoszilliert oder so,
das will man
dann ignorieren
Aber im Grunde genommen sagt, oh, von Endquadrat einfach nur,
dass da alle Funktionen drin sind, die kleinergleich dieser Funktion sind.
Kleinergleich bedeutet eben, ich darf kleineresumanten ignorieren, ich darf kleinere Faktoren ignorieren.
Ja, genau, und dann tue ich die da rein. Und die anderen sind einfach nur dieses Omega,
da seht ihr hier, da ist so ein größer gleich,
da schreibe ich halt all die Funktionen rein,
die Über-G von End liegen, in Täter sind Funktionen,
die genau zwischen oder die gleich sind wie G von End,
nicht dazwischen, sondern wo ich halt eine Konstante C finden kann,
sodass die eine ein bisschen da runterdrücken kann und die Gleichfunktion ein bisschen darüber,
den Verhalten,
die sich im Grunde genommen gleich,
sehen wir gleich auch nochmal und Klein-O und Klein-Omega,
das steht dann
nur der Vollständigkeit halber
Fragen zu dieser Groß-U-Geschichte. Wir sehen da gleich auch nochmal ein Beispiel, aber da gerade Fragen zu.
Das ist die, die ihr kennen solltet, also Groß-O, solltet ihr kennen. Solltet ihr deswegen kennen,
weil man dann relativ häufig sagen kann,
bei so Geschichten wie jetzt irgendwie ein Algorithmus,
jetzt macht man eine Algorithmenanalyse und dann steht da üblicherweise,
dieser Algorithmus läuft in O von Endquadrat oder ein O von N oder ein O von N mal Login oder irgendwie solche Geschichten und damit meint man immer,
dass sich die Laufzeit ungefähr so verhält wie von Endquadrat,
oh, von Endmar Login oder irgendwie sowas,
dass die Laufzeit eigentlich ein bisschen anders ist,
so wie vorhin bei dieser linearen Suche illustriert,
dass das dann vielleicht irgendwie viermal enden ist oder irgendwie sowas,
das ist nicht so wichtig, weil man eben sagen will,
dieser Algorithmus weg oder die Laufzeit dieses Algorithmus,
es wächst einfach linear bei Uf und Enniots,
weil wenn sie eigentlich mit viermal N wächst,
das wird halt für große Ends,
wird dieser Faktor 4 irgendwie relativ egal.
So, das sind wichtige Funktionen in der Algorithmenanalyse,
macht ihr dann in AD nochmal genauer die,
die wir primär jetzt brauchen,
sind Polynome und die Exponentialfunktion.
Die anderen brauchen wir
gar nicht
Oder nur selten. Das auch nur als Anmerkung.
Hier steht irgendwie der Logorithmus als wichtige Funktion. Üblicherweise in
der Informatik arbeitet man halt mit so einem Logarithmus zur Basis 2.
Muss man dann irgendwie ein bisschen genauer definieren,
weil man keine Null haben will, sondern maximal die Eins.
Und mit Login hat man dann mit der Definition hier immer
die Länge der Binärdarstellung der natürlichen Zahl N. Brauchen wir aber nicht,
deswegen ist das auch in blau gehalten und als Nebenbemerkung nur für die,
die sich das irgendwie beim Nacharbeiten mal fragen
So, Beispiel, das hier wollen wir jetzt zeigen,
ein Halb-Endquadrat minus 3N ist in Täter von Endquadrat drin.
Täter bedeutete, die beiden verhalten sich im Grunde genommen gleich.
Und wie gesagt, wenn ihr da große Werte für Endquadrat einsetzt,
dann werdet ihr auch feststellen, da kommt bei beiden fast das Gleiche raus.
Das, was man nach dieser Definition machen muss, ist,
man muss jetzt irgendwie eine konstante C1 finden und eine konstante C2,
sodass eben C1 mal Endquadrat kleiner gleich der Funktion hier ist,
größer gleich C2 mal Endquadrat.
Und das muss erst ab einem bestimmten N0 gelten
Was man jetzt machen kann, ist, man teilt überall
durch Endquadrat, dann kommt man da irgendwie hin.
Und jetzt überlegt man sich, für welche Werte für C1,
C2 und N0 würde das denn gelten.
Und das gilt beispielsweise für C1, ein Viertel oder zwei Achtel,
C21 und dann eben ab N024 gilt das dann.
Warum, wenn er 024 ist,
dann zieht er von denen ein halb hier 3,
24. ab, also irgendwie von 4,
8 und zieht ja ein Achtel ab,
kommen da 3 Achtel raus.
Das ist größer als zwei Achtel und kleiner als eins und
für größere Werte von End zieht er ja immer mehr ab.
Also werdet ihr unter das 2,8 und nicht fallen,
aber auch nicht über das 1 kommen
Ja, das kann man da machen. Das auch,
ich weiß nicht genau, hattet ihr Limes schon?
Ja? Okay. Auch da, guckt euch mal nur
die erste Zeile an, das andere brauchen wir nicht so.
Na, die erste und die dritte. Wenn man zeigen will,
das F von NNO von G von N ist,
nochmal, die Idee ist, dass dann gilt,
F von N ist kleiner gleich G von N.
Zwar kann ich, gehe noch mit einem Faktor irgendwie multiplizieren mit
so einem C und das muss auch erst ab irgendeinem N null gelten,
aber im Grunde genommen sage ich damit aus F von N,
kleiner gleich G von N.
Wenn F von N, kleiner gleich G von N ist,
Und man bestimmt diesen Limes, dann kann das nicht gegen unendlich gehen,
sondern das muss irgendwie kleiner werden.
In vielen Fällen wird das sogar null oder so,
aber wird kleiner als unendlich. Von Ende ist ja kleiner als G,
wenn ihr also F durch was Größeres teilt, dann kann da nicht unendlich rauskommen.
Und hier nochmal bei dem Täter, da soll das eben gegen eine konstante,
gegen eine positive Konstante laufen. Beispiel von eben nochmal,
da wurde jetzt gesagt, F von NS&O von GVN genau dann,
wenn dieser Limes eben kleiner als unendlich ist,
wenn man jetzt das nochmal bestimmen will, eben hatten wir hier einen Täter,
jetzt reicht uns mal kurz das O, Na,
dann macht man wieder dieses Teilen.
Und wenn man N hier gegen unendlich laufen lässt,
drei durch etwas, was immer, immer größer wird,
dann geht das irgendwie gegen null, ein halb minus etwas,
was gegen null geht, geht irgendwie gegen ein halb,
ein halb ist offensichtlich kleiner als unendlich.
Also gilt diese Beziehung. Genauso kann man noch zeigen,
dass irgendwie das auch in Omega von Endquadrat ist,
also dafür musste man ja zeigen,
dass dieser Grenzwert größer ist als null, das ist offensichtlich auch.
Das heißt, eigentlich kommt da eine konstante C raus,
hier,
so gilt das hier
Genauso wie wir das eben auch schon gemacht hatten.
Meistens geht es mit der Liebe schreibweise sehr, sehr viel schneller.
So, Merkhilfe, auch da, die oberste ist wichtig, F-Element aus
UFONG bedeutet eben, dass F-Kleider gleich G ist, asymptotisch Kleider.
Kriegt ihr nochmal schön im Detail in der AD-Vorlesung,
aber ich dachte, dann habt ihr das schon mal gesehen,
dann ist da nachher der Einstieg schneller.
Je nachdem, bei dem ihr das nämlich habt,
macht der Veranstalter das entweder auch so ein bisschen länger oder
vielleicht sogar nur so mit zwei Folien oder so,
ist das immer so
ein bisschen fies
So, lineare Suche, da nochmal hatten wir eben,
ist linear in der Länge Ende des Arrays. Das heißt,
es sind U von N oder genau sogar ein Täter von N.
Korrektheit müsste man noch zeigen, macht ihr in AD.
Laufzeit ist also linear in der Eingabegröße.
N ist die Eingabegröße, ich kriege da ein Array,
Laufzeit ist linear in der Eingabegröße O von N. Fakultät bestimmen.
Ihr kriegt als Eingabe die Zahl N und ihr
bestimmt über diesen etwas,
Etwas kleiner Algorithmus da, die Fakultät. Also ihr fangt
mit Result 1 an und dann rechnet ihr halt eins mal eins,
dann rechnet ihr mal zwei, mal drei,
mal vier, mal fünf und so.
Und dann kommt da irgendwie die Fakultät raus.
Laufzeit davon? Fast das Gleiche wie eben, Laufzeit davon.
Ja, Ofenende. Multiplikation und so zählt alles als eine
einfache Operation.
Deswegen ein Schritt
Fangfrage. O von N. Ist das jetzt linear in der Eingabegröße?
Na, es meint ja Linie an der Eingabegröße.
Meldet euch mal, wenn ihr meint,
dass das Linie an der Eingabegröße ist.
Niemand. Einer. Einer ist gut. Zwei. Wer
findet, dass das nicht linear in der Eingabegröße ist?
Einfach Rostoff. Sehr gut ist richtig.
Kleine oder größer
Bist du immer oder besser? Größer, ja. Kleinheitslinie
geht ja auch kaum noch so, ne? Ja,
ist größer. Wie groß ist denn die Eingabegröße hier? Der Trick ist,
das werdet ihr auch in Algorithmik noch haben, oder der,
nicht Trick, sondern das, worüber man leicht mal stolpert.
Hier kriegt ihr ja irgendwie als Eingabe die Zahl N,
und ihr macht dann O von N viele Schritte.
Aber die Zahl N, ne,
normalerweise kriegt man ja Zahlen irgendwie binär kodiert, das heißt,
die Zahl N braucht nur Login viele Bits,
um die zu kodieren
Naja, und Log-N und N, N ist irgendwie exponentiell
ein Log-In, weil zwei Hochlog-N eben N ist.
Das heißt, wenn ihr als Zahl 1024 kriegt,
dann braucht ihr nur zehn Bits, um das zu kodieren.
Also ist die Eingabelänge zehn, aber ihr braucht 1024 Schritte.
Und das ist irgendwie bezüglich der Eingabelänge exponentiell bezüglich der eigentlichen Eingabelänge.
Exponentiell in der Größe der Eingabe, die ist nämlich
nur in O-Log-N. Ja, genau, wie gesagt,
kriegt ihr in Algorithmik
rauf und runter
Da nochmal das Vorgehen, wenn man jetzt so einen Algorithmus analysieren will,
man überlegt sich üblicherweise bezüglich welcher Kenngrößen der Eingabe man messen will. Wir hatten jetzt hier,
da würde man halt irgendwie als Kenngröße die Arry-Länge nehmen,
aber ich hatte ja vorhin einmal kurz als Beispiel erzählt,
wenn man jetzt so mit Grafen zum Beispiel arbeitet,
dann nimmt man nicht unbedingt die Eingabe größer als die Größe des Grafen,
sondern vielleicht nur die Anzahl der Knoten oder die Anzahl der Kanten und sagt dann eben,
der Algorithmus läuft in O von N,
dann weiß man irgendwie, braucht so lange,
wie ich Knoten habe.
Dann drückt man die Laufzeit in den Speicherbedarf bezüglich der Kenngröße
aus und überlegt sich nochmal,
ob die Aussage das Ergebnis verfälscht,
so wie eben eben bei diesem Linear und exponentiell
So, das auch so als kleiner Exkurs in die Algorithmik, fragen. Finde das Maximum,
also wir fangen mit Max 1 an,
also wir setzen die Variable Max auf 1 und dann gehen wir i2 bis Ende durch,
gucken immer, ob AI größer als Amax ist und falls ja,
aktualisieren wir unseren Wert Max und Max zeigt nachher auf das Maximum,
ne?
Frage, wie ist die Laufzeit?
Da müsste man kickern.
ABCDEF, ja
50 Sekunden. Vier haben sich schon
eine Meinung gebildet
Niemand nimmt die vierte, das ist aber bedauerlich.
E und Elf nichts davon. Richtig sind B-C und D.
Warum B-C und D, weil B-C und D im Grunde genommen gleich sind.
Also O von N ist das Gleiche wie O von N minus 1,
ist das gleiche wie O von 3 mal N.
Ihr könnt ja, bei dieser O-Notation, also wenn ihr sagen wollt,
eine Funktion F ist ein O von N,
dann könnt ihr ja an das N noch irgendwie eine Konstante nehmen,
mit der er das multipliziert.
Dann könnt ihr auch drei nehmen oder vier oder so und dann
ist eben O von Ende das gleiche wie O von 3N.
Allgemein kann man sagen, dass das O eine Konstante unterdrückt.
Also wenn ihr euch jetzt nicht so doll damit beschäftigen wollt,
irgendwie wie diese komische O-Notation genau definiert ist oder so und ihr findet irgendwo im Algorithmenbuch mal die Aussage,
dieser Algorithmus läuft in O von N mal Login,
dann ist die Bedeutung,
es gibt irgendeine konstante C,
die ich nicht genauer spezifizieren möchte,
so,
dass die Zeit eben durch zehn mal N
mal Login beschränkt ist nach oben
Deswegen sind halt O von N, O von N
minus eins und dreimal N. Alle gleich. Und das ist
auch die Laufzeit von diesem Algorithmus. Und üblicherweise nimmt man das,
was am kürzesten zu schreiben ist, also man sagt einfach O von N.
Und warum ist das in O von N?
Wichtig ist die Vorschleife hier. Die macht irgendwie,
das heißt, der Rumpf wird hier N mal ausgeführt.
Oder N minus eins mal. Naja, und bei jeder Iteration
wird eine konstante Anzahl von Dingen getan. Das heißt,
ihr führt irgendwie N minus eins mal K-Operationen aus,
dann seid ihr irgendwie in N minus eins mal K,
dann kommt noch irgendwie vorne was dazu,
in der ersten Zeile und in der siebten Zeile,
dann seid ihr irgendwie in N minus eins mal K plus zwei oder so.
Und das ist eben in O von
Deswegen stimmt da die zweite. Wenn ihr jetzt sortieren wollt,
ihr könnt schon klickern. Wenn ihr sortieren wollt, sortieren mit der Maximumsfunktion.
Die Idee ist, ihr fangt bestimmt das Maximum,
das schreibt ihr euch ganz am Anfang in ein neues Arry,
dann bestimmt ja das Maximum von dem,
was übrig geblieben ist und schreibt euch das.
Genau, schreibt euch das an die nächste Stelle in
dem Arry und so weiter
Musik Ja. Mehrheit gewinnt. Uf und Endquadrat, genau.
Kann einer begründen? Warum Uf und Endquadrat? Genau,
warum End mal füllen? Was meinst du damit? Genau,
und die Maximum-Funktion war ja auch schon Uf und N. Genau.
Idee ist, auch wieder diesen Block hier,
diese zwei, drei, vier,
die führe ich wieder N mal aus,
was er
eben auch gesagt hatte
Und jetzt irgendwie Zeile 3 und 4 braucht einen Schritt jeweils.
Das heißt, ich habe irgendwie zweimal in viele Operationen bisher.
Aber diese zweite Zeile bei dem Maximum, die kann halt endviele Schritte brauchen.
Das heißt, ich habe enden mal diese zweite Zeile wird en-main
mal ausgeführt. Oder die zweite Zeile wird en-ma ausgeführt,
aber bei jedem davon brauche ich Endschritte.
Dann bin ich in Endquadrat. Kann man ein bisschen tweaken,
indem man so Sachen macht wie irgendwie,
ich muss ja nicht jedes Mal das Maximum von komplett A eigentlich bestimmen,
sondern ich könnte ja die Nullen irgendwie an den,
immer ans Ende des Arrays setzen und dann wird man Are
A. kleiner und dann muss ich immer das Maximum für
immer kleinere Adreys bestimmen
Also bestimmt zuerst das Maximum meines Endelementigen Arris,
dann das Maximum meines N-minus-1-Elementing, N-minus-2-Elementing, N-minus-3-Elementing und so weiter.
Dann habe ich hier also Endschritte plus N-minus-1 plus N-minus-2
plus N-minus-3 plus N-minus-4 Schritte und so weiter.
Das geht aber auch in Richtung Endquadrat. Das ist dann
die gausche Formel und dann kommt er da irgendwie bei Endquadrat halbe raus,
aber das ist auch in O von Endquadrat. Genau,
die anderen, O von En reicht halt nicht,
wegen der Begründung von eben, N mal Log-N könnte man denken,
wenn man eben diese Maximumsbestimmung immer kleiner macht,
reicht aber auch nicht
Ja, genau. Ach so, die fünfte stimmt übrigens auch.
Warum? Warum stimmt die fünfte? Genau. Also meine O enthält alles,
was kleiner ist, also in O von zwei hoch Endes,
O von Endquadrat irgendwie enthalten, also jede Funktion,
die in O von Endquadrat ist,
ist ja kleiner als Endquadrat,
die ist dann ganz bestimmt auch kleiner als zwei hoch
Vielleicht noch nicht für die Werte eins und vielleicht nicht für den Wert eins,
aber dann doch für eins auch, ne?
Ja, für eins sogar auch in dem Fall.
Aber selbst wenn nicht, würde das halt nachher,
stimmt das auf jeden Fall. Also da ist es auch drin,
nur üblicherweise interessiert man sich für eine obere Grenze, die möglichst klein ist.
Also man interessiert sich für die beste obere Grenze,
sonst könnte ich in den meisten Fällen einfach hinschreiben, oh,
von irgendein total abskures Exponentialfunktion und dann habe ich eine Grenze von oben,
aber die hilft mir ja nicht.
Ich will eine möglichst gute
Hier, damit ihr das niemals, niemals, niemals,
niemals falsch macht. Oh, ich befürchte, die Antworten drei,
vier, fünf und sechs werden gleich besonders ausgeprägt sein.
Wofür steht das N? Eine total beliebte, mündliche,
also eigentlich keine Prüfungsfrage in mündlichen Prüfungen,
aber im mündlichen Prüfungen wäre das irgendwie ständig falsch gesagt.
Mal gucken, wie das hier gleich aussieht.
Zwei,
1,
Nicht deterministisch, sehr gut. Immerhin, ein Prozent,
also 51 Prozent ist super. Nicht deterministisch, ne? Für die,
für die zwölf Prozent bei A, nein, nein, nein,
nein, nein, nein, nein, nein, nein.
Es wird nicht für nicht pudinumiell. Es steht für nicht
deterministisch. Und für die bei CD, E und F
auch, ne? Es steht für nicht,
nicht zumindest
So, was meint ihr denn, was da gilt?
P und NP. Eine Teilmenge, andere Teilmenge, Schnittleer.
Also, da ist ja gar nichts Teilmenge von dem anderen,
wenn der Schnitt leer ist.
Oh, da sind die vielleicht
sogar unvergleichbar
Mhm. Genau. P ist eine Teilmenge von NP,
was sich in deterministischer Polymialzeit lösen kann,
kann ich auch in nicht deterministischer Polymialzeit lösen,
indem ich diesen Nicht-Determinismus
gar nicht benutze
Deswegen gilt die erste Timing-Beziehung auf jeden Fall.
Bei der zweiten weiß man nicht, ob es gilt.
Kommen wir noch zu. Und bei der dritten, Lea
ist das auf keinen Fall. Also das enthält mindestens YAP.
Vielleicht ist das sogar gleich. Also vielleicht, wenn P
gleich NP ist, dann ist das eben P und NP.
Es enthält aber mindestens P. Und unvergleichbar ist es natürlich auch
nicht.
Und dann doch nicht
Kurze Zwischenfrage. Kann, da steht ja der Schnitt,
ne? P geschnitten, NP, ob das leer ist,
war die Frage, P vereinigt NP.
Was ist das denn? Ist das Sigmar Stern?
NP, genau. Und trotzdem nochmal die Frage,
ist das irgendwie, hängt das irgendwie mit Sigmar Stern zusammen,
so Teilmenge von Sigmar Stern oder irgendwie sowas?
Oder anders gefragt, ist NP eine Teilmenge von Sigmar Stern?
Ja oder nein
Wer hat das gesagt? Ja, genau. Nein,
es ist keine Timemak von Sigmar Stern,
weil in NP sind ja Timing von Sigmar Stern drin,
also sind ja Sprachen drin und jede Sprache sind Teilmenge von Sigmar Stern.
Aber NP selbst ist keine Teilmenge von Sigmar Stern.
NP ist eine Menge von Sprachen und jede Sprache
ist eine Teilmenge von Sigmar Stern.
So, da muss man schon ein bisschen grübeln.
Da ist jetzt eine Menge S gegeben.
Es enthält jetzt N-N-Elemente
Also, es ist eine Menge von Zahlen, von innen vielen Zahlen.
Und für jede Teilmenge A guckt man jetzt,
ist die Summe der Elemente, die in A drin ist,
das Gleiche wie die Summe der Elemente, die nicht in A drin sind.
Sprich, ihr wollt S-Partitionieren in zwei Teilmengen, sodass die
Summen gleich sind. Also, wenn ihr die Menge 1,
2, 3 habt, könnt ihr das machen,
weil 1 plus 2 das Gleiche ist wie 3.
Die Menge 1, 2, 3, 4 hat,
könnt ihr das auch machen,
weil 1 und 4 das Gleiche ist wie 2 und 3.
Wenn ihr die Menge 1, 2,
4 habt,
geht das nicht
So, und wenn man jetzt das implementieren will,
wie lange braucht man da?
N ist, wie gesagt, die Anzahl der Elemente in S.
Und jetzt kann man sich ein bisschen überlegen,
dass man hier für die Additionsgeschichten, da braucht man irgendwie,
da stecken ja irgendwie envile Additionen drin,
wie lange braucht man da irgendwie
Musik Jetzt bin ich ja mal gespannt.
Gucken, was da rauskommt. Spannendes Bild am Ende.
B-E. Ihr habt eine Menge S. Und für alle Teilmengen von S.
Wie viel Timeman gibt es? Zwei auch Ende, genau. Ihr könnt irgendwie,
ich glaube, ich hatte das schon mal erzählt,
wenn ihr irgendwie eine Menge S habt und da sind jetzt irgendwie endviele Elemente drin,
dann könnt ihr ja zu jeder,
zu jedem Element in dieser Menge ja oder nein sagen,
um das in die Teilmenge aufzunehmen
Das heißt, ihr könnt, wenn ihr Ende Elemente habt,
N mal 0 sagen. 0, 0, 0,
0, 0, das ist die leere Menge.
Ihr könnt bei jedem Element einmal eins sagen,
also sprich eine Eins an irgendeiner Stelle haben.
Das sind endlich viele Möglichkeiten. Und im Endeffekt kriegt ihr
alle Strings von 0,0, 0,0 bis 1,111 hin.
Das sind halt genau zwei Hochendviele. Das sind alle Timing von S.
Das heißt, in diese Zeilen hier, zwei, drei,
vier, da kommt man schon zwei Hochend mal rein.
Das heißt, ich muss mindestens in O von 2 Hochend sein.
Die anderen sind alle kleiner, das wird also nicht reichen.
Ich muss mindestens in O von 2 Hochend sein.
Wenn man sich jetzt noch überlegt,
dass sich hier Ich addiere ja alle Elemente von A auf.
Also ein Teil auf der linken Seite, den anderen Teil
auf der rechten Seite. Wenn ich endviele Elemente habe,
habe ich da irgendwie endviele Additionen oder endminus eins viele.
Da kommt noch der Vergleich. Da bin ich schon bei Endoperationen.
Das heißt, zwei hoch endmal führe ich N-Operationen aus.
Das heißt, ich bin irgendwie in zwei Hoch-N mal N.
Warum stört mich das mal endlich? Zwei Hoch-N mal N,
warum stört mich das nicht? Also jetzt könnte man ja
irgendwie argumentieren, O von zwei ON reicht auch nicht.
Es muss ein O von zwei Hoch-N-mal-N sein
Ja, die höchste Potenz, genau. Ja,
man könnte halt argumentieren, dass man zweimal, zwei hoch enden,
dass man das irgendwie mit dem N in Verbindung bringen kann.
Und dann ist das okay. Wobei, warte, stimmt das überhaupt?
Was rede ich denn da? Nee, das stimmt ja
gar nicht. Nee, das kriege ich da gar nicht weg.
Es gibt ja keine, man müsste ja zeigen können,
also wenn zwei hoch N mal N,
in zwei hoch N drin ist,
dann müsste eine Konstante existieren,
sodass zehnmal zwei hoch N,
kleiner gleich größer,
größer gleich N mal zwei
hoch N ist
Und so eine Konstante wirst du nicht finden,
weil du kannst das andere N ja immer größer wählen als
dein C. Ja, doch nicht.
Das reicht tatsächlich noch nicht. Nochmal war eben ein bisschen schnell,
wir haben ja herausgefunden, hier irgendwie mache ich zwei hoch
N mal N viele Schritte. Also ich komme in diese zweite,
in diese dritte Zeile irgendwie zwei hoch N mal N mal.
Das ist streng genommen eigentlich nicht in diesem O von zwei hoch N drin,
weil ich eben keine konstante C finden kann,
sodass N mal zwei hoch N,
kleiner gleich zehn mal zwei
hochende ist
Aber man schreibt das üblicherweise trotzdem so, Begründung,
wenn das hier exponentiell wird, dann genau was du gesagt hast,
spielt das Polynom nachher keine große Rolle mehr.
Wenn man das ernsthaft noch unterscheiden will,
dann gibt es so Schreibweisen wie O mit einer Welle drüber,
wo man dann sagt, naja,
wenn das exponentiell ist, dann ignoriere ich Polynome.
Also fünftens sollte richtig sein, man kann sich drüber streiten,
ob fünftens oder sechstens richtig ist, wenn man da sagt,
das läuft in Exponentialzeit, weiß jeder,
was gemeint ist.
Streng genommen wäre es in U von zwei Hochendmalen.
Letzte Frage
Gleicher Algorithmus, also gleiches Problem,
wenn ihr das jetzt aber nicht deterministisch löst,
dann sieht der Algorithmus natürlich irgendwie ein bisschen anders aus,
der steht dann nur, dass ihr das nochmal sehen könnt.
Wenn ihr das gleiche Problem lösen wollt,
dass vor dem oben deterministischen Algorithmus gelöst wird,
wie schnell könnt ihr das nicht deterministisch machen?
Der da eine Idee? Brauche ich weiterhin O von 2
hoch N, Schritte, werde ich so schnell,
dass ich irgendwie in Login bin,
komme ich nach N,
End mal Login,
wo lande ich da
Musik Musik Musik Ich glaube, das ist die erste Frage,
wo nicht die Mehrheit gewinnt, ne? B ist richtig,
O von N. Wenn ihr das nicht deterministisch machen wollt,
dann könnt ihr diese Menge A nicht deterministisch raten.
Also wir hatten ja eben kurz gesagt irgendwie,
dass eine Teilmenge quasi ein Bitstring der Länge N ist,
also N mal eine 0 oder 1 und eine 1 an der Eaten-Stelle bedeutet halt,
das Eate-Element will ich mitnehmen in meine Teilmenge.
Das heißt, was eure Touring-Maschine macht, ist,
N mal rät sie eine 0 oder
Dann habe ich mir die Menge A geraten,
es sind endviele Schritte, dann für das,
was ich geraten habe, rechne ich die zweite Zeile aus,
brauche ich auch irgendwie Endschritte für.
Wenn das gleich ist, sage ich ja,
oder wenn es nicht gleich ist, sage ich nein.
Und eine Erfolgssechnung, wenn denn eine dabei ist,
braucht eben genau zwei Endschritte, ist in O von N.
Also nicht deterministisch geht das sehr, sehr schnell,
weil man sich die Menge A raten kann.
So, jetzt sind wir auch schon, ja,
wenn ja, aus dem Ende,
Ja. Ja. Kann man eigentlich nicht. Also,
da müsste einstehen, zwei Wochen mal enden. Nur bei
Exponentialfunktionen. Ich meinte ja irgendwie, normalerweise würde man,
wenn du es jetzt ganz exakt machen willst,
dann würdest du ja hinschreiben, oh,
und mit einer Schlange oben drüber, um zu sagen,
hier,
das ist Exponential,
aber es gibt noch ein Polynom davor
Wer hat sechs? Ja. Beziehungsweise in der Klausur bin ich
hoffentlich clever genug, um zwei hoch in Mayend hinzuschreiben.
Genau, bei der Klausur wäre sechstens richtig. Also nichts
davon stimmt ja tatsächlich. Ja, genau. So,
das nachher zur Nachbereitung. Und jetzt, ja, nee,
wir sind schon ordentlich über, also wir nähern uns dem Ende eigentlich.
Ich mache nur nochmal zwei Folien. Ihr habt ja eben gesehen,
hier bei dem Beispiel, dass wir exponentiell viel Zeit im
deterministischen Fall brauchen und im nicht deterministischen, schönen Polyonialzeit sind.
Also streng genommen sogar linear, aber linear ist ja auch ein Polynom,
also er nur eins ist ja auch ein Polynom.
Nicht die Terministe scheint also viel, viel schneller zu gehen. Jetzt ist die Frage,
kann man zeigen, dass sich dieses Problem, gegebene Menge,
gibt es zwei Teile, gibt es eine Teilmenge da drin,
sodass die Summe, oh Gott,
kann ich die Menge S so in zwei Timing partitionieren,
sodass die Summen der Elemente gleich sind, kann ich zeigen,
dass das nicht mit einem Polynom geht,
also dass sich das nicht effizient lösen kann
So wie wir in der Vorlesung gestern und letzten Dienstag gesagt haben,
okay, gibt es Probleme, die ich nicht entscheiden kann?
Wollen wir jetzt Techniken entwickeln, mit denen wir sagen können,
ein Problem lässt sich nicht effizient lösen?
Also wir haben Effizienten, nicht die terministischen Algorithmus,
aber nicht die terministische Algorithmen lassen sich irgendwie nicht implementieren.
Deterministisch scheint das irgendwie zunächst erst mal nur in Exponentialzeit zu gehen.
Frage, gibt es da wirklich keinen Polymialzeitalgorithmus für?
Oder haben wir den gerade noch nicht gefunden? Und das ist die berühmte PNP-Frage,
weil das eben damit zusammenhängt,
wenn P hier eine echte Teilmenge von NP ist,
Und dann gibt es ja Probleme in NP,
die sich also schnell nicht deterministisch lösen lassen,
aber eben nicht deterministisch mit P.
So, was ihr heute mitnehmen solltet, auf jeden Fall,
ist die Definition von P und die Definition von NP.
Die brauchen wir nächstes Mal. Braucht ihr eigentlich noch irgendwas anderes heute?
P-N-P. Ja, und diese Sachen mit der U-Notation,
das ist ja irgendwie so ein bisschen ein Gefühl dafür wirklich,
okay, oh, von Endquadrat bedeutet,
die Zeitschranke ist durch zehnmal Endquadrat irgendwie beschränkt.
Da fange ich nächstes Mal wieder an mit P,
NP und so weiter
Genau. Und das hier sind nochmal so typische Probleme,
die in NP liegen. Das Oberste hatten wir gerade.
Eine Menge von so und so vielen natürlichen Zahlen.
Achso, nee, das hatten wir nicht. Das ist
ein kleineres Problem eigentlich. Eine Menge von Zahlen ist gegeben
und eine Zahl Tee. Und die Frage ist dann,
gibt es irgendwie eine Teilmenge in S,
sodass sich gerade das den WT erreiche?
Das ist so ähnlich wie das, was wir eben gemacht haben,
nur noch einen Schritt kleiner. Anderes Problem gegeben,
ein Grafen, geh, gibt es und eine Zahl K,
gibt es K. Knoten in dem Grafen,
die alle miteinander verbunden sind.
Das klicken Problem
Färbungsproblem gucken wir uns nächstes Mal nochmal an. Und das Schöne ist,
all die Probleme kann ich nicht deterministisch sehr schnell lösen.
Und die besten bekannten Deterministischen brauchen aber exponentielle Laufzeit.
Und dann ist eben die Frage, geht das wirklich nicht schneller?
Geht das nicht vielleicht doch irgendwie in P?
PNP ist klar, die Richtung ist unklar.
Und dann werden wir nächstes Mal NP vollständige Sprachen einführen,
also NP Vollständigkeit. Und das wird ein Hilfsmittel sein,
um sagen zu können, ein Problem ist höchstwahrscheinlich nicht NP,
weil wir haben keine Tools, mit denen wir tatsächlich zeigen können,
dass ein Problem keine keinen Polynumialzeitalgorithmus hat,
das können wir noch nicht, aber wir können sowas machen,
was eben ein sehr, sehr starkes Indiz ist.
Das machen wir nächstes Mal. Nächstes Mal fange ich an
mit einer Wiederholung von P und NP und dann machen wir
NP vollständige Sprachen.