So, ich habe gerade mit ihr abgemacht,
ihr kommt ja eh nachher alle nochmal zu diesen beiden Clickerboxen
und gebt die Clicker ab, stapelt doch einfach daneben die Fragebögen.
Dann muss die gute Frau nur zu zwei Orten gehen,
um die Fragebögen einzusammeln und alles ist gut.
Ja. Dann habe ich jetzt ja sieben Minuten verloren.
Ich habe mir überlegt, die hole ich einfach wieder rein,
indem ich keine Pausen mache und nicht atme beim Reden und einfach ununterbrochen schnell rede.
Ich habe auf Dauer, glaube ich, nicht durch.
Mal gucken, ob wir das wieder reinholen.
Zeit und Platzkomplexität, wir haben bisher Mal gucken.
Also wir haben bisher Touring-Maschinen benutzt,
als formales Modell für den Algorithmus und haben damit dann Probleme gelöst,
Funktionen berechnet, Probleme entschieden.
Das Wichtige ist eben, die haben die Probleme
dann unterteilt in entscheidbare Probleme.
Das war quasi gut
Wenn ein Problem entscheidbar ist, dann wussten wir,
okay, die Touring-Maschine kann das lösen.
Und wir haben es unterteilt in nicht entscheidbar. Das waren die Probleme,
wo die Touring-Maschine eben unter Umständen nicht zum Ergebnis kommt.
Und das ist irgendwie schlecht. So,
und wenn man die Unterteilung hat, das ist natürlich schon schön,
vom Problem zu wissen, dass es nicht entscheidbar ist,
dann braucht man gar nicht erst versuchen,
Algorithmus dafür zu entwickeln.
Aber wenn man weiß, dass ein Problem... Ich glaube,
ich muss mal die Batterien wechseln.
Wenn man weiß, dass ein Problem entscheidbar ist,
reicht das ja im Allgemeinen nicht
Ich weiß,
ich habe es eingesteckt
So, nächster Versuch. Wenn man weiß, dass,
also wir haben sie unterteilt in den Scheidbare Probleme und unentscheidbare Probleme.
Entscheidbar war zunächst gut, weil dann wissen wir,
es gibt einen Algorithmus, der das Problem löst.
Problem dabei ist noch, nur zu wissen, dass es einen Algorithmus gibt,
der das Problem löst, reicht im Allgemeinen nicht.
Was man noch wissen will, ist, wie viel Zeit
und Platz man braucht, um das Problem zu lösen.
Weil wenn die Zeit länger ist, als das für mich okay ist,
Dann hilft mir der Algorithmus noch nicht. Das heißt,
da kann ich jetzt noch weiter die entscheidbaren Probleme unterteilen in die,
wo ich wirklich sagen kann, das ist auch in Anführungsstrichen praktisch lösbar,
weil der Algorithmus eine Laufzeit hat, wo ich sagen würde,
das ist okay, der liefert so und so schnell ein Ergebnis,
damit kann ich arbeiten.
Oder ich kann sagen, der Algorithmus löst das Problem zwar, aber der ist überhaupt nicht praktikabel.
So und das kann jetzt natürlich je nach Setting irgendwie unterschiedlich sein. Wenn das irgendwie was ist,
wo ihr, keine Ahnung,
irgendeine Berechnung macht am Modell und das dauert die ganze Nacht,
dann kann das okay sein, weil ihr sagt irgendwie,
okay, abends schmeiße ich die,
abends schmeiße ich das Modell, den Rechner,
morgens,
wenn ich wieder auf Arbeit bin,
ist das Ergebnis da.
Kann okay sein
Wenn eine Datenbankabfrage die ganze Nacht dauert, ist das vielleicht
nicht okay. Das ist dann irgendwie ein schlechter Algorithmus.
Das wollen wir also noch unterscheiden. Und abhängen wird das
einmal von dem Problem selbst und von der Größe der Probleminstanz.
Unten steht nochmal in der Anmerkung, was eine Probleminstanz ist,
eine Probleminstanz ist einfach eine mögliche Eingabe.
Also wenn ich jetzt zwei Zahlen kriege, die addieren sollte,
ist das eine Probleminstanz für das Problem, zwei Zahlen zu addieren.
Und erstens wird die Laufzeit abhängen von der Größe der Probleminstanz,
zehn Zahlen zu sortieren, sollte allgemein schneller gehen als 2000
Zahlen zu sortieren oder sowas.
Und es wird natürlich von den Problemen abhängen
Irgendwie eine Zahlenfolge zu sortieren, dürfte im Allgemeinen länger dauern,
als in der Zahlenfolge nur im Aximum zu suchen.
Dafür wird es also irgendwie abhängen. Insbesondere, das vom Problem
abhängt, ist irgendwie klar. Und insbesondere eben auch von
der Größe der Probleminstanz. Und was man jetzt macht,
ist, dass man sich eben sogenannte Komplexitätsmaße für Touring-Maschinen überlegt,
also wie man bei einer Touring-Maschine den Zeitverbrauch müsste und wie man bei der Touring-Maschine den Platzverbrauch misst.
Und das kann man dann übertragen nachher, weil man ja schon weiß,
diese Church-Touring-These irgendwie, alle diese Berechnungsmodelle sind äquivalent,
eine Touring-Maschine kann prinzipiell das Gleiche wie ein Computer,
dann kann man diese Komplexitätsmaße auf Computer übertragen.
Aber erstmal ist es einfacher,
das für eine Touring-Maschine einzuführen, weil die eben noch nicht
so viel kann
Sag mal. Also, wie macht man das? Wenn ich eine deterministische Touring-Maschine für den Anfang habe,
das ist erstmal leichter als bei einer nicht-deterministischen,
dann sage ich einfach, wenn ich so eine gegebene Rechnung habe,
dann brauche ich eben so viel Zeit,
wie ich oder so viele Schritte, wie ich Konfigurationen durchlaufen habe.
Und Platz brauche ich so viel, wie ich eben maximal Felder besucht habe.
Das ist so das, was man irgendwie intuitiv auch erwarten würde. So ein Beispiel,
das ist irgendwie eine Rechnung auf irgendeiner Touring-Maschine,
da würde man jetzt sagen, man hat fünf Zeiteinheiten benötigt,
weil man eben fünf Konfigurationen hat in der Rechnung,
man hat vier Felder benutzt, weil man eben,
wenn man sich das hier anguckt, irgendwie, ne,
man hat die ersten beiden Felder Besuch,
hier in der zweiten Konfliktion fehlt noch das kleine B ganz hinten.
Also aus dem kleinen A wird ein großes A aus,
ein kleinen B wird ein großes B und aus dem ersten Gatter,
auf das man trifft, macht man noch ein X und geht währenddessen immer weiter nach rechts.
Und hier kann man so sehen, bei der Konfiguration,
man hat irgendwie vier Felder besucht und auch wenn man das letzte Gatter,
wenn man damit wohl nichts macht,
sondern es einfach nur wieder hinschreibt und zurückgeht,
sagt man da eben auch, okay, so,
ne, streng genommen hat man das irgendwie benutzt.
Vielleicht hat man ja gebraucht, dass es leer ist.
So, also hat man irgendwie
vier Wandzellen benutzt
Und dass man jetzt hier sagt,
dass man die Konfiguration zählt, also man sagt,
man hat fünf Konfigurationen, man hat ja nur vier Schritte gemacht.
Ob man jetzt sagt, vier Zeiteinheiten oder fünf Zeiteinheiten,
das ist irgendwie ziemlich egal.
Also ob man da jetzt noch so ein Plus minus eins
am Ende hat, das ist nicht so weiter tragisch.
Wir machen das mal so,
dass wir die Anzahl der Konfigurationen in der Rechnung zählen,
dann kann man sagen, man hat hier fünf Zeiteinheiten gebraucht.
Ja, war eben gerade noch die Frage nach der Probleminstanz
und mit den Jahren Stunts und den 9 Instanzen
Ich hatte ja gesagt, irgendwie,
die Laufzeit wird abhängt von der Größe der Probleminstanz.
Also man kriegt irgendwie eine Probleminstanz, mit der man
irgendwie arbeiten soll. Und wir hatten ja gesagt,
dass Funktionen berechnen und Sprachen akzeptieren im Grunde genommen das Gleiche ist.
Und Sprachen zu akzeptieren, ist einfacher, darüber zu argumentieren,
als über Funktionen, die berechnet werden sollen. Das heißt,
wenn wir mit üblicher Weise eben nicht sagen,
ich kriege zwei Zahlen und soll sie addieren,
sondern man wird sagen, ich kriege drei Zahlen und ich prüfe,
ob die ersten beiden, die in der Summe die dritte Zahl sind,
dann kann man eben zu der Eingabeninstanz sagen, ja oder nein.
Und wenn man jetzt hier diese Sprache hat, dass man sagt,
ich habe dieses Triebel aus drei Zahlen und das soll nur dann akzeptiert werden,
wenn X plus Y gerade Z ist,
Dann ist eben eine Probleminstanz, drei beliebige Zahlen.
Und eine Jahrinstanz ist dann eben sowas wie das hier,
wo wirklich die ersten beiden in der Summe die dritte ergeben.
Wenn man das der Touring-Maschine vorlegt,
dann würde sie irgendwie rechnen und am Ende ja sagen.
Ja, also das ist ein Beispiel für ein Triebel,
das in dieser Sprache drin ist.
Ergo ist eine Jahrinstanz und das ist ein Beispiel für ein Triebel,
das zwar auch eine Probleminstanz ist,
weil es die richtige syntaktische Struktur hat,
aber eine 9-Instanz ist,
weil eben 2 plus 3
nicht 6 ist
Genau, und sowas wie,
man kann jetzt natürlich auch irgendwie beim Sortieralgorithmus,
würde man üblicherweise sagen, naja, den als Sprache zu beschreiben,
ist ja irgendwie ein bisschen dusselig,
da kriege ich irgendwie eine Folge von Zahlen und sortiere die.
Man kann es auch als Sprache ausdrücken, indem man irgendwie sagt,
na ne, das als Sprachhaus zu drücken ist ein bisschen doof.
Man kann es machen, aber ein bisschen doof.
Technik hat sich gegen mich verschworen heute. So,
jetzt das mit der, die Länge der Rechnung halt als Zeitbedarf
der Touring-Maschine und die Anzahl der benutzten Zellen als Platzbedarf bezüglich einer Rechnung.
So, und jetzt gibt es, jetzt will man
etwas zur Laufzeit und zum Platzverbrauch der Touring-Maschine insgesamt sagen.
Und dann gibt es diese etwas kompliziert aussehende Definition.
Da sagen wir, ich nehme mir jetzt so eine Funktion T&S,
zwei Funktionen T&S, T steht für TimeS steht für Space.
Mit T will man jetzt einen Zeitschrank für die Touring-Maschine angeben.
Da gibt man eine natürliche Zahl als Argument rein und kriegt dann
eben eine reelle Zahl raus. Und die Idee ist,
dass wenn ich da jetzt beispielsweise T von 10 berechne,
dann ist das Ergebnis die Anzahl der Schritte,
die die Touring-Maschine maximal bei einer Eingabe der Länge 10 benutzen darf.
Also wenn Tee von N gleich Endquadrat ist, dann ist die Aussage eben,
dass man bei einer Eingabe der Länge 5 maximal 25 Schritte brauchen darf.
Und bei einer Eingabe der Länge 6, 36,
5 Quadrat, 6 Quadrat und so weiter,
formal aufgeschrieben sagt man hier, TVN soll größer gleich sein.
Jetzt wird das Maximum dieser Menge betrachtet. Und zwar sind
da all die Casts drin mit der Eigenschaft,
wenn ein Wort der Länge N existiert,
das von der Touring-Maschine akzeptiert wird, dann wird geguckt,
wie viele Schritte braucht M,
um dieses Wort zu akzeptieren
All die Cars werden aufgesammelt und das Größte genommen. Sprich,
wenn ich hier mit N gleich 5 reingehe,
dann gucke ich mir hier all die Wörter der Länge 5 an,
die die Touring-Maschine akzeptiert.
Gucke dann, wie lange braucht sie, um so ein Wort zu akzeptieren?
All die Zahlen nehme ich mir in eine Menge,
nehme die Größte raus. Und N muss T voll End
eben größer gleich dieser Zahl sein. Das heißt,
ihr könnt für ein Wort der Länge 5,
kann es vielleicht für ein Wort der Länge 5,
braucht die Touring-Maschine vielleicht nur zwei Schritte, um das zu akzeptieren.
Für ein anderes brauchst du vielleicht zehn Schritte und für noch
ein drittes brauchst du irgendwie 20 Schritte und dann wird 20
eben die obere Grenze, die die Touring-Maschine braucht,
um Wort der Länge 5
zu akzeptieren
Versucht man eben eine Funktion anzugeben, die immer größer gleich diese Anzahl der Schritte ist.
Platzschrank im Grunde genommen genauso, nur dass man eben nicht sagt,
akzeptiert in Karschritten, sondern akzeptiert mit Platzbedarf K.
So, und wenn man sich das jetzt anguckt,
hier mit dem Größer gleich und insbesondere dem,
dass man hier das Maximum aus dieser Menge nimmt,
dann ist das eine Worst-Case-Abschätzung.
Weil man guckt hier, dadurch,
dass ich hier das Maximum nehme,
guckt man sich an, was ist die längste Rechnung,
die auf einem Wort der Länge N existiert
Ja, das kann ja gut sein, nehmen wir mal ihr programmierten Sortieralgorithmus,
der bei ganz vielen Probleminstanzen sehr, sehr schnell ist,
außer wenn ihr die Folge bereits sortiert als Eingabe vorlegt,
dann ist der vielleicht Schnarch langsam.
Dann hätte man als Zeitschranke eben auch etwas,
was vielleicht aussieht, als wäre der Algorithmus katastrophal langsam.
In der Praxis kann es aber so sein,
dass ihr vielleicht, vielleicht ist es sogar so,
dass ihr nie als Eingabe schon eine sortierte Folge kriegt,
sondern ihr wisst immer,
ihr kriegt eine unsortierte Folge und müsst sie sortieren.
Dann ist der Algorithmus eigentlich viel schneller,
als es diese Worst-Case-Abschätzung zunächst angibt.
Dafür gibt es dann auch so Average-Case-Abschätzungen und sowas,
das ist aber sehr viel komplizierter.
Und mit den Worst-Case-Abschätzungen kann man erstmal gut arbeiten und das
gibt auch erstmal eine gute Intuition für etliche Algorithmen so
Nur, dass er das mal so im Hinterkopf behaltet,
dass das eine Worst-Case-Abschätzung ist. Steht auch noch auf der
nächsten Folie, genau. Man bezeichnet das als Worst-Case-Komplexität,
da man alle Eingaben der Länge N betrachtet und
Tee von N eben mindestens so groß sein muss,
wie der Zeitbedarf im schlimmsten Fall.
Und dann noch als zwei Anmerkungen. Platzbedarf war die Anzahl
der Zellen, die die Touring-Maschine benutzt.
Ja, man führt das,
also die Frage ist gerade nach mehreren Bändern,
man führt das erstmal nur für eine Einbandtouring-Maschine ein,
dass man dann diese ganzen Transformationen machen kann,
da müsste man sich dann im Detail angucken,
wie lange, welche Komplexität die Transformation haben.
Hier war ja gesagt, das sollen Funktionen von N nach R sein.
Jetzt macht es natürlich eigentlich wenig Sinn, hier zu sagen,
irgendwie, die Touring-Maschine braucht maximal 3,3 Schritte,
weil irgendwie entweder brauchst du die 3 oder diese braucht 4,
aber sie braucht bestimmt nicht 3,3 oder so.
Man nimmt trotzdem hier eine Funktion von N nach R,
damit man eben solche Sachen haben kann,
wie als Funktion für TVNN-Endquadrat plus N halbe.
Da kommen auch ab und an mal krumme Werte raus,
macht aber nichts,
rundet man dann immer ab
Und dann ist das auch okay. Aber deswegen nimmt man
eben Abbildung auf die reellen Zahlen, damit man eben
ein bisschen mehr Freiheit hat bei der Wahl der Funktionen.
Und außerdem hat man oft auch solche Funktionen hier,
die erst ab einem bestimmten Wert eigentlich einen sinnvollen Wert liefern.
Und das ist aber auch okay, da sagt man dann,
okay, ich ignoriere Anfangswerte. Also für 1,
2, 3, 4, also Wörter der Länge 1,
2, 3 und 4 kann ich dann sagen,
da gibt es irgendwelche Konstanten.
Das ist mir dann erstmal nicht so wichtig und dann wichtig ist,
wie sich das nachher verhält bei größeren Werten.
Genau, das so als Anmerkung für später
Da nochmal als Beispiel, was sowas jetzt bedeuten soll. Wenn ich also das,
wenn ich sage, ich habe eine Touring-Maschine,
die mit dieser Funktion zeitbeschränkt ist, dann weiß ich,
bei einem Wort der Länge 10 hat die maximal 95 Schritte beim Wort der Länge 3 maximal.
Und jetzt kommt hier eben irgendwas Krummes raus,
rundet man ab und dann weiß man, okay, maximal sieben Schritte.
Das ist eine Zeitschranke und für eine Platzschranke gehen aus.
Da würde man dann sein, wenn das auch jetzt die Platzschranke wäre,
dann hätte man eben, wenn ich ein Wort der Länge 10 vorlege,
weiß ich, ich benutze maximal 95 Bandzelten.
Das ist die Idee. Jetzt kann man das auch für die NTM machen,
für die NTM wird es aber ein bisschen schwieriger,
weil die Erstens ja so einen größeren,
nicht die terministischen Verzweigungsbaum bei der Rechnung haben muss, kann.
Das heißt, da muss man erstmal irgendwie auswählen.
Wenn ich also eine NTM habe, dann halte ich jetzt
eine Erfolgsrechnung fest und da definiere ich mir das erstmal genauso wie bei Laditär.
Da sage ich, bei einer fest vorgegebenen Erfolgsrechnung,
da braucht ihr eben so viel Zeit wie in der Rechnung
einzelne Konfigurationen durchlaufen werden und so viel Platz wie maximal Felder besucht werden.
Also genauso wie wir das auch bei der DTM gemacht haben.
Aber hier haben wir jetzt eine Erfolgsrechnung festgehalten. Jetzt muss man sich überlegen,
wenn ich jetzt so ähnlich wie eben auch sagen will,
gegeben ein Wort der und der Länge,
dann kann die ja mehrere Erfolgsrechnungen haben,
welche wähle ich jetzt aus, sage,
definiere ich mir jetzt die Komplexität über die längste Erfolgsrechnung oder über die kürzeste oder sowas.
Und das macht man so, dass man immer
die kürzeste nimmt
Dass man sagt, eine NTM akzeptiert ein Wort mit der Zeitbeschränkung Tee,
wenn die kürzeste Erfolgsrechnung eben diese Teeschritte hat,
noch aufgerundet aus dem gleichen Grund, wie eben auch.
Mit der kürzesten, das macht man deswegen,
weil man ja eh mit diesem Nicht-Determinismus ausdrücken will,
dass die NTM nicht deterministisch irgendwie raten kann, was sie tut.
Dann kann man auch sagen, dann kann sie jetzt aber auch die schönste Variante raten.
Also die, wo sie am schnellsten ist oder wo sie den wenigsten Platzbedarf hat.
Deswegen nimmt man da die kürzeste Erfolgsrechnung. Und dann kann man das genauso wieder definieren wie bei den DTMs auch,
dass man dann sagt, Sie ist TEN zeitbeschränkt genau dann,
wenn und dann wieder diese Maximumsschreibweise,
wobei man hier dann eben sagt, M akzeptiert mit Zeitbeschränkung K,
wobei einem dann bewusst sein muss, dass das eben bedeutet,
ich gucke mir die kürzeste Erfolgsrechnung an.
Und da genauso. Zeit und Platzschranken für DTMs und NTMs
. Fragen bis dahin
Meinst du, dass ihr dieses größer gleich da?
Ja. Ich habe ja meint, dass T von N bei dem,
er meint das größer gleich bei dem T von N. Okay,
und was ist die Frage?
Also die Idee ist, dass du, du willst
eine Funktion haben, wo du eine Zahl reinstecken kannst.
T von 5 kannst du berechnen und dann soll er als Ergebnis rauskommen,
wie viele Schritte die Touring-Maschine maximal braucht beim Wort der Länge
Und wenn du TV und 10 berechnest, eben wie lange
sie maximal braucht beim Wort der Länge 10 und so weiter.
Die Idee ist, dass du nachher eine Funktion hast,
wo du sagen kannst, nimm mal an wieder,
du hast einen Sortieralgorithmus und du weißt dann,
wenn ich fünf Zahlen sortieren will,
brauche ich maximal so und so viele Schritte,
wenn ich zehn Zahlen sortieren will,
brauche ich maximal so und so viele Schritte und so weiter.
Mit diesem Max und so, das führt dazu,
dass man über das Case Abschätzung hat. Das kann ja,
und ist ja auch meistens so, dass es,
je nachdem, wie die Zahlen gerade angeordnet sind,
kann es unterschiedlich lange dauern, sie zu sortieren.
Die meisten Sortieralgorithmen, wenn du den zehn Zahlen vorlegst,
die bereits sortiert sind, dann brauchen die meisten nur zehn Schritte,
weil sie dann einmal rübergehen und sagen,
oh ja,
schon sortiert,
Und wenn er nur ein Pärchen gedreht ist,
dann geht es vielleicht schneller,
als wenn da ganz viele Pärchen gedreht sind oder so.
Und hier wird quasi rausgefischt dann aus allen Folgen einer bestimmten Länge N.
Wie lange braucht man? Wie lange braucht die Touring-Maschine?
Von diesen Laufzeiten nimmst du dir die längste Zahl.
Und das T von N muss eben größer gleich sein.
Und üblicherweise versucht man das T von N natürlich möglichst dicht
an dieser eigentlichen Zahl zu haben.
Aber du könntest zum Beispiel sowas haben wie Tee von N
gleich Endquadrat als Laufzeitbeschränkung für einen Sortieralgorithmus
Und jetzt kann es sein,
dass man als Beispiel ab Folgen der Länge 10,
also so 10, 11, 12, 13, 14,
15, da ist man vielleicht tatsächlich immer sehr dicht an diesem Endquadrat dran.
Und vorher ist es vielleicht so,
weil das so ganz kleine Folgen nur sind,
dass es da viel schneller geht, dass man dann da sagen würde,
okay, eigentlich passt hier Endquadrat nicht so gut.
Aber es ist egal, weil danach passt es gut.
Dass die eigentliche Laufzeit, also wenn man das jetzt als Graf aufmalen würde,
dass die eigentlich lauft, vielleicht irgendwie so aussieht.
Und dann hat man das immer durch so eine Funktion so schön abgebildet,
dass man sagt, ja, okay,
diese eigentliche ist da hübsch drunter, das passt ganz gut.
Sehen wir auch gleich nochmal, wenn die U-Notation gleich kommt
Genau, das war für DTM und bei der NTM muss man dann eben überlegen,
dass man hier bei dieser Akzeptanz eben die kürzeste Erfolgsrechnung nimmt.
Aber das ist nur so vom Gimmick. Sonst noch Fragen. Dann,
ja, etwas, es gibt,
man kann sich jetzt so Speed-Up und Kompressionstheorie mal ansehen,
die brauchen wir nachher einmal, damit man Komplexitätsklassen gut definieren kann,
damit ihr das einmal seht hier.
Wenn ich eine SN-Platzbeschränkte Touring-Maschine habe,
also ich habe jetzt eine Touring-Maschine,
die ist durch irgendeine Funktion S-Platz beschränkt
Ich weiß also, ne, bei einer Eingabe der Länge
acht brauche ich eben maximal S von acht viele Zellen.
So. Und jetzt wird gesagt, dann gibt es zu jeder
reellen Zahl C, eine äquivalente, zehnmal SN-Platzbeschränkte Touring-Maschine. Ja,
für Werte größer als eins ist das irgendwie ein bisschen Lumpitz,
weil wenn ich irgendwie eine SN-Platzbeschränkte Touring-Maschine habe,
dann gibt es natürlich eine,
die doppelt so viel Platz braucht oder viermal so viel,
das ist jetzt kein großes Kunststück.
Es ist spannend für Zahlen, die größer sind als null
und kleiner als eins. Dann ist die Aussage dann nämlich,
dass wenn ich eine SN-Platzbeschränkte Touring-Maschine habe,
dann kann ich auch eine konstruieren,
die mit halb so viel Platz auskommt oder mit einem Viertel
so viel Platz oder mit einem Achtel
so viel Platz
Bandkompression. Warum heißt das Bandkompression? Weil die Idee ist,
wenn man das beweisen will,
wenn ich so eine SN-Platz beschränkte Touring-Maschine habe und ich will jetzt eine konstruieren,
die nur halb so viele Bandzellen benutzt,
dann mache ich so Geschichten wie aus zwei Symbolen der einen Touring-Maschine
ein Symbol der neuen Touring-Maschine zu machen.
Dann kann sie quasi mal zwei Schritte auf einmal machen,
also zwei Zellen auf einmal betrachten.
Und man sieht hier auch dieses C, das ist eine Konstante.
Da steht nicht sowas wie,
dass es irgendwie eine andere Funktion F gibt,
sodass die dann F von N mal S von Endplatz beschränkt ist.
Sondern es geht nur mit Konstanten. Da wird irgendwie gesagt,
ich kann das einen halben Drittel, ein Viertel, ein Fünftel machen.
Die Idee ist dann, ich lese dann halt zwei,
drei, vier, fünf, sechs Zellen auf einmal.
Aber ich kann das nicht so völlig beliebig machen.
Das geht nur mit so einem linearen Faktor
Aber wenn ich Bandkompressionen machen kann, dann kann man sich
schon überlegen, dann kann ich wahrscheinlich auch schneller werden,
indem ich quasi mehrere Schritte auf einmal mache.
Und das ist die Aussage hier, diesen Impfkram könnt ihr
mal kurz ignorieren. Hier steht es zu jeder TN-zeitbeschränkten Touring-Maschine,
gibt es eine äquivalente C-Mal-T-N-zeitbeschränkte Touring-Maschine. Und auch da,
die Aussage ist, wenn ich eine habe,
die TN-Zeit beschränkt ist, dann kann ich auch eine basteln,
die doppelt so schnell ist, viermal, so schnell,
achtmal, so schnell.
Und das, was hier noch steht,
und da fehlt auch noch was, da muss noch,
ist gleich unendlich stehen. Was hier noch steht,
ist, dass das T von N,
man nennt es asymptotisch,
asymptotisch,
größer wachsen muss
als die Zahl
Oder als die Funktion enden. Also sie muss besser sein als linear,
die muss irgendwie sowas sein wie Endquadrat oder N mal Log-in oder irgendwie sowas.
Das hat damit zu tun, dass wenn man für Tee von End,
Tee von End gleich End zulassen würde,
dann wäre die Aussage hier, dass eine linear zeitbeschränkte Thuring-Maschine,
also eine, die Endschritte braucht,
dass ich die ersetzen kann durch eine,
die nur halb so viele Schritte braucht, also ein halb mal N.
Und das wird nicht so richtig geil funktionieren,
weil ich ja meistens Thuring-Maschine habe, die sich durchaus mal
die ganze Eingabe angucken müssen oder das könnte die anderen dann plötzlich nicht mehr.
Das wird nicht funktionieren. Wem das gerade zu schnell,
weil das ist nicht so ganz der Teil,
hier ist nicht so wichtig, da ist nur wichtig,
dass es halt Beim Linie ein Steet-up erst ab bestimmten Zeitschranken funktioniert.
Was ihr euch merken solltet, ist,
wenn ihr eine Zeit beschränkte oder platzbeschränkte Touring-Maschine habt,
dann könnt ihr eine basteln,
die mit einem linearen Faktor schneller ist oder mit einem linearen Faktor weniger Platz braucht.
Das solltet ihr euch merken. Nochmal,
wir können es jeder für immer stehen,
die und ab da
Die Frage war gerade, wir könnten zu jeder Touring-Maschine,
die irgendwie so und so viel Platz braucht,
eine bauen, die nur eine Zelle braucht.
Das können wir nicht. Weil dafür bräuchte ich hier,
das war das, was ich vorhin gemeint habe,
dafür bräuchte ich hier die Möglichkeit,
nicht eine Konstante hinzuschreiben, sondern eine Funktion.
Und die Möglichkeit habe ich nicht. Du bräuchtest dann nämlich
für jedes S von Ende ein anderes C. Und das kriegst
du nicht. Also um immer auf eine Bandzelle zu kommen
. Ja. Und wenn du, gib mir mal irgendeinen,
also ich nehme als S von N nehme,
ich esse von N gleich ein Quadrat.
Ja? Er ist von NSN Quadrat
Wie willst du jetzt ein C wählen?
Da kann ich immer für Ende irgendeine Zahl einsetzen,
sodass das unglaublich viel größer ist als sein C und
dann kommt er eben nicht mehr eins raus.
Weil das Endquadrat wird ja noch berechnet. Du kannst das Zeher
nur einmal wählen. Während ich mein Endbeliebig aufwählen kann.
Klar oder nicht? Ja, gut. Dann ja.
Die Frage war gerade, ob es nicht sein kann,
dass es von Ende nach oben beschränkt ist,
dann könnte man das C so wählen, sodass das immer kleiner eins.
Ja, okay, kleiner, ja, okay, also da,
ne, ja, das ist wieder so ein Spezialfall,
das muss ja nach oben wieder aufgerundet werden dann.
Also eigentlich könnte man hier dann vielleicht hinschreiben, zehnmal SN nach oben aufrunden,
damit du auf jeden Fall immer einen Platz brauchst oder irgendwie sowas.
Genau. Genau, wie gesagt, also das,
was ihr da merken solltet, dass wir jetzt gerade ein bisschen sehr detailliert,
dass wir euch das, was ihr euch da merken solltet,
ist gegeben so eine Platz- oder zeitbeschränkte Touring-Maschine,
lineare Faktoren vorne wechseln quasi egal.
Das wird gleich beim Betrachten von Algorithmen nochmal wichtig.
So, jetzt Jetzt kann man diese schicken Komplexitätsklassen einführen.
Jetzt kann man sagen, ich betrachte für irgendwie eine Zeitschranke,
Telefonende und eine Platzschranke S von N,
betrachte ich jetzt die Komplexitätsklasse D-Time, T von N.
Da sollen all die Sprachen drin sein,
die von der Touring-Maschine mit so einer TN-Zeitschranke akzeptiert werden können.
Das DEF steht immer für deterministisch, das N steht für nicht deterministisch.
Und in Endtime-Tee von N tue ich all die Sprachen rein,
die von der TN-Zeit beschränkten,
nicht die terministischen Touring-Maschine akzeptiert werden können,
genauso bei D-Space und Endspace
Dann hat man also so ähnlich, wie wir vorher sowas definiert haben,
wie die regulären Sprachen, die kontextfreien Sport oder die Sprachfamilie der regulären Sprachen,
die Sprachfamilie der kontextfreien Sprachen und so weiter,
hat mir jetzt eine Sprachfamilie definiert, eben über Komplexitätsmaße.
Und die da sind sehr generell, das,
was jetzt spannend ist, ist,
sich die Klassen hier anzugucken, PNPP-Space und NP-Space,
wo man sagt, NP sollen all die Probleme drin sein,
für die es eine polinuiell zeitbeschränkte Touring-Maschine gibt, deterministische Touring-Maschine,
in NP sollen all die Sprachen drin sein,
für die es eine polinumiell zeitbeschränkte,
nicht die terministische Touring-Maschine gibt und im P-Space und NP-Space
das Gleiche für Platschranken
Das heißt, hier NP, da werden all die Probleme
drin sein, die ich mit polemiellen Zeitaufwand lösen kann.
Also wo ich irgendwie so einen Zeitschrank habe wie,
oh, VN, N-Quadrat, N hoch 3 und sowas.
Die Klassen werden nachher noch ganz wichtig. Und jetzt,
das ist die eine Stelle, wo wir die Speedup und Kompressionssätze brauchen,
wegen den Dingern gilt eben, dass P im Grunde genommen das Gleiche ist,
wie die Vereinigung über all diese De-Time-Geschichten, N-hoch 1,
N-hoch 2, N hoch 3,
N-O-4 und so weiter.
Da kann man die benutzen. Das heißt, man muss
da nicht noch vereinigen irgendwie De-Time von Endquadrat plus N
oder irgendwie sowas, oder das erfasst man dann alles durch
diese Speedupsätze mit
Genau, so und dann gilt,
können die schon mal in Relation zueinander setzen,
dann wissen wir schon mal diese Timing-Beziehungen gelten,
weil relativ einfach ich den Nicht-Determinismus nicht benutzen muss.
Also NP ist eine, oder P ist eine Teilmenge von NP,
weil die nicht die terministischen Touring-Maschinen eben ihren Nicht-Determinismus
nicht ausnutzen müssen.
Fragen bis dahin.
Mit dem was
Das ist ja das mathematische P versus NP. Dann ist
die Antwort ja. Wenn du mit dem mathematischen das Millennium-Problem meinst,
dann ja. Das ist genau das Millennium-Problem nachher.
Oder einzelne Lädenprobleme. Genau. So, und jetzt,
jetzt waren wir ja die ganze Zeit bei diesen Touring-Maschinen,
jetzt brauchen wir irgendwie die Brücke zu den eigentlichen Rechnermodellen
oder zu den eigentlichen Computern
Und was man eben machen kann, ist,
man kann halt zeigen oder irgendwie argumentieren,
begründen, dass ein Computer eine Touring-Maschine simulieren kann.
Das ist relativ einfach. Und dass eine Touring-Maschine auch
ein Computer simulieren kann. Dafür nimmt man sich halt irgendwie
so eine Frau Neumann-Architektur oder irgendwie sowas und argumentiert eben,
dass die Touring-Maschine das prinzipiell alles simulieren kann.
Kann sie tatsächlich, wenn sich das mal angucken möchte,
in dem Buch von Hauptcraft Ullmann, da ist so ein bisschen argumentiert,
wie man das machen würde.
Und das, was spannend daran ist, ist,
dass das mit pulinumiell mehr Aufwand geht.
Genau. Also, das hatten wir hier für die Unentscheidbarkeitsresultate.
Da hatten wir das ja schon kurz angesprochen.
Und dann gab es eben diese Church-Touring-These, gesagt hat,
alle Rechnermodelle, die quasi so mächtig sind wie eine Touring-Maschine
und damit auch wie unser eigentlicher Computer,
die sind alle irgendwie Äquivalenz zueinander.
Das ist die George-Touring-These. Deswegen reicht es immer,
sich ein Modell anzugucken, um Aussagen zu Entscheidbarkeit und Unentscheidbarkeit zu machen.
Die erweiterte Church-Touring-These, die da, die sagt jetzt,
dass alle diese Modelle im Polyumialzeit ineinander umgewandelt werden können.
Also wenn ich einen Computer habe, dann kann ich mit
nur polymären Mehraufwand das mit Naturing-Maschine machen.
Das ist so wichtig, das kommt jetzt in großen roten Boxen.
George-Touring-These nochmal, alle hinreichend mächtigen Berechnungsmodelle sind äquivalent
Erweiterte Church-Touring-These, wenn ich zwei Rechnermodelle habe,
zwei Touring-äquivalente Rechnermodelle, dann gibt es ein Polynom,
sodass ich eben Tee-Rechenschritte des einen Modells,
bei der Eingabe der Länge N,
durch P von Tee von den Rechenschritten von B2 simulieren kann.
Das Polynom wird natürlich, wenn man jetzt irgendwie einen heutigen Rechner
mit Naturing-Maschine simulieren will, dann wird das Polynom relativ groß.
Aber so von der Idee her weiß man eben,
okay, das geht tatsächlich mit einem Polynom.
Deswegen ist diese Komplexitätsklasse P so bedeutsam. Genau so.
Da nochmal Da hat sie diese besondere Bedeutung,
weil quasi in P, all das drin ist,
was sich mit all diesen Maschinenmodellen eben mit polemiellen Zeitaufwand berechnen kann.
Das heißt, wenn ich weiß,
ich kann ein Problem mit einer Turing-Maschine, mit einem Polynom lösen,
dann kann ich das auch auf einem normalen Rechner mit einem Polynom lösen.
Wenn ich weiß, auf einem normalen Rechner kann ich irgendwas mit
einem polymiellen Zeitaufwand lösen, kann ich es auch auf der Turing-Maschine machen.
Und das andere, weswegen das so wichtig ist, ist,
weil in dieser Komplexitätsklasse P, die Probleme drin liegen oder anders ausgedrückt,
wenn ein Problem in P liegt, dann sagen wir im Allgemeinen,
okay, das lässt sich effizient lösen.
Wenn ein Problem nicht mehr in P ist,
sondern irgendwie weit darüber hinaus in seinem Büro,
das lässt sich nicht mehr
so effizient lösen
Warum ist das so? Warum das nochmal so ist,
nochmal kurz am Zahlenbeispiel illustriert. Die Idee ist halt,
oder die Begründung ist, dass wenn man etwas im Polymialzeit lösen kann,
wenn es also irgendwie ein Polynom als Zeitschranke gibt,
dann wächst das quasi mit der Problemgröße in vertretbarem Aufwand.
Wenn ich so ein Polynom habe wie Endquadrat,
dann brauche ich halt für Problemgrößen der Länge 10 brauche ich
100 Schritte und für Problemgrößen der Länge 50 brauche ich 2.500 Schritte,
da sagt man doch, ja okay,
das wächst irgendwie ganz okay mit der mit der Länge der Eingabe oder mit der Länge der Probleminstanz.
Während wenn ihr sowas hier habt, so eine Exponentialfunktion,
so zwei hoch enden, dann wächst das irgendwie nicht mehr vertretbar,
wie man das hier so schön sehen kann.
Da würde man sagen, naja,
bei einer Eingabe der Länge 10, das ist noch okay,
aber hier irgendwie eine Billiarde viele Schritte zu brauchen,
das ist dann vielleicht irgendwann nicht mehr okay.
Und das wächst ja relativ schnell, weil man hier jetzt 2 hoch 60,
2 hoch 70, 2.80 Uhr hinschreibt,
dann wird das katastrophal groß und ist irgendwann nicht mehr praktikabel.
Während eben bei Polynomen das okay ist. Also jetzt bei
so Ungetümen wie irgendwie N hoch 1000 oder so,
dass das dann auch schon irgendwie nicht mehr so richtig okay,
aber für die meisten Probleme,
für die man irgendwie einen Algorithmus in Key finden kann,
findet man üblicherweise auch einen mit einem kleinen Polynom.
Also wir kennen eigentlich kaum, kaum natürliche Probleme,
man kann natürlich irgendwie theoretische Probleme konstruieren, die aber keine Sau braucht,
weil wir kennen kaum natürliche Probleme, bei denen das Polynom,
um es zu lösen, wirklich groß ist.
Also ich kann so ähnlich wie bei einem Diagonalisierungsbeweis,
wer sich da dran noch erinnert,
mit dem solchen Techniken kann ich auch Sprachen konstruieren,
wo ich dann weiß, naja, das geht irgendwie nicht schneller als mit dem und dem Polynom.
Aber wenn man jetzt so ein natürliches Problem hat,
sowas wie Zahlen zu sortieren, eine Wortfolge zu suchen,
irgendwie sowas, was einem wirklich interessiert,
Selbst wenn man dann manchmal anfänglich ein großes Polynom hat,
lässt sich das Polynom meistens drastisch reduzieren nachher.
Bekanntestes Beispiel, das ist sowas wie Primzahltests,
wo lange Zeit nicht klar war, ob das in P geht.
Dann haben das die drei Jungs aus Indien gelöst und hatten
am Anfang ein relativ großes Polynom.
Ich glaube, sowas N hoch 10 oder so.
Und dann wurde das halt kontinuierlich immer weiter gedrückt,
bis das irgendwie bei NO5 oder NO4 oder so war.
Ja, da wird es ja langsam praktikabel. Genauer. Gut,
das zur Motivation von P. Das wird spätestens in der
Algorithmen- und Datenstrukturvorlesung nächstes Semester,
wird das deutlich,
warum P so
eine herausragende Bedeutung hat
Ihr dürft ihr mir das einmal glauben, dass das irgendwie,
dass da die spannenden Probleme drin liegen.
Und NP machen wir später. So, genau, das merken wir uns.
Polynome sind wichtig. Und was jetzt noch kommt,
oben steht schon Landau-Notation. Ein kleiner Exkurs in das,
was sie nachher in Algorithmik nochmal deutlich und doll haben werdet.
Wir brauchen eigentlich nur einen kleinen Teil davon,
aber dass ihr das schon mal gesehen habt.
Das Ziel jetzt ist, wir wissen jetzt,
Polynome sind wichtig und wir möchten jetzt gerne eine Notation haben,
mit denen wir relativ schnell etwas über die Laufzeit eines Algorithmuses sagen können.
Wenn man so einen Algorithmus irgendwie im Detail angucken und
da kommt dann irgendwie so ein Ungetüm raus für die Laufzeit
So zehnmal, er hoch drei plus zwei im Endquadrat und so,
dann ist uns das irgendwie zu umständlich,
das immer auszurechnen, ist auch irgendwie doof.
Wir wollen so einen intuitiveren Begriff haben.
Und im Grunde genommen verhalten sich die beiden Polynome hier,
mit einer bestimmten Brille betrachtet, ziemlich ähnlich.
Wenn ich da große Werte einsetze,
dann ist dieser ganze Endquadrat und Ende und sowas,
die sind alle gar nicht so wichtig.
Also das heißt, das, wodurch das Polynom charakterisiert wird,
ist eigentlich hier dieser größte, der größte Summe,
also der Summant mit dem größten Exponenten.
Und da will man quasi hin mit dieser Landernotation,
dass man nachher einen schnellen Begriff hat,
um sagen zu können,
oh,
der Algorithmus verhält sich so wie diese Nhoch-3-Funktion
Und dafür führt man jetzt diese Landauennostation ein. Und einmal am Algorithmus illustriert,
war einem Algorithmus illustriert, warum das so praktisch ist.
Wenn man so eine lineare Suche hat,
also man hat einen Array von Strings,
man geht die alle durch und man guckt,
ob da irgendwie die Zeichenkette Max Mustermann dabei ist.
Jetzt kann man sich das angucken und kann sich überlegen,
naja, wie viele Schritte braucht der Algorithmus?
Die Laufzeit des Algorithmus, also die Anzahl der Schritte,
die wird durch den Schleifenrumpf charakterisiert
Also in dem Beispiel zumindest, weil das im Schleifenrumpf,
das ist das, was ziemlich oft ausgeführt wird.
Das ist also der spannende Teil. Jetzt würde man sagen,
naja, diese zweite Zeile, die wird im Worst Case,
also Worst Case tritt eigentlich ein,
wenn Max Mustermann gar nicht in dem Array drin ist.
Im Worst Case wird die N mal ausgeführt oder in
plus eins mal. Und dann möchte man sagen können,
diese Funktion verhält sich eigentlich so wie N. Ich brauche,
wenn ich ein Array reingebe, dass die Länge 1000 hat,
dann brauche ich ungefähr 1000 Schritte.
Wenn ich in Array reingebe, dass 5000 Elemente hat,
dann brauche ich im Worst Case 5000 Schritte und so weiter.
Das möchte ich eigentlich sagen
Was eigentlich passiert,
was jetzt aber auch noch von der Programmiersprache abhängt, ist,
dass ich auch endmal in diese Vorschleife hier oben reingehe,
dass ich da unter Umständen endviele Additionen habe,
weil ich den Zähler I immer weiter addiere, dass ich endmal gucke,
ob der Zähler jetzt schon bei N angekommen ist,
dass ich dann N mal hier diesen Vergleich habe,
dass ich da Entsprungbefehle habe bei dem Zen Elz und sowas,
dass ich irgendwann mal dieses Return vielleicht ausführe oder da unten noch und so was.
Also eigentlich habe ich viel mehr als Endschritte. Aber nur
mit einer konstanten vorne. Ich habe halt nicht Endschritte,
sondern ich habe sowas wie fünfmal N oder sechsmal in Schritte
oder sowas wie sechsmal in plus zwei Schritte oder irgendwie sowas.
Und mit dem Beispiel von eben, Das wird quasi dominiert und am besten beschrieben,
indem man einfach sagt, ja, es verhält sich wie N.
Damit man aber sehen kann, dass es, damit man
sehen kann, dass man da quasi etwas verschluckt hat.
Es gibt ja doch einen Unterschied zwischen sechsmal N und N,
führt man diese Ohnnotationen ein und sagt dann eben,
das verhält sich nicht einfach wie N,
sondern wie O von N und in dem O von N
steckt dann eben die versteckte konstante C drin.
Ich glaube, jetzt kommt die Folie mit der formalen Definition,
naja, noch nicht.
Genau, wir wollen diese konstanten Faktoren ignorieren.
Das hilft uns, uns auf das Wesentliche zu konzentrieren,
abstriert von verschiedenen Rechenarchiteuren und auch von verschiedenen Programmiersprachen
Und ist ziemlich praxisbewährt, so Algorithmen zu vergleichen.
Also wenn man irgendwie zwei Sortieralgorithmen hat, Bubble Sword und Merch Sword,
dann kann man ja relativ schnell sagen, hey
Bubble Sword läuft ein O von Endquadrat, Merch Sword läuft
ein O von Endma Login, Merch Sword ist cooler.
Wenn man tiefer reingeht, dann guckt man sich vielleicht noch an,
welche Konstanten werden da wirklich versteckt,
ist das wirklich für bestimmte Anwendungen immer besser und so weiter.
Wie gesagt, das kriegt ja eine Algorithmik,
aber so als ersten, als ersten Vergleich ist das ziemlich gut,
das mit der U-Notation zu machen. Außerdem kann man,
außerdem kann man anfängliche Schwankungen ignorieren, das waren diese Geschichten mit,
wenn dann noch so ein Plus oder Minus irgendwie steht,
Aber, dass sie das mitnimmt,
die beiden Funktionen werden dann eben als im Prinzip gleich angesehen,
was sie natürlich nicht sind.
Aber im Vergleich zu Endquadrat sind die beide cooler.
Also wenn es mir, wie gesagt, darum geht,
Laufzeiten zu vergleichen und ich habe einen Algorithmus,
der läuft in fünfmal N und einen Algorithmus,
der läuft dann 5000 mal N,
dann ist der eine natürlich noch irgendwie besser als der andere.
Sie sind aber beide besser als Endquadrat, zumindest wenn man davon ausgeht,
dass sich da beliebig große Sachen reintun kann.
Weil irgendwann geht Endquadrat tierisch ab. Jetzt kommt die
formale Definition von der U-Notation.
Oben stehen die drei wichtigen, da drunter stehen die nicht
ganz so wichtigen, die braucht ihr nicht so dringend.
Die oben kann man ganz gut benutzen. Die Aussage ist,
in dem Groß-O von G,
da sollen all die Funktionen Klein-F drin sein, mit der Eigenschaft,
jetzt ignorieren wir mal das C für den Anfang,
mit der Eigenschaft, dass ab einem bestimmten Startpunkt N0,
Ist F-Volent dann immer kleiner, gleich G von Enden.
Also in O-Fongee sollen all die Funktionen äfteren sein,
die von anfänglichen Schwankungen mal abgesehen,
deswegen geht das erst ab dem Ende 0 los.
Wenn man sich jetzt die Grafen anguckt, ab so einem N-0,
da liegt das F immer unter dem G. Das sind die Funktionen,
die in dem O-Fongee drin sein sollen.
Und dieses C, das dient nur dazu, dass man
quasi das G auch noch ein bisschen nach oben und unten verschieben kann.
Das ist aber wieder so ein konstanter Faktor, der würde,
wenn die sich doll durch sowas wie Endquadrat im Vergleich zu Ende und so unterscheiden,
da hilft der konstante Faktor wieder nicht.
Das hilft also nur so weit verschieben
Führt dazu, dass man nachher sagen kann, dass die Funktion dreimal enden,
dass die eben trotzdem in O von N drin ist.
Dafür ist dieser konstante Faktor da. Omega von G von N,
da sind all die Funktionen Äfteren, die eben ab
einem bestimmten Startpunkt N0 über dem G von N liegen.
Und in Tee davon gehe von N,
das sieht ja ein bisschen krüder aus,
da sind quasi all die Funktionen drin,
die sich gleich verhalten, wie das G von N.
Man kann das G so schieben, dass es da drunter liegt und
man kann das G so schieben, dass es da drüber liegt.
Und das F läuft dann in der Mitte.
Die anderen dürfte ignorieren, aber die drei da oben,
die kann man mitnehmen. Also in mal zusammengefasst,
ein Großofen-Geh von Ende sind all die Funktionen drin,
die untergeh sind. In Täterfongeh sind all die Funktionen drin,
die übergeh sind, in Omega-Fongeh sind all die Funktionen drin,
die übergeh sind und in Täter all die, die sich gleich verhalten.
Und dieses Über-unter- und Gleichverhalten immer bezüglich darauf,
dass das erst ab einem bestimmten Startpunkt N0 gelten soll.
Und dass man eben mit dem C das Gehen noch ein bisschen verschieben darf.
Ja. Nee, C ist eine Konstante,
C ist aus Applus.
Also C ist einfach
irgendeine Konstante
Das dient nur dazu,
dass man die Funktion G noch,
also wenn du dir einen Grafen vorstellst und da liegt jetzt irgendwie diese Funktion G,
dann kannst du die mit dem C quasi einfach ein bisschen nach oben verschieben.
Das ändert aber quasi nichts an der Form
in Anführungsstrichen von diesem Grafen
Also die Idee ist, die Idee ist,
wenn man jetzt so eine Funktion G hat,
die verläuft da jetzt irgendwie so und man hat jetzt eine Funktion F,
die vielleicht am Anfang hier mal so doll drüber geht oder so,
aber danach da immer schön drunter ist so,
dann will man jetzt sagen können,
diese Funktion F hier,
FSN O von G drin,
weil hier ist dann da,
irgendwo ist das N0 und ab diesem N0
gilt das
Und damit man jetzt nicht unterscheiden muss zwischen das G irgendwie dreimal enden ist,
viermal, fünfmal, ein, sechsmal enden und so,
darf halt mal noch diese, diese Konstante C,
dass man halt eben für GN nehmen kann und dann kann
man das mit dem C noch beliebig irgendwie nach oben verschieben.
Oder eben Endquadrat oder Endhoch drei oder solche Geschichten,
dazu dient das C. Und bei dem Täter ist die Idee,
bei dem Omega,
der ist dann so aus,
dann ist FNO von G
drin,
sag mal
Er ist kleiner gleich G und er ist größer gleich H,
also F in UVD und F in Omega von H. Das ist so die Idee.
Kann das die Seite da hinten eigentlich sehen? Ja. Gut,
dann genau da nochmal so,
das sind die wichtigen Funktionen in der Algorithmenanalyse,
werdet ihr dann irgendwie in A und D auch nochmal eins,
zwei Vorlesungen im Detail haben,
wie man damit arbeitet.
Aber dass ihr
schon mal gesehen habt
Und relativ häufig hat man eben mit Polynomen zu tun.
Polynomen und Logarithmen, das ist so das, was ziemlich häufig auftritt.
Und halt Exponentialfunktionen und bei Exponentialfunktionen weiß man immer gleich,
oh, das ist ein schlechter Algorithmus, den will man lieber gar nicht benutzen.
Gut. Kurze Anmerkung noch zu diesem Logarithmus, eher zur Nachbereitung.
Hier bei dem Logarithmus nimmt man üblicherweise nicht irgendwelche Logarithmen,
sondern man nimmt speziell den zur Basis 2, beziehungsweise eine Variante davon,
hat den Vorteil, dass man dann immer weiß,
dass Logarithmus von N, wenn er eine Zahl ist,
gerade die Anzahl an Speicherstellen ist, die man benötigt,
um die Zahl N zu speichern.
Deswegen benutzt man immer
diesen speziellen Logarithmus
Aber das ist, könnt ihr euch tausendmal kurz angucken.
Beispiel, jetzt hat man dieses Täter von Geh von Ende
um nochmal in der Definition und wir wollen jetzt zeigen,
dass dieses ein Halb-End-Quadrat minus 3N in Täter von Endquadrat ist.
Und mit dem Täter sollte ja ausgedrückt werden,
dass sich die beiden Funktionen im Grunde genommen gleich verhalten.
Und wenn man dann nämlich nachher einen Algorithmus hat mit so einer Laufzeit
eineinhalb Endquadrat minus 3N, dann kann man auch einfach sagen,
ja, der verhält sich wie Täter von Endquadrat.
Da hat man relativ schnell kommuniziert,
wie sich die Laufzeit verhält von dem Algorithmus. So,
was sucht man, wenn man das hier zeigen will,
wenn man jetzt in die Definition da oben guckt,
dann sucht man halt hier
so konstanten C1 und
Sodass eben C1 mal Endquadrat kleiner gleich dem F von End
ist und C2 mal Endquadrat größer gleich.
Also sowas da sucht man. Naja, auf beiden Seiten
durch Endquadrat teilen oder überall? Überall durch Endquadrat zu teilen,
führt dazu. Und jetzt kann man eben ein bisschen überlegen,
findet man jetzt konstant ein C1 und C2 und ein N0,
sodass das immer gilt. Und hier sieht man schon,
man zieht ja von dem einen Halb immer was ab.
Also wird es bestimmt gehen, wenn ich für das C2
irgendwie einen großen Wert nehme, so eins oder zwei oder so.
Oder auch eineinhalb würde schon gehen. Und hier kann man
sich irgendwie überlegen, gibt es irgendwie ein N-0,
sodass das immer größer ist, was hier rauskommt als,
keine Ahnung, ein Viertel oder so.
Ich glaube, ich habe da ein Viertel genommen.
Ja, genau. Und ab N-0 gleich 24 weiß man eben,
das ist dann immer größer als so ein Viertel.
Und dann ist man damit fertig. Dann weiß man,
dass tatsächlich gilt, dass diese Funktion einhalb Endquadrat minus 3
N in dem Täter von Endquadrat enthalten ist.
Damit geht es schneller
Also man kann das definieren, diese,
gucken wir jetzt mal nur die oberen drei an,
F von NSNO von G von N,
wenn der Limes von F von N durchgeht,
von den Kleiners als unendlich.
Das führt nämlich dazu, dass das G größer sein muss
als das F, also asymptotisch größer.
Und hier dann, wenn der Lime ist,
wenn das größer ist als Null, dann weiß ich,
dass das F von N größer ist als das G von N.
Man kann sich das immer relativ schnell überlegen,
indem man für F und G sowas wie N- und N-Quadrat einsetzt.
Wenn man hier für FN einsetzt und für GN-Quadrat,
dann habe ich N durch N-Quadrat,
also eins durch N,
das geht gegen Null,
ist kleiner als unendlich,
also es ist F
unterhalb von
Und der dritte mit dem Täter, wenn es eben irgendwie
eine Konstante gibt, aus R Plus, sodass dieser Liebester existiert.
Darf also nicht gegen unendlich gehen. Jeder gehen plus noch
minus unendlich. Mit denen kann man das dann schneller machen,
wieder als Beispiel hier, wenn man das wieder machen will,
jetzt wollte man nur zeigen, dass es in O von Endquadrat ist,
dann muss ich also zeigen, dass dieser Quotient hier,
wenn ich den Liebes betrachte,
dass der kleiner ist als unendlich.
Und das kriegt man dann relativ schnell hin
Und dann kann man entweder gleich sehen, dass das hier,
dass ein Halbjahr eine konstante aus Air Plus ist,
dann kann man sogar gleich Schluss folgen,
dass das in Täter von Endquadrat ist, aber dann ist man damit fertig.
Fragen dazu zu diesem UNO-Schätzungskram. Das hatte ich ja schon so ein bisschen angedeutet,
hier FNU von G,
das ist eben für F. Kleine gleich GEF in Täter,
in Omega, F. Größer gleich und F in Täter gleich,
wobei dieses kleine, gleich größer, gleich gleich gleich,
das bezieht sich auf asymptotisch gleich,
also wenn man immer größere Werte einsetzt,
dann gilt das und am Anfang
darf es noch Schwankungen geben
So, Fragen dazu. Fragen, Fragen, Fragen.
Dann habe ich eine, glaube ich.
Genau, lineare Suche. Und da kann man jetzt eben
sehr schön sagen, der hat die Laufzeit O von N.
Weil man eben sagt, ja, wird bestimmt durch diese Vorschleife hier.
Ich gehe maximal N mal in diese zweite Zeile rein.
Alles andere sind irgendwie konstante Sumanten. Also ich mache das N
mal, gehe ich da rein. Und da gibt es
von mir aus vier Operationen, die ich ausführen muss.
Also bin ich in viermal N. Und dann gibt es dann noch so
ein bisschen plus plus plus, weil ich irgendwie so plus konstanten,
weil ich hier dieses Return falls noch mache oder so.
Aber so, das ist dann irgendwie ein viermal N plus
4 oder so und dann ist das in O
Oh, kann man sein. Laufzeit ist linear in der Länge
des Aris, das heißt es in O von N,
kann man sogar zeigen, dass es ein Täter von Ende ist.
Korrekt hat es noch zu zeigen, dir da relativ einfach.
Das seht ihr dann in AD mehr. Fakultät berechnen,
ich fange mit eins an, also Rest Result,
also Result ist eins und dann gehe ich die Zahlen von
eins bis Ende durch und multipliziere das immer auf.
Laufzeit? O von
Alle Operationen, alle Operationen zählen elementar, also Multiplikationen und Additionen
macht keinen Unterschied. Auf Zeit. O von. Genau,
Laufzeit ist wieder O von Ende. Ich habe eine Vorschleife
. Falle dabei. Die Laufzeit ist in O von N.
Wir wollten ja Laufzeiten, aber immer bezüglich der Eingabegröße ausdrücken.
Jetzt sieht das hier so aus, also wenn ich sage,
O von N oder wenn ich höre, O von N,
dann klingt das so, oh cool,
der Algorithmus ist schnell, der hat eine lineare Laufzeit.
Hat er hier nicht, also hier ist es ein bisschen irreführend,
weil die Eingabe eine Zahl N ist,
Und eine Zahl entlässt sich mit Logarithmisch, also Logarithmus von Encodilen.
Also die Eingabelänge ist ja nicht N, die Eingabe ist N.
Die Eingabelänge ist Log von N. Ja. Ja,
die Zahl, wenn ich als Argument die Zahl 1000 habe,
dann brauche ich zehn Bits, um die zu kodieren.
Das ist die Eingabelänge, nicht 1000, sondern 10. Das heißt,
der Algorithmus läuft zwar ein O von N,
aber die Laufzeit ist nicht linear, sondern exponentiell in der Eingabegröße.
Genau. Und darauf muss man halt immer ein bisschen achten. Das heißt,
was man üblicherweise macht, wenn man so einen Algorithmus analysieren will,
Man überlegt sich zunächst bezüglich welcher Kenngrößen man messen will.
Das darf sich ruhig von der Eingabe unterscheiden. Also beispielsweise wäre das ja okay,
eben zu sagen, der läuft in O von N,
man muss nur irgendwo dazu sagen,
dass N eben nicht die Eingabegröße ist,
sondern dass die Eingabegröße in Login ist.
Und was man halt oft macht, ist,
wenn man so Grafalgorithmen hat, dass man dann eben sagt,
ich gebe die Laufzeit des Algorithmuses anhand der Knoten oder Kanten von dem Grafen an.
Und da muss man sich halt überlegen, naja,
wenn ich einen Graf habe und ich sage irgendwie,
die Laufzeit ist in O von N, ja,
und ich kriege den Graf aber als Addizenzmatrix,
dann ist die Eingabegröße in Endquadrat
Also muss man da dann auch noch ein bisschen unterscheiden. Genau,
was man dann macht, ist, man drückt die Laufzeitspeicher,
den Speicherbedarf bezüglich der Kenngrößen aus und dann überlegt man sich eben noch,
ob das unter Umständen,
ob die Aussage das Ergebnis in Anführungsstrichen verfälscht,
so wie bei der Fakultätsberechnung eben,
also ob man quasi ein falsches, einen falschen Eindruck vermittelt.
So, das war das, Fragen.
Sonst kommen, glaube ich, jetzt Fragen von mir.
Ja, genau. Feindmaximum. Was meint ihr denn,
was der für eine Laufzeit hat
Mhm. Und das Schöne ist übrigens an diesen vorhin eingeführten Komplexitätsklassen,
wenn irgendwas davon zutrifft,
also jetzt mal abgesehen von sechstens,
wenn irgendwas von 1 bis 5 zutrifft,
dann weiß ich,
die Lauste ist also durch ein Polynom beschränkt
Und es ist im Grunde genommen egal, mit welcher aktuellen Programmiersprache
ich das mache oder auf welcher Rechnerarchitektur oder ob ich das auf einer Touring-Maschine mache.
Ich weiß dann immer, es gibt ein Polynom dafür,
diesen Algorithmus da auszuführen, also die Laufzeitbeschränkung für diesen Algorithmus und Polynom.
Und mit dieser Idee von vorhin, dass man sagt,
Polynome sind gut, genau, dann weiß man eben,
ja, cool, das geht mit einem Polynom.
In der richtigen Algorithmen-Analyse ist es natürlich so,
dass es dann schon spannend ist irgendwie,
also da nimmt man dann ein Modell,
was dichter ist an aktuellen imperativen Programmiersprachen oder sowas,
damit man dann eben wirklich sagen kann,
ob das jetzt Endquadrat ist oder N hoch 3,
für die Praxis ist es natürlich von Bedeutung
Genau, O von Ende. Also der erste Schritt da in der ersten Zeile,
eins, dann kommen N-minus eins mal, bin ich in dieser Vorschleife.
Macht da irgendwas? Also da bin ich irgendwie ein O
von N-minus eins, was das Gleiche ist wie O von N.
Und dann habe ich noch so einen Rituellen und bleibe ich
insgesamt in dem O von N. Dieses,
das dritte würde quasi auch stimmen, O von N-minus eins,
ist aber das Gleiche wie das zweite.
Und das vierte würde auch stimmen,
ist aber auch das Gleiche wie das zweite.
Also zwei, drei und vier beschreiben die gleiche Klasse von Funktion.
Fünftens beschreibt eine andere, erstens beschreibt eine andere und sechstens
Erstens ist es blöd. Erstens würde bedeuten, dass ich
genau Endschritte brauche. Das kann ich so aber nicht sagen.
Weil das sehr von den Implementierungen in der Programmiersprache abhängt.
Und fünftens ist es auch nicht,
weil so viele Schritte braucht man dann da doch nicht.
Sortieralgorithmus. Ich fange an, bestimmt das Maximum in meinem RAR.
Und in meinem Ergebnis RAB fange ich quasi von hinten an.
Das Maximum von A tue ich jetzt an die letzte Stelle,
in dem RAB.
Dann setze ich den eben bestimmten Wert in A
auf Null und bestimmt wieder
das Maximum
Das setze ich dann an die vorletzte Stelle von B,
setzen wir den A wieder auf Null,
bestimmt wieder das Maximum und so weiter.
So kann man die Maximumsfunktion ausnutzen,
um ein Arry von Zahlen
zu sortieren
Ja, also die Mehrheit sieht bei B,
oh von N sieht zunächst mal so aus, weil man irgendwie sagt,
ich gehe ja N mal in diese Schleife.
Und jetzt ist es, oder in diesen Schleifenrumpf.
Und jetzt ist es ja aber so,
dass ich bei dieser Maximumsbestimmung hier in der zweiten Zeile,
dass wir da eben gesagt haben, da brauche ich auch O von Endschritte.
Das heißt, ich gehe N mal in die zweite Zeile
und brauche da Endschritte.
Und dann brauche ich end mal eine Schritte,
also brauche ich Endquadrat
viele Schritte
Plus irgendwie, ne? Also, hier brauche ich eigentlich
Endquadrat viel. Ich bin Endquadrat oft hier irgendwie.
Hier bin ich Endmal, da bin ich Endmal,
also eigentlich ist es sowas wie Endquadrat plus zwei N oder irgendwie sowas.
Das wird aber alles erwischt durch U von Endquadrat.
Genau. Und wenn es einem, ne,
dieses hier O von 2 hoch N,
streng genommen ist das auch richtig, weil O von 2 hoch N,
also 2 hoch N liegt ja noch viel weiter da drüber.
Man will natürlich aber möglichst gute obere Schranken haben,
also man will möglichst dicht an der eigentlichen Laufzeit
dran sein und da ist halt O von Endquadrat
am besten
Oh ja. Das ist ganz einfach. Das PLNP steht
für... Punimahlzeit, wofür steht das Enden?
Die Frage ist blöd gestellt. Fällt mir gerade so ein,
naja, gut, egal. Genau, nicht deterministisch,
Eigentlich hätte da stehen müssen, dass P steht für Pudium Jahlzeit,
wofür steht das N in NP oder so?
Wenn das P in NP für Pudium Jahlzeit steht und das N für nicht polynomiell,
dann würde das ja nicht polynomiell, polymoialzeit sein.
Das wäre doof. Also nicht die Tempelistische ist richtig.
In der Komplexitätstheorie steht das N eigentlich immer, finde ich,
deterministisch. Und wenn wir da schon sind,
ist P eine Teilmenge von NP,
ist NP eine Teilmenge von P,
ist der Schnitt leer,
also dann wäre ja gar nichts irgendwie Teilmenge des anderen
oder sind die unvergleichbar
Musik Genau, erstens, ne?
P ist ein Timing von NP. Alles,
was ich in Polymialzeit mit einer deterministischen Touring-Maschine lösen kann,
kann ich ganz bestimmt auch im Polymialzeit mit einer nicht-deterministischen Touring-Maschine lösen.
Ich nutze sie nicht, die Terminismus gar nicht aus.
Andersrum, ob NP auch eine Teilmenge von P ist,
ist ungelöst, das weiß man noch nicht.
Da kommen wir morgen nochmal zu, warum das so eine
wichtige Frage ist. Und dass ihr, also drittens stimmt,
drittens stimmt auf keinen Fall, zweitens könnte stimmen.
Weiß man nicht
so genau.
Eher unwahrscheinlich
Oh ja, und da noch mal... Die beiden Fragen dienen jetzt dazu,
euch darauf vorzubereiten, warum das so wichtig ist,
das zu unterscheiden zwischen P und NP.
Also die Frage und die nächste. Suchraum durchsuchen. Also ich gucke,
ich habe eine Menge S gegeben und jetzt gucke ich mir
quasi alle Teilmengen an und gucke immer,
wenn ich jetzt eine Teilmenge rausgenommen habe,
ist die Summe der Zahlen dieser Teilmenge und die Summe der Zahlen,
die ich nicht gewählt habe,
ist das aufsummiert das Gleiche
Also, weil wenn ich als Menge S irgendwie sowas,
oder folge es vielleicht besser, ah nee, Menge,
wenn ich als Menge S1, 2, 3 habe,
dann kann ich halt in die eine Menge A1,
2 tun und die andere Menge die Zahl 3 und
dann ist das in der Summe das Gleiche.
1 plus 2 ist das Gleiche wie 3. Und wenn ich sowas habe wie 1,
4 und 9 und 10, dann geht das halt nicht.
Glaube ich. Ja. Genau, der Kniff ist halt,
also hier kann man schon sehen, um diese Summe zu berechnen,
da werde ich irgendwie O von endviele Schritte brauchen.
Die Frage ist aber da,
oben bei dem,
wie oft gehe ich da rein
Ja, genau. Die Mehrheit gewinnt wieder. Also die Cruxie ist
ja herauszufinden, wie oft gehe ich in diesen Schleifen rumpf.
Und wenn ich alle Timing von S durchgehen will,
alle Timing von S bedeutet quasi,
ich gehe die Potenzmenge von S durch und die enthält gerade zwei hochendviele Elemente,
wenn S eben N viele Elemente enthält.
Also wenn ich eine Menge mit drei Elementen habe,
dann gibt es acht Teilmengen.
Die leere Menge und die Menge selbst und dann halt die
drei einelementigen Teilmengen und die drei zwei elementigen Timing.
Das erste und das zweite, das erste und das dritte
oder das zweite und das dritte
Also, dass man da ein U von 2 hoch N
und dass man eigentlich in O von 2 hoch N mal N ist,
das N wird dann eben wieder durch das 2-O-N verschluckt.
So, und zum Abschluss, wenn ihr das nicht deterministisch
macht, wie schnell seid ihr denn dann?
Also jetzt würde man halt hier in der ersten Zeile sagen,
dieses für alle A-Teilmenge ist, dass man das versucht,
nicht deterministisch zu machen.
Und den Rest dann eben die terministisch macht
Musik Oh, knapp. Knapp, aber die Mehrheit siegt.
O von N. Warum? Ich würde den Algorithmus so umwandeln,
dass ich in der ersten Zeile sage, ich rate mir eine Teilmenge von S.
Dafür würde ich halt quasi einmal über diese Menge S rübergehen.
Und bei jedem Element sagen, entweder ich will das drin
haben oder nicht. Die, die ich drin haben will,
tue ich mir zum Beispiel ein neues Arry und die,
die ich nicht drin haben will,
tue ich mir auch ein neues Arizo, also unterschiedliche Aris.
Und dann gehe ich in der zweiten Zeile halt diese beiden
Aris durch, addiere die auf und gucke nochmal nach,
ob das das Gleiche ist
Dann brauche ich irgendwie einmal in viele Schritte, um auszuwählen,
welche meiner Menge A drin sein sollen und welche meiner Menge Quer A drin sind,
äh, es ohne A drin sein sollen.
Dann gehe ich einmal rüber,
um das halt aufzusummieren und dann bin ich fertig.
Oh, von in viele Schritte. Das ist halt schon ganz erstaunlich,
dass man irgendwie nicht deterministisch linearzeit ist und deterministisch,
zumindest mit dem Algorithmus, erstmal irgendwie exponentielle Laufzeit hat.
Also da sieht man es nochmal in den letzten beiden Zeilen.
Einmal bin ich in U von zwei hoch in und einmal
bin ich in U von N. War schon ein krasser Unterschied, ne?
Wenn N50 ist, ne, hatten wir ja vorhin,
dann bräuchte ich irgendwie 50 Schritte und da bin ich irgendwie
bei einer Milliarde
Das ist ein bisschen doof. So,
und um das hier jetzt genauer,
da geht es jetzt so in die Richtung,
sich die Klassen P und NP anzugucken, das ist ein,
der siebte war ein deterministischer Exponentialzeitalgorithmus und der sechste war nicht deterministischer Punyumialzeitalgorithmus,
das ist irgendwie ganz interessant.
Jetzt guckt man sich erstmal die Klasse P
nochmal kurz genauer an. Definiert ist das so,
es gibt ein Polynon-P und eine PN-Zeit beschränkte DTMA mit LA
gleich L. Und hier steckt ja nur Akzeptanz drin
Und was man eigentlich haben möchte, ist Entscheidung,
dass man sagt, irgendwie,
die Sprache kann von der Touring-Maschine mit diesem Polynom entschieden werden,
weil man dann eben sagen kann, naja,
sie hört auf jeden Fall nach ihr von in vielen Schritten auf.
Steht auch drunter nochmal, das, was sie bisher haben,
ist, dass es da irgendwie akzeptiert wird.
Wir möchten gerne, dass das entschieden wird.
Und das lässt sich relativ leicht mit, es lässt sich
relativ leicht zeigen, dass das das Gleiche ist.
Definiert war es, wie gesagt, darüber,
dass es einen Algorithmus gibt, der es im Polynomialzeit akzeptiert.
Man kann zeigen, dass es auch einen Algorithmus gibt,
der es im Polynomialzeit entscheidet. Wie macht man das?
Die Richtung von rechts nach links ist klar,
weil wenn ich einen Algorithmus habe, dessen Impullinialzeit entscheidet,
dann habe ich ganz bestimmt auch einen,
der es im Polynomialzeit akzeptiert
Andere Richtung, die Idee in der anderen Richtung ist,
wenn es eine Turing-Maschine gibt, die eine Sprache in Pulimialzeit akzeptiert,
dann kann ich jetzt eine basteln,
die zunächst das Polynom ausrechnet und dann diese Turing-Maschine eben genauso viele Schritte wie das Polynom sagt,
simuliert.
Und nach Ablauf dieser Schritte, wenn dann noch nicht akzeptiert ist,
wird dann auch nicht mehr akzeptiert. Weil die sichert ja zu,
dass sie nach P von in vielen Schritten akzeptiert hat.
Ergo, Jule. Also jeder auch in Pulin,
dass der in Scheiper ist
Sah ja, ein Algorithmus, der L in Zeitufel Nhochka akzeptiert.
Dann gibt es eine Konzerne Cee,
sodass A, die sprachen höchstens zehnmal in Hochkahrschritten akzeptiert.
Und wenn wir jetzt einen Algorithmus machen möchten,
der ihn entscheidet, dann berechnen wir zunächst eben dieses Polynom.
Und dann simulieren wir A, S schrittelang.
Und wenn A akzeptiert hat, akzeptieren wir auch,
hat es noch nicht akzeptiert, lehnen wir ab.
Und damit entscheiden wir die Sprache in O von Nhochka-Schritten.
Unter der Annahme, dass man das hier wirklich auch wieder
in O von Nhochka berechnen kann und so.
Kann man aber machen. Also da kommt irgendwie das Pudinum
vielleicht noch ein zweites Mal dazu oder so, aber das kann man machen. Ergo,
was ihr da mitnehmen solltet, ist,
Es gibt diese Laufzeitschranken zwar für Akzeptanz von Sprachen an,
man kann es aber relativ schnell auch so machen,
dass das Touring-Maschinen sind oder Algorithmen, die die Sprachen entscheidet,
indem man eben vorher die Zeitschranke ausrechnet oder die Platzschranke und dann eben nur so viel benutzt, wie es die Schranke einem sagt.
Das für die Nachbereitung, war nicht konstruktiv. Und jetzt als Rausschmeißer,
das ist ein typisches Beispiel für ein Problem, das MP liegt.
Wir geben Graf, ungerichtet, zwei Knoten,
S und T,
Start und Ziel
Und jetzt möchten wir gucken, gibt es einen Pfad von S nach Tee,
der höchstens Karkanten benutzt. Ergo, kürzester Pfad,
wir wollen gucken, wir wollen den kürzen Pfad von S
nach Tee bestimmen und dann vergleichen wir das mit dem K,
wenn der kürzeste Pfad mehr als Karkanten braucht,
dann gibt es keinen Pfad, der höchstens Karkanten braucht.
Das ist ein P. Habt ihr vielleicht in DM schon mal gesehen?
Weiß ich nicht, Dikes was Algorithmus oder so?
Oder in SE1, 2 so. Das ist schick,
das Licht in P, das kann man schön schnell ausrechnen.
Wenn man jetzt das Wort hier austauscht, dieses höchstens,
wenn man das höchstens durch mindestens ersetzt,
dann ist das Problem nicht mehr schnell lösbar.
Also zumindest fällt einem jetzt so direkt nichts ein,
wie man das gut lösen kann. Genau,
und das Problem ist schwierig zu lösen, zumindest effizient,
das werden wir auch nochmal zeigen, oder zeigen wir das?
Wir werden argumentieren, warum das schwierig zu lösen ist.
Aber wenn ich euch einen Pfad gebe von S nach Tee,
dann könnt ihr relativ schnell nachprüfen,
ob der jetzt mindestens Karkanten besitzt oder nicht,
zählt ja einfach die Kanten und sind fertig.
Es scheint also einen Unterschied zu geben bei dem Problem,
zwischen die Lösung auszurechnen und nur zu überprüfen,
ob es
eine Lösung gibt
Und darüber kann man, was machen wir dann morgen,
diese Klasse NP,
sehr elegant definieren und kommt dann zu recht erstaunlichen Erkenntnissen darüber,
welche Algorithmen effizient lösbar sind und welche Algorithmen wahrscheinlich nicht effizient gelöst werden können.
Wahrscheinlich, weil das alles noch nicht so ganz klar ist,
aber die Vermutungen gehen stark in die Richtung.
Ja, da nochmal die Zusammenfassung, was wir getan haben und noch machen wollen.
Wir wollten halt über Rechnung irgendwie reden, dann haben wir
die Turing-Maschine eingeführt, wollten wir über das Berechenbare reden.
Kam zu diesem Entscheidbau-Unentscheid. Wir haben schon mal gesehen,
etliche Sachen sind gar nicht entscheidbar. Und dann wollten wir
zumindest bei den Entscheidbaren nochmal sagen können, welche effizient lösbar sind.
Und da wird uns nachher, da werden wir dann feststellen,
oh, es lässt sich gar nicht alles effizient lösen.
Und da wird uns dann die sogenannte NP-Vollständigkeit eben, naja,
in unsere Schranken weisen, was wir schnell berechnen können und was nicht.
Und das Spannende ist, dass das Etliche von diesen Problemen,
die NP vollständig sind, dass die quasi überall auftreten.
Also man möchte die eigentlich alle schnell berechnen können,
kann es aber nicht. Also Vertreter sind sowas wie,
was weiß ich, Stundenplan, Planung,
also wie plane ich
einen schönen Stundenplan
Schaltplatinen verlöten, all so ein Kram,
also es wird alles, oder das möglichst effizient zu machen.
Das wird alles, sind alles MP-Vollständige-Probleme nachher. Das machen
wir morgen. Ja, ich will mir nicht erzählen,
es könnte passieren, dass ich morgen ein bisschen überziehen muss,
damit ich schon heute mal um Nachsicht.
Habt ihr jetzt noch Fragen für heute?
Nochmal? Bei dem welchem? Ja. Ich verstehe es
echt nicht
Ja. Max, die Frage war gerade nach dem Sortieralgorithmus,
warum der ein O von Endquadrat war und woher man weiß,
dass dieses Max von AO von En war.
Max war die Funktion, die wir gerade davor auf der
Aufgabe hatten und die war ja ein O von En.
Wenn man jetzt natürlich Max irgendwie viel schneller implementieren kann,
weil man vielleicht irgendwas ausnutzt,
was man über die gegebene Folge weiß,
dann stimmt die Aussage nicht.
Sonst noch Fragen? Dann denkt dran,
die Fragebögen abzugeben und guten Start in die Woche