Falls noch jemand hier sitzt und gerne Philosophie hören möchte oder
Philosophie studiert, dürfen Sie gerne bleiben.
Das ist auch super spannend hier. Ansonsten, die Vorlesung
hat man mir gerade gesagt, wo Sie vielleicht hinwollen,
ist in ESA 1. Hier ist Algorithmen und Datenstrukturen. So,
herzlich willkommen zur Vorlesung. Mein Name ist Matthias Raray.
Ich halte die Vorlesung Algorithmen und Datenstrukturen in diesem Semester.
Und ja, wir werden beginnen mit ein paar Formalien,
die wir klären müssen
Und ja, werden dann direkt einsteigen in das Thema.
Ich fange mal mit dem netten Herrn da oben rechts an.
Also auf Wunsch von ein paar Studenten,
die mir eine E-Mail geschrieben haben, am Anfang oder ja,
in der Sommerpause habe ich jetzt angestoßen, dass diese Vorlesung aufgezeichnet wird.
Er hat also, steht dann in Lecture to go.
Wir werden die zumindest in der Anfangszeit, werden die Aufnahmen
noch Passwort geschützt sein. Das hat nichts damit zu tun,
dass ich mich nicht traue, dass das öffentlich ist,
sondern es hat damit was zu tun, dass ich Folien habe,
wo ich teilweise Abbildungen aus der Büchern habe.
Und das müsste ich auf alle Fälle erstmal nochmal klären,
ob wir das so dann öffentlich stellen können.
Aber für sie ist es ja eigentlich nicht so wichtig,
weil sie kommen dann ja auf alle Fälle schon mal da dran und können sich das gerne dann auch nochmal live anschauen.
Der einzige Grund, warum ich ein ganz klein bisschen gezögert habe,
ob ich es machen soll oder nicht, ist,
es ist ein gewisses Risiko da,
dass sie dem nicht nicht mehr kommen,
weil sie sagen, oh, es ist super,
kann ich mir alles nachts im Fernsehen angucken und so,
da kann man auch immer anhalten, wenn man die Chips holen will.
Also Es ist nach wie vor noch ein großer Unterschied,
ob man hier sitzt oder die Vorlesung sich per Video anguckt.
Das ist meine Meinung. Und ich glaube,
es ist eine gute Sache, dass wenn hier Sachen schwierig werden,
wenn sie vielleicht Sachen, die ich voraussetze, nicht kennen,
dass sie da eine Chance haben, sich das auch nochmal anzugucken.
Ich glaube, das hilft wirklich auch in der Vorbereitung.
Deswegen ist es auf alle Fälle Gutes aufzunehmen. Auf der anderen Seite
haben sie hier die Möglichkeit, auch ein bisschen interaktiv mitzumachen.
Also bei mir gilt die Regel, dass sie in der Vorlesung fragen dürfen.
Ja, also sie können, wenn sie das Gefühl haben,
da ist so eine Stelle, verstehe ich jetzt nicht.
Und jetzt verstehe ich den ganzen Rest auch nicht mehr.
Das ist nämlich häufig so in der Algorithmik, wenn man einmal so raus ist,
dann hat man es dann schwer, da wieder reinzukommen.
Können sie sich melden? Ich erkläre diese Stelle dann nochmal
oder versuche das nochmal zu erklären mit anderen Worten,
dass sie dann wieder mitkommen.
Und die einzige Randbedingung, die das Ganze hat,
ist, ja, jetzt gehen schon die ersten.
Ich habe es gefürchtet. Die einzige Randbedingung, die das hat,
ist, dass ich natürlich irgendwo auch mein Stoffpensum durchbekommen will und
dann in so einer Situation würde ich dann vielleicht ein paar Minuten überziehen.
Ansonsten bin ich immer sehr darauf bedacht,
mich wirklich an die Zeiten auch zu halten
Okay, gut. Das war es dazu.
Das ist erst mal hier mein... noch einschalten.
Ja, also die Vorlesung ist in vielen Studiengängen drin.
Sie sind wahrscheinlich auch ein bisschen bunt gewischt hier.
Es ist natürlich in Informatikstudium ein Modul, dritten Semester,
ein ganz zentrales aus meiner Perspektive.
Es ist im Computing in Science-Studiengang drin.
Die Bio-Informatiker hören diese Vorlesung im Masterstudiengang,
wenn sie vorher mehr
naturwissenschaftlich studiert haben
Und dann ist es auch in einigen Wahlpflichtbereichen drin,
von anderen Informatik-nahen Studiengängen. Also das heißt,
wir haben hier wahrscheinlich unter Ihnen eine ganz gemischte Truppe.
Die Vorlesung, das wissen Sie,
sonst säßen Sie ja nicht, ist Mittwoch 10 bis 12.
Ich fange immer 15 an, also 10.15 Uhr und 14.15 Uhr.
Der erste Teil in diesem Hörsaal und die Freitagsvorlesung ist in
Phil B., die ist 14-tägig und die erste Vorlesung
ist jetzt am Freitag
Wenn Sie mich sprechen möchten, können Sie das gerne nach
der Vorlesung tun. Also kommen Sie einfach her,
wenn Sie irgendwie so ein kleineres Anliegen haben,
wenn das komplizierter ist oder Sie wollen mal ein etwas intensiveres Gespräch.
Können wir das auch machen? Ich habe keine Sprechstunden,
die fix sind, sondern ich mache das nach Vereinbarung,
weil Sie haben Vorlesungen und Lehrveranstaltungen und dann können Sie wahrscheinlich garantiert dann gerade nicht,
wenn ich hier eine Zeit aufschreibe und ich habe auch einfach viele Termine und dann gucken wir lieber,
wo wir so eine passende Lücke finden.
Das ist allerdings relativ einfach, schreiben einfach eine E-Mail hier
an meine Sekretärin und die Schreiben Sie in der E-Mail ruhig schon rein.
Ich kann am besten, dann und dann und dann,
da bin ich auf dem Hauptcampus oder so.
Und dann sagt sie Ihnen Zeit, wo Sie vorbeikommen können.
Hier sehen Sie auch, dass nicht, dass ich meine,
mein Büro und meine Arbeitsgruppe nicht in Stellingen habe,
sondern ich sitze da im Zentrum für Bioinformatik.
Ich leite dieses Zentrum und das ist in der Bundesstraße 43.
Es ist ein unscheinbares Gebäude. Es war ein unscheinbares Gebäude
bis vor drei Tagen. Da hat dann der Hausbesitzer
einen wunderschönen kleinen Geist an die Wand gemalt.
Es kennt das wahrscheinlich nämlich jeder. Also das ist Gebäude,
es ist zwei neben dem, oder drei neben dem Geomatikum,
dem großen Turm
Und da finden Sie uns. Und da finden Sie auch
einen größeren Teil der Übungsgruppenleiter, wie Sie jetzt gleich sehen werden,
weil die meisten von denen aus meiner Arbeitsgruppe sind.
So, das dazu. Zu den Übungsgruppen. Es gibt
zehn Übungsgruppen und das ist die Liste. Wir haben eine
sehr hohe Dichte an Personen, die Matthias heißen, mich inklusive.
Ich weiß nicht, ob das irgendwie, egal. Also,
und das sind jeweils die Gruppen, das sind die Leiter der der Übungsgruppen.
Sie sollten über Stine schon eine Gruppe haben.
Ich habe zumindest mal reingeguckt und das sah so aus,
als wenn alles ordentlich zugeordnet wurde.
Erfahrungsgemäß kommt nach der ersten Vorlesung so eine gewisse Prozentsatz und sagt,
ich muss aber die Gruppe tauschen aus diesem und jenen Grund.
Wenn es eben geht, bitte vermeiden Sie das,
wenn Sie tauschen möchten, dann gucken Sie mal,
ob Sie jemanden finden, mit dem Sie tauschen können,
damit die Gruppen nicht zu unbalanciert werden.
Wenn Sie tauschen wollen, Wenn sie tauschen wollen,
und sie tauschen von einer Gruppe, die schon sehr voll ist,
in eine, die etwas leerer ist.
Es ist natürlich etwas unproblematischer, wenn die Gruppe schon sehr voll ist.
Also wenn die an 20 Studierende schon hat, können wir das nicht machen.
Ja, weil das wird dann einfach zu unsymmetrisch und dann geht es irgendwie nicht.
Es sei denn, sie finden einen zum Tauschen.
Für die erste Übung, die ja dann nächste Woche stattfindet,
möchte ich sie bitten, auf alle Fälle,
selbst wenn sie irgendwas noch tauschen wollen oder so,
erstmal in diese Übung zu gehen.
Ja, also solange sie in Stine nicht irgendwann das eingetragen sind,
ist das die Übungsgruppe,
die sie für sie
halt dann verbindlich ist
Sie hatten noch eine Frage. Gibt es noch mehr,
die sich nicht eintragen konnten?
Okay, also zwei Fälle, das kriegen wir bestimmt
noch hin
Also sie können auf alle Fälle mitmachen. Ja,
es kann sein, dass wir sie nicht eingetragen haben oder dass sie,
dass das Studienbüro sie nicht eingetragen hat,
weil sie formal den Abschluss nicht mehr brauchen.
Aber also von den Plätzen, was ich so gesehen habe,
können sie auf alle Fälle mitmachen.
Dann klären wir das einfach, wo wir sie dazustecken.
Sonst reden wir noch mal mit Studien im Büro.
Und bei ihnen, ich vermute, dass das jetzt irgendwie kommt.
Sonst melden sie sich einfach noch mal kurz bei mir
oder im Studienbüro direkt und dann kriegen sie eine Gruppe.
Okay, in Übungen gibt es Anwesenheitspflicht.
Einmal dürfen sie fehlen mit einem schlechten Grund,
danach nur noch mit guten Gründen
Ja, das ist laut Batchdorn und das kennen sie aber.
So, Übungsblätter, Übungsblätter gibt es und zwar,
weil wir einen 14-tägigen Übungsrhythmus haben, natürlich auch 14-tägig.
Die Zettel geben wir aus, montags um die Mittagszeit,
12 Uhr. Sie haben dann auch genau sieben Tage Zeit,
die zu bearbeiten. Sie müssen also ihre Aufgaben abgeben,
wiederum mit an einem Montag um 12 Uhr in der Folgewoche.
So, die Zettel hinterlegen wir bei Stine
Die hinterlegen wir bei Stina, also sie können die,
und bei der Vorlesung können sie sich einloggen und dann können sie,
können sie die runterladen, ja.
Ich weiß nicht, wie viele von ihnen haben Interesse,
dass sie sich an irgendeinem Ort einen ausgedruckten Zettel abholen können.
So ein Paar. Also, ja, ich möchte einfach,
ich bin, ich versuche einfach Papier einigermaßen schon zu verwenden.
Also ich will jetzt einfach nicht 200 Blätter ausdrucken,
die irgendwo hinlegen und dann nimmt sie keiner mit.
Also, wir würden, wir legen ein paar ins ZBH-Foyer,
würde irgendjemand sich so einen Zettel im ZBH-Foyer abholen
Zwei, drei, okay. Also wir legen so ein
paar Zettel ins ZBH-Foyer und wir legen welche in Stelling.
Und zwar hier in dieses Treppenhaus CD, erster Stock.
Ich hoffe, Sie wissen dann ungefähr, wo das ist.
Ich weiß das nicht so ganz genau,
aber da gibt es wohl so einen Ort,
wo diese Sachen organisiert werden.
So, zur Abgabe Ihrer Lösung sprechen Sie bitte nochmal mit
den Übungsgruppenleitern,
wenn Sie
irgendwas Spezielles wünschen
Sie haben die Möglichkeit, online abzugeben, dann per E-Mail an den Übungsgruppenleiter.
Sie finden irgendwie heute oder morgen in den nächsten Tagen unter Stina
ein Dokument mit einer Tabelle, wo die Übungsgruppenleiter mit E-Mail-Adressen stehen.
Ja, das habe ich jetzt hier nicht auf der Folie.
Müssen Sie nochmal reingucken, da stehen die,
weil Sie brauchen das ja schon für die erste Abgabe.
Dann können Sie also das einfach, das online schicken.
Die Randbedingung ist, und ich hoffe,
dass Sie dafür Verständnis haben, wir werden nichts anderes mehr bearbeiten,
ist,
dass Sie uns
ein PDF-Dokument schicken
Also wir möchten gerne, wenn Sie eine Abgabe machen,
machen Sie eine Abgabe und was wir dann,
was ich dann erwarte, ist,
dass in dem E-Mail als Anhang ein PDF-Dokument ist.
Eins, ja. Also bitte nicht Latech Source und
bitte auch nicht fünf eingescannte JPEG-Bilder noch extra. Ja,
das ist für uns unheimlich aufwendig, das dann alles zusammenzuwurschteln.
Sie sind ja fast alle Informatik nah und affin.
Sie werden Möglichkeiten finden aus ihrem, was immer sie zusammen
haben, ein PDF-Dokument zu machen.
Und dann schicken Sie uns das
Okay, ansonsten können sie aber auch gerne die Sachen
entweder ausdrucken, aber sie können das auch handschriftlich machen.
Also ich habe meine Übungszettel früher als Student immer handschriftlich gemacht.
Und für fast alles, ich müsste fast echt suchen,
was wir hier machen und was auf den Übungszetteln passieren wird,
gibt es auch gar keinen Grund, das mit dem Computer zu machen.
Das meiste können sie wirklich handschriftlich machen,
können sich darüber nachdenken, die Lösung ausdenken und dann aufschreiben.
Ja, können quasi machen. Dann bitte ich nur darum,
dass sie eine einigermaßen lesbare Handschrift haben für im Namen der Übungsgruppenleiter,
die das korrigieren.
Und dann können sie
das abgeben
Entweder im ZBH-Foyer oder wieder in Stelling an dieser Stelle.
Die Abgabe ist 12 Uhr Montag, habe ich schon gesagt.
Und bitte seien Sie pünktlich. Also es kann sein,
dass der Übungsgruppenleiter erst 12 Uhr 5 Mal nachschaut oder 12 Uhr 10.
Aber ich möchte einfach, um von vornherein zu vermeiden,
dass sich diese Abgabe irgendwie so langsam im Laufe des Semesters
nach hinten schiebt, einfach klar die Regel aussprechen.
Alles, was bis 12 Uhr da ist,
wird bewertet und geht ein ins Punktekonto,
was danach geht,
darauf haben sie
zumindest erstmal
keinen Anspruch
Also wie gesagt, wir reden nicht über fünf Minuten,
aber halten sich dran, dass sie ungefähr,
also 12 Uhr da montags abgeben.
Okay, so, dann geben sie ja montags den Zettel ab.
Das ist immer die Woche, in der die Übungen stattfinden.
In dieser Woche wird dieser Übungszettel dann auch vorgerechnet.
Das heißt, wir versuchen das möglichst dicht zu haben,
damit sie möglichst zeitnah auch sich mit den Aufgaben wieder beschäftigen.
Okay, ja, vielleicht zum ersten Blatt,
steht hier nicht drauf. Das erste Blatt stellen wir heute
Mittag irgendwie online
Jetzt gerade dabei, das Finale fertigzustellen.
Jetzt haben sie natürlich nur eine halbe Woche Zeit.
Deswegen gibt es auf diesem Zettel auch nur die halbe Punktzahl.
Ja, also wir haben im Prinzip,
also die Hälfte vom Aufgabenumfang, was wir ungefähr so machen werden.
Und da gibt es auch nur ungefähr die Hälfte der Punktzahl,
weil sie nur eine halbe Woche Zeit haben.
Auf diesem ersten Übungszettel werden sie, naja,
finden sie eine Aufgabe zum Okerkühl und eine zweite Aufgabe,
die beginnt mit einem einleitenden Text, der sie darum bittet,
sich mit elementarer Wahrscheinlichkeitstheorie und ein bisschen Storastik zu beschäftigen.
Das liegt daran, weil wir das im Semester brauchen werden,
an verschiedenen Stellen. Und in den verschiedenen Studiengängen,
wo sie drin sind, ist also die Storastik als ganzes Gebiet
zum Teil überhaupt nicht mehr enthalten, sondern weil das ist Wahlpflicht.
Und es kommt auch meistens zu spät, also viertes Semester.
Und wir brauchen das aber hier, wir brauchen nicht sehr viel.
Also ich erwarte nicht, dass sie quasi komplett die Storastik als das,
was sie in einem Mathe-Modul lernen würden,
aber wir brauchen einfach so ein paar Grundlagen.
Und wir haben uns dieses Jahr überlegt,
dass es gut ist, jetzt gerade am Anfang des Semesters,
da haben sie noch ein bisschen mehr Zeit,
als wenn es so richtig losgeht
Vielleicht die Zeit nutzen, sich ein bisschen einzulesen.
Also sie finden eine kleine Formelsammlung,
die können sie jetzt auch schon unter Stine runterladen.
Das ist eine Formelsammlung, die mache ich für einen anderen Zweck.
Da ist hinten ein Kapitel dran zum Thema Wahrscheinlichkeitsrichtung und Storastik.
Das sind so drei Seiten ungefähr. Und sie finden im Corman,
es kommt nach der nächsten Folie, also das Lehrbuch,
was wir verwenden, würden sie hinten einen Anhang zu dem Thema.
Das sind dann so ein bisschen ausführlicher, so auf
zehn Seiten beschrieben. Und also diese zweite Übungsaufgabe ist,
sich da
ein bisschen einzulesen
Von ihnen kennst du vielleicht auch schon. Also es ist teilweise,
also je nachdem, wo sie zur Schule gegangen sind,
haben sie das da auch schon gemacht.
Und dann ist da eine kleine, wirklich einfache Ausgabe zu dem Thema.
Okay, so, das war zum ersten Zettel. Und ja,
zu den Studienleistungen, also sie bearbeiten die Übungsgruppen,
die Übungsblätter in Gruppen von zwei bis maximal drei Studierenden.
Also wirklich bitte keine Einzelabgaben. Bitte keine Viererabgaben.
Ja, finden Sie sich bitte in Zweier- oder Dreiergruppen zusammen
Ideal sind meiner Meinung nach Zweiergruppen, aber es geht da
dann nicht unbedingt auf. Also Zweier- oder Dreiergruppen. Und
dann bearbeiten Sie die Aufgaben zusammen und geben das entsprechend ab.
Vielleicht noch ein paar Worte zu dieser Gruppenarbeit, die da stattfindet.
Die eine Option, die eine Möglichkeit, das zu machen,
ist zu sagen, super, da sind jetzt zwei Aufgaben.
Ich mache die ein, du machst die andere.
Dann sind wir relativ schnell damit fertig. Die Übungsaufgaben hier,
die haben primär den Zweck, dass sie den Stoff verstehen
und dass sie nachher die Klausur gut bestehen.
Wenn sie sozusagen in diesem Arbeitsteilungsmodus arbeiten,
Dann haben sie den Effekt nur für 50 Prozent der Vorlesung.
Für die eine Aufgabe, die sie machen,
die andere Aufgabe, die dann ihre Kommilitone macht,
das kriegen sie ja halt nicht so mit.
Also sie können gerne Schwerpunkte setzen, dass sie sagen,
wenn sie im Team arbeiten, ich gucke erst mal primär,
was ich für die erste und der andere primär für die zweite Aufgabe,
aber tauschen sie sich aus?
Also sie sollten mindestens, wenn der Übungszettel abgegeben wird,
die Lösung des ganzen Zettels, also für alle Aufgaben,
wirklich auch verstanden haben.
Und ideal arbeiten sie wirklich zusammen und versuchen gemeinsam auch
die Lösung da zu finden
So, da müssen sie fristgerecht abgehen, habe ich schon gesagt.
50 Prozent der Punkte müssen sie erreichen, unsere Übungsblätter haben 16 Punkte, immer.
Es wird nicht exponentiell mehr zum Ende hin oder so,
also immer 16 Punkte, bis auf dieser erste,
wie gesagt, der hat acht.
Und ja, dann gibt es die Regel, dass sie abgeben sollten.
Das heißt, wenn sie die Hälfte Zettel abgegeben haben,
haben wir immer alles richtig,
dann sollten sie trotzdem die anderen Zettel noch abgeben.
Also mindestens ein Punkt auf sechs von sieben Übungsblättern.
Sie haben Anwesenheitspflicht in den Übungen,
habe ich schon gesagt, abzüglich Krankmeldungen,
wenn sie krank sind,
können sie
sich abmelden
Okay. Ja, dann gibt es noch dieses leidige Thema mit den abgeschriebenen Lösungen.
Ja, also wir werden nicht, wir sind gut 180 Leute,
macht 180 Leute, das macht ungefähr 90 Abgaben.
Ich werde das nicht einscannen und nach irgendwelchen Plagiaten suchen.
Ja, wir machen hier nicht den Casa-Chavan oder irgendwas, ja. Aber,
aber, also, ihn bringt es gar nichts,
ja, also für sie übrigens gar nichts,
außer dass sie vielleicht die Punkte haben und denken, super, wenig Zeit.
Sie lernen nichts dabei, das ist das Schlimme.
Und also, wenn die Sachen, wenn wir es sehen,
und das ist so absolut offensichtlich, dann greift diese Regel.
Ja, wir geben dann einfach, weil wir nicht nachweisen können,
wer jetzt eigentlich von wem was wie kopiert hat,
gibt es also für alle Beteiligtengruppen keine Punkte.
Okay, dann sollten Sie in den Übungen aktiv mitarbeiten,
dann lernt man auch am meisten. Das funktioniert so.
Die Übungsaufgaben werden ja vorgestellt. Dabei ist so ein bisschen das Problem,
wenn der Übungsgruppenleiter da steht und sagt, ja,
wer möchte denn und dann meldet sich einer und der
stellt das dann vor und der hat aber eine Lösung,
die eigentlich nicht wirklich, sagen wir mal,
sagen wir mal, gut ist oder wo man viel lernen kann.
Manchmal kann man auch an schlechten Lösungen viel lernen,
aber dann ist das natürlich ungünstig.
Dann sitzt da so der ganze Übungsgruppe und hört sich so
eine halbseilende Lösung an, das ist irgendwie nicht gut.
Deswegen machen wir das schon seit mehreren Jahren so,
dass der Übungsgruppenleiter guckt und das nur unter den korrekten Lösungen.
Das heißt nicht, dass sie 100 Prozent der Punkte haben müssen,
aber die im Wesentlichen korrekten Lösungen unter denen wählt er aus.
Und dann gibt es da die Gruppe und dann kann jemand
aus der Gruppe das vorstellen. Wenn der Übungsgruppenleiter das Gefühl hat,
dass es in der Gruppe tatsächlich nur eine Person gibt,
dazu in der Lage ist, hat er das Recht und die Möglichkeit,
die Gruppe darauf hinzuweisen und auch jemand anderem bewusst mal dran zu nehmen,
zu sagen, du machst das jetzt,
du stehst mit auf dem Zettel, du solltest das können.
Das heißt, für die Übung sollten sie in der Lage sein,
auch alle Lösungen zu präsentieren, auch wenn die Teilaufgabe ihr Kommilitone primär gemacht hat.
So, okay, das war der Formalteil zur Literatur,
ich gehe nach dem Kormen vor, ich habe jetzt keinen mitgebracht,
der ist immer so schwer, das ist also, ich weiß nicht,
kennen sie den schon, haben sie schon mal gesehen.
Also, es sind ein Klassiker der Informatik, Kormen,
Licerson Revest Stein, es ist ein englischsprachiges Buch heißt Introduction to Alborhythms, ist schon,
ja, ich glaube, in den 90ern erstmalig erschienen.
Wenn sie sich das kaufen oder besorgen, achten sie darauf,
dass sie die aktuelle Ausgabe haben, also die 2009er,
also wenn sie auf dem Flohmarkt irgendwas von 1980 sehen,
ist vielleicht nicht so optimal,
weil da sich tatsächlich auch eine Menge geändert hat mit der Zeit und da ist es also sinnvoll auf alle Fälle, die aktuellste Ausgabe zu haben.
Wenn sie das nicht so gerne in Englisch haben möchten,
was ich verstehen kann, wenn sie sagen,
er muss jetzt doch das Englisch verstehen und ich will ja
den Inhalt verstehen und der Inhalt ist ja schon schwierig,
können sie auch gerne die deutsche Übersetzung verwenden.
Heißt Algorithmen eine Einführung im Oldenburg-Verlag erschienen,
dass sie die letzte überarbeitete Auflage 2010 erschienen.
Und das können sie auch mit ruhigem Gewissen machen.
Also es gibt viele schlechte Übersetzungen von Lehrbüchern, das ist eine wirklich gute Übersetzung.
Also das hat wirklich einen Informatikprofessor mit sehr viel Liebe übersetzt.
Das ist auch die Fachterminie, alle passen und so weiter.
Und ich habe da bisher nur sehr,
sehr wenige Stellen gefunden, wo ich gesagt hätte,
das hätte ich jetzt irgendwie mal anders gemacht oder so.
Also wenn sie wollen, können sie auf gerne in das Deutsche gucken,
wenn es ihnen dann leichter fällt. Die sollen ja nicht primär,
man ist immer gut, englische Texte zu lesen,
aber sie sollen ja hier primär mal die Algorithmen verstehen und nicht Englisch lernen.
Okay, so und ansonsten, dann gibt es immer die Frage,
gibt es auch ein Skript, jetzt steht hier Skript des Vorjahres,
wollte ich eigentlich gar nicht verwenden, das Wort.
Streng genommen gibt es kein Skript. Also es gibt kein Skript,
das liegt daran, dass die Inhalte, die wir hier machen,
sich wirklich in diesem Lehrbuch auch wiederfinden.
Und das wäre für mich einfach viel Arbeit sozusagen,
ihnen jetzt ein Skript zu schreiben,
wo dann im Wesentlichen nur das drinsteht,
was die vier Herren da wirklich sehr,
sehr gut aufgeschrieben haben
Ja. Deswegen gibt es für kein zusätzliches Skript,
aber sie können sehr gerne natürlich meine Folien haben.
Ja, meine Folienkopien. In den vergangenen Jahren war es dann immer so,
dass ich tatsächlich die auch komplett gedruckt habe und dann
habe ich die verteilt, dann hatten sie die.
Das hätte ich dieses Jahr auch wieder gerne gemacht. Der erste Dämpfer dabei,
es gibt ja wahrscheinlich den einen oder anderen politisch Aktiven hier,
dann wissen sie es auch gleich, ist,
dass dieses Jahr die Situation so gewesen wäre,
dass ich den kompletten Druck aus meinem Institutsbudget hätte zahlen müssen.
Das hätte ich aber auch gemacht, das wäre auch kein Ding gewesen,
aber Das Problem ist so ein bisschen in dieser neuen Ausgabe,
hat sich die Konvention wie Pseudocodes aufgeschrieben, wurde geändert.
Und ich habe gedacht, jetzt wäre es einfach die Zeit,
das komplett mal anzupassen. Das heißt, ich gehe momentan
über meine ganzen Folien drüber und mache alle Pseudocodes einheitlich,
exakt in diesem Stil. Das ist für sie natürlich dann einfacher,
weil sie diese eine Notation haben, es ist immer einheitlich,
ist aber für mich eine Menge Arbeit.
Und das habe ich jetzt auch nicht alles vorher mal machen
können, sondern das mache ich parallel.
Und wenn ich ihnen jetzt was Ausgedrucktes gegeben hätte,
dann wären da die alten Sachen drin gewesen.
Deswegen habe ich dann entschlossen, es nicht zu drucken
Ja, sie finden das komplette Skript, wenn sie es
haben wollen, auch Stine, können sie das runterladen?
Also das heißt, die ganzen Folien,
das ist dann aber die Variante aus dem Vorjahr,
da sind halt die Pseudo-Codes noch so wie in den alten Büchern,
die ändere ich jetzt gerade.
Und ich werde im Laufe des Semesters jetzt das kapitelweise immer
in Stine zur Verfügung stellen. Also immer so weit,
wie ich gerade bin, lade ich Ihnen die,
also PDF-Dokumente von den Folien dann hoch und dann können Sie
die verwenden.
Okay,
das dazu
So, jetzt können wir langsam inhaltlicher werden. Ich mache
mal eben meinen Schuh zu und Sie können mal überlegen,
ob Sie noch eine Frage haben.
Nicht? Doch. Noch eine Frage, okay. Nein,
die Gruppe gibt einmal ab und auf Ihrer Lösung stehen oben
die Namen und Matrikelnummern von denen,
die in der Gruppe sind
Oh ja, das wäre sehr ungünstig,
wenn das nicht so ist, ja.
Ja. Ja. Können Sie das nicht sehen in Stine
? Wahrscheinlich nicht, oder? Ja. Okay,
das ist eine echte Herausforderung. Ich höre mir mal
die zweite Frage an und denke mal gerade drüber nach,
Nein, doch, nächste Woche sind Übungen.
Also diese Woche ist... Das stimmt. Gut,
dass Sie das nochmal sagen, das war bei einer Übungsgruppe,
war irgendwie ein Fehleintrag drin.
Da stand bei einer Übungsgruppe, dass jetzt Freitag die erste Übung stattfindet.
Und das stimmt aber nicht. Also die Übungen sind immer,
alle Übungen sind immer in einer Woche und die nächste Woche
ist die erste Woche mit Übung
Diese Woche ist noch keine A&D-Übung. Nächste Woche sind die Übungen.
Okay, das ist wahrscheinlich für Sie auch besser. Okay,
die Frage war, ob freitags eine Übung ist,
weil in China das noch so eingetragen ist.
Und Freitags ist noch keine Übung, das ist eine Fehleintragung in China.
Also die, die freitags eine Übungsgruppe haben,
die Übung ist komplett immer in einer Kalenderwoche.
Also alle Übungen in einer von Mittwoch bis Freitag und
nächste Woche finden dann die Übungen statt
Und gerade ist noch, weil wir ja die Frage,
die noch unbeantwortet ist, ist, wie man denn herausfindet,
mit wem man in einer Gruppe ist,
um die Zettel gemeinsam bearbeiten zu können.
Da habe ich noch keine gute Lösung.
Habe ich noch was vergessen?
Was Wichtiges? Ja
Ja, ja, ja, das ist tatsächlich wahrscheinlich die beste Variante.
Also wenn sie schon wissen, sie kennen sich auch alle,
sie haben ja vielleicht auch schon versucht,
sich zusammen in eine Gruppe einzutragen.
Also wenn sie sich austauschen und sie finden schon raus,
wir sind in einer Gruppe, können sie schon Gruppen machen.
Ansonsten, wenn sie jetzt einfach noch nicht wissen,
wer mit ihnen in einer Gruppe ist und das ist jetzt noch nicht so hinhaut,
dann machen sie dieses Mal einmalig halt eine Einzelabgabe.
Okay, sonst alles gut. Okay, so,
dann können wir anfangen mit den inhaltlichen Dingen. Ja,
vielleicht sage ich noch ein Wort noch ganz kurz zur Vorlesung.
Also das Thema Algorithmen und Datenstrukturen ist kein einfaches.
Ja, es ist schwierig. Und bei Algorithmen hat man typischerweise so ein Aha-Erlebnis.
Das heißt, das ist so eine 0-1-Entscheidung.
Entweder man guckt da drauf und man versteht es einfach nicht.
Häufig ist das am Anfang so und irgendwann machst du dann
so Klick und dann hat man es kapiert und dann weiß man,
wie es geht.
Und dann fragt man sich die ganze Liebe Fahrrad fahren.
Und dann fragen sie die ganze Zeit,
warum man das vorher nicht verstanden hat.
So, das ist bei Algorithmen
häufig so
Also mein Tipp für Sie, um optimal mitzukommen,
ist, seien Sie hier, hören Sie gut zu,
wenn Sie das Gefühl haben, Sie verstehen irgendwas nicht,
fragen Sie im Zweifelsfall auch.
Die beste Chance ist, dass Sie zumindest schon mal grob verstanden haben,
wie es geht, ist tatsächlich hier in der Vorlesung.
Und wenn Sie es dann nachlesen und spätestens in dieser Übung
können Sie dann nochmal fragen und dann kommen Sie eigentlich in der Regel klar.
Dadurch, dass Sie die Folien haben können,
von mir müssen Sie natürlich jetzt nicht mitschreiben.
Sie müssen jetzt also nicht das irgendwie abschreiben, was ich hier mache.
Sie kriegen ja die Folienkopien. Trotzdem ist es so,
dass Sie immer wissen sollten, was ich Ihnen jetzt zeige
, sind Folien
Das ist kein Skript. Das heißt,
auf diesen Folien sind Pseudo-Codes drauf, da sind viele Bilder drauf,
um die Sachen zu erklären, die funktionieren.
Aber ich sage natürlich viel mehr als das,
was auf den Folien steht. Das heißt,
dieser ganze begleitende Text, der steht nicht auf den Folien.
Das heißt, idealerweise machen sie sich Notizen.
Schreiben sie sich auf, was zu dem,
was auf den Folien steht, noch wichtig ist.
Und das ist meiner Meinung nach die optimale Art und Weise,
hier mitzuarbeiten. Ja, Erfahrungsgemäß gibt es auch jedes Mal,
so wie hier, einige,
die einen Laptop dabei haben und sich des WLANs erfreuen oder auch nicht.
Sie können den auflassen, ist okay. Ich gehe einfach immer davon aus,
sie gucken sich parallel auf diesen Monitoren das Skript an.
Es ist dann sehr löblich, dann können sie auch gleichzeitig
da noch vielleicht das annotieren. Ich sage ihnen nun
nur aus eigener Erfahrung, ich mache das auch gerne.
Ja, ich sitze auch in Sitzungen und sage immer meinen Laptop auf und so.
Wenn sie eine E-Mail lesen und zwei Minuten nicht zuhören,
ist die Wahrscheinlichkeit, dass sie die nächsten zehn Minuten
nicht verstehen,
sehr groß
Das ist das Risiko dabei. Und wie gesagt,
ich wollte sich nur darauf hinweisen, um mir optimal mitzukommen und
die Zeit wirklich gut zu nutzen, seien sie aufmerksam dabei.
Gut, so, also jetzt aber endlich zum Thema.
Was machen wir? Wir beschäftigen uns mit dem Entwurf von Algorithmen und Datenstrukturen
. Wir schauen uns an, wie Algorithmen beschrieben werden.
Das ist ein relativ einfacher Teil, denn sie können alle eigentlich schon programmieren.
Da wissen sie, wie Algorithmen beschrieben werden.
Wir machen es hier ein bisschen einfacher,
weil wir nicht programmieren, sondern nur die Algorithmen,
die da runterliegen unter den Programmen,
Und wir werden Algorithmen erlernen an vielen, vielen Beispielen.
Algorithmen lernt man an Beispielen. Ja,
und gute Algorithmiker sind unter anderem deswegen so gute Algorithmiker,
weil die zu jedem Problem immer bevor was einfällt und sagt,
ja, das ist ja so ähnlich wie das und das.
Und das habe ich ja schon mal gelöst oder das hat jemand anders
schon mal gelöst und dann kann man das nehmen und modifizieren
oder kriegt eine Idee wie ein Problem angegangen werden kann.
Ja, dann werden wir uns natürlich mit der,
intensiv mit der Analyse beschäftigen.
Wir müssen mal schauen, dass die Algorithmen,
die wir entwerfen,
auch korrekt sind
Und dann natürlich die Zeit- und Platzkomplexität analysieren,
um zu sehen, ob der Algorithmus auch gut ist oder nicht.
Ja. Die Rolle von Algorithmen in der Informatik, das ist sehr unterschiedlich.
Also es gibt viele Bereiche in der Informatik, wo man sagen kann,
auf der Spielalgorithmen gar nicht so eine große Rolle,
wenn sie irgendwie die Webpage von irgendeinem Zahnarzt programmieren,
dann brauchen sie sowas natürlich nicht.
Und es ist sogar so, dass in vielen Anwendungen
die Algorithmik vielleicht dann gar nicht so wichtig ist.
Aber es gibt eben auch eine ganze Menge Anwendungen,
wo das sehr, sehr zentral ist.
Es ist völlig egal, ob sie bei Bertelsmann ein Hochregalager programmieren,
ob sie im Hafen von Hamburg das Container-Terminal programmieren.
Sie haben es immer oder sehr schnell mit Optimierungsproblemen zu tun.
Sie haben sehr schnell zur Fragestellung,
in welcher Reihenfolge stapel ich denn jetzt die Container aufeinander,
damit ich möglichst wenig Auf- und Abladevorgänge habe,
wenn dieses Schiff einmal um die Welt fährt.
In welche, wo, wo in meinem Hochregalager,
bei Bertelsmann oder Amazon packe ich da in die Bücher rein,
damit der Roboter nicht stundenlang hin und her erfahren muss,
um die Pakete zu packen.
Wie soll ich meinen Laster von der Post idealerweise durch Deutschland
fahren lassen, damit er möglichst wenig Kilometer verbraucht?
All das sind algorithmische Fragestellungen. Und wenn sie da schlechte Lösungen haben,
dann werden ihre Programme entweder verdammt schlechte Lösungen liefern, Resultate liefern.
Oder sie werden einfach unwahrscheinlich lange dafür brauchen. Und auch
das ist natürlich überhaupt nicht akzeptabel. Wenn Sie mal gucken,
wie wichtig Algorithmen so für Unternehmen sind,
dann kriegt man das auch ganz gut mit.
Und ein ganz interessantes Beispiel ist Google
Also, wenn sie sich bei Google bewerben und wollen dann eine Stelle haben,
dann muss man nun relativ aufwendigen Prozess durchlaufen,
dass man das macht. Und ein Großteil der Fragen,
die sie da gestellt kriegen, nachdem sie bewertet werden,
ob sie für dieses Unternehmen interessant sind, sind Algorithmenfragen.
Ja, also sie können da durchgehen, da gibt es
mittlerweile sogar schon Bücher, was die so fragen.
Und da gibt es viele, viele Fragen, die die fragen können.
Ich kann dir mal ein Beispiel nennen oder tollen Fragen und
ich bitte mal diejenigen, die letztes Jahr hier waren,
sich jetzt mal nicht zu beteiligen.
Die kennen die nämlich schon, ich habe jetzt keine neue rausgesucht.
Und zwar haben wir folgendes Problem. Wir haben acht Kugeln,
Die sind optisch alle identisch. Und eine von den Kugeln
ist schwerer als die anderen sieben. Sie haben eine Balkenwaage
zur Verfügung, wo sie das Gewicht von Kugeln vergleichen können.
Wie bestimmen Sie, welches diese eine schwerere Kugel ist?
Okay, also der Vorschlag, wiederhole das nochmal,
wir nehmen die acht Kugeln,
wir zahlen die in zwei Hälften
Kommen gleich dran. In zwei Hälften. Dann haben wir
vier Kugeln, rechts, vier Kugeln links.
Die legen wir auf die Waage. Eine Seite wird schwerer
sein, weil das ist ja die schwere Kugel dabei.
Dann nehmen wir die vier Kugeln, teilen die wieder auf,
legen rechts und links jeweils zwei Kugeln drauf.
Dann wird wieder eine Seite schwerer sein. Und dann nehmen wir lieber
einen Kugeln, wiegen die nochmal, dann wissen wir die schwererer.
Dabei müssen sie dreimal wiegen, richtig? Genau. Ich habe
schon gesagt, sie haben sich schon gemeldet, die ganzen Mhm.
Genau, genau. Anzahl, Anzahl Wiegeversuche, die sie brauchen.
Zwei. Genau. Und das ist optimal. Das ist
eine Lösung, die zugegebenerweise, es ist nicht trivial,
auf diese Lösung zu kommen. Es ist,
wenn Sie sich vorstellen, dass das Wiegen ein sehr,
sehr aufwendiger Prozess wäre, ja, was weiß ich,
welche Anwendungen sie da haben, dann ist es eben entscheidend,
ob sie vielleicht dreimal wiegen müssen oder zweimal wiegen müssen.
Wenn sie es ganz ungeschickt machen, würden sie wahrscheinlich auch siebenmal wiegen,
würden sie eine Google erst mit der nächsten vergleichen oder so.
So machen sie es natürlich nicht. Der Algorithmus,
den sie vorgeschlagen haben, ist ein ziemlich guter.
Das ist eine binäre Suche. Und der einzige Grund,
warum wir das toppen können, in diesem einen Fall ist die Tatsache,
dass wir beim Wiegen auch Informationen bekommen über die Kugeln,
die wir nicht wiegen.
Und zwar in dem Augenblick, wenn sie gleich schwer sind.
Vielleicht nochmal der Algorithmen habe ich jetzt noch gar nicht wiederholt.
Ich weiß nicht, ob sie den alle gehört haben.
Also wir nehmen von den acht Kugeln, denen wir sechs Kugeln
und wiegen drei gegen drei, die gleich schwer sind.
Das ist genau der Fall, wo wir was erfahren über
die anderen Kugeln. Dann müssen wir nämlich,
dass unter den anderen zwei Kugeln die schwerere Kugel dabei sein muss.
Dann tun wir die sechs beiseite, nehmen diese zwei Kugeln,
wiegen die und dann wissen wir, welches die schwerere ist.
Wenn die schwerere Kugel bei den sechs Kugeln war,
dann wird eine der beiden Seiten der Balkenwaage ausschlagen.
Wir nehmen diese drei Kugeln und wissen unter diesen dreien,
ist die schwerere Kugel dabei.
Dann tun wir die anderen weg. Wir wiegen einfach zwei
Beliebige von diesen sechs. Wenn die Balkenwaage gleich ist,
dann muss die dritte Kugel die schwerere sein,
weil die war ja bei den dreien dabei
Und anderenfalls wird die Balkenwaage uns dann sagen,
was die schwere Kugel ist und wir können das Ganze mit zweimal Wegen machen.
Okay, das ist einfach ein Beispiel für einen sehr,
sehr geschickten Algorithmus, um dieses Problem zu lösen.
Ja, und davon gibt es natürlich noch viele, viele mehr.
Okay, so, vielleicht ein bisschen nochmal zum Aufbau der Vorlesung.
Wir werden also erst ein bisschen Grundlagen liegen,
damit sie in der Lage sind,
Algorithmen zu analysieren und machen dann ein bisschen was zum Thema Dahnenstrukturen.
Das Thema mache ich typischerweise immer relativ schnell,
weil sie durch insbesondere Softwareentwicklung, das eigentlich alles kennen.
Da geht es dann so um elementare Datenstrukturen wie Listen und
sowas und Bäume. Das kennen die meisten von ihnen,
deswegen mache ich das nicht sehr intensiv.
Also es gibt so viele andere Themen, die wichtiger sind.
Deswegen ist das relativ kompakt. Dann gehen wir ins Thema
Sortieren. Wir werden Sortieralgorithmen analysieren und zum Thema Sortieren
ist es so, da werden wir viele Algorithmen sehen.
Und wahrscheinlich der eine oder andere kennt von ihnen,
Sortieralgorithmen bin ich fest davon überzeugt.
Wer von ihnen
kennt Quicksort
Sehen Sie, Sie kennen alle Sortieralgorithmen,
aber das Sortieren ist für uns ein ganz wichtiges Thema oder ein ganz gutes Thema,
weil man daran eine Vielzahl von Analysetechniken super lernen kann.
Ja, also wenn man die verschiedenen Sortierverfahren anschaut,
kann man sich genau, kann man sich mit Komplexitätsanalyse
sehr gut beschäftigen und das machen wir in diesem Kapitel.
Dann gehen wir von Sortieren nach Suchen,
also das ist wieder ein Datenstrukturthema, wo wir uns anschauen,
wie Datenstrukturen aussehen, um Daten zu speichern,
um sie effizient wiederfinden zu können.
Da gibt es so ein klein bisschen Überlapp zu den Datenbanken,
aber auch nur mini, minimal.
Dann kommen wir zu Graf-Algorithmen
Graf-Algorithmen beschäftigen sich halt mit Problemen auf Grafen,
wie es schon so steht, sind also Algorithmen,
die zum Beispiel kürzeste Wege bestimmen oder ähnliches machen, also auf solchen Netzwerken.
Und dann sind wir auch schon im nächsten Jahr,
schauen wir uns dynamische Programmierungen an, das ist ein Konzept,
das hört sich hier so sehr nach Softwareentwicklung an,
weil da Programmierungen dann vorkommt, ist es aber nicht,
sondern hier ist es, es geht hier um ein Konzept,
um eine spezielle Klasse von Optimierungsproblemen schnell lösen zu können.
Und das werden wir uns anschauen, weil viele Probleme,
von denen kann man eine Eigenschaft nachweisen,
sodass man
dieses Verfahren anwenden kann
Und in Kapitel 7 oder in einem hinteren Teil gehen wir
dann zu all den Problemen, die wir mit den Standardverfahren,
die wir so am Anfang kennengelernt haben,
nicht mehr lösen können, zu den richtig knackigen Problemen.
Okay, das ist der Plan. Gut. So,
wir beginnen. Beschreibung von Algorithmen. Das macht Algorithmen hier aus.
Also sie wissen hoffentlich alle, woher der Begriff der Informatik kommt.
Sie studieren das ja. Informatik ist Information und Mathematik.
Und die Grundlagen der Informatik liegen in der Mathematik und die Algorithmik Verfahren,
also die Entwicklung von Algorithmen, ist so ein Bereich,
der sehr stark vernetzt ist mit der Mathematik.
Die eigentliche Informatik entstand natürlich erst mit der Entwicklung von Rechneranlagen
in den 40er Jahren, weil man dann die Möglichkeit hatte,
komplexe Algorithmen wirklich auch mit einer Maschine ausführen zu können.
Algorithmen gibt es schon ganz lange. Ein erstes Buch über Algorithmen
ist erschienen, im Jahre 780 von einem persischen Mathematiker.
Und das war quasi ein Überblicksbuch über Algorithmen,
die es zu dem Zeitpunkt schon gab.
Algorithmen sind noch viel älter. Und hier sehen sie,
die Griechen haben Algorithmen entwickelt. Sie ist ein Algorithmus von
Euklid, der hier den größten gemeinsamen Teil da berechnen kann
Ja, okay, also diese Algorithmen schauen wir uns an und damit sie gleich
ein erstes Beispiel haben, gucken wir uns den hier an.
Die größte gemeinsame Tyler können wir wie folgt berechnen,
hat Euglied 300 v. Christus herausgefunden. Der hat gesagt,
wenn ich zwei Zahlen habe, A und B und ich gehe davon aus,
dass jetzt A die größere der beiden Zahlen ist,
dann kann ich wie folgt vorgehen,
um den größten gemeinsamen Tyler zu finden.
Ich mache eine ganzzahlige Division, das heißt,
ich bestimme Kuh und A,
sodass A gleich B mal Kuh plus R ist und dass er hat die Randbedingungen,
das muss kleiner sein als B,
eine ganz dahlige Division mit Rest
Wenn der Rest null ist, dann wissen wir,
dass der kleinste gemeinsame, der größte gemeinsame Tyler,
dass der größte gemeinsame Tyler B sein muss.
Dann können wir also B einfach ausgeben. Anderenfalls gehen wir
wie folgt vor. Wir sagen das arg, kriegt jetzt
den Wert von B und B kriegt den Wert von R.
Und dann wiederholen wir das und gehen wieder zu dem ersten Schritt.
Und auf diese Art und Weise finden wir den größten gemeinsamen Tyler.
Dieser Algorithmus von Euklid hat schon fast alle Elemente,
die Algorithmen auszeichnen
Ja, wir können das gerne... Nein, nein,
nein, so sollten sie das nicht sehen. Okay,
also funktioniert auch für 30 und 5 funktioniert wahrscheinlich auch für viele andere Sachen,
wenn nicht, wäre es blöd für euer Glied,
der kann sich nicht mehr wehren.
Also gehen wir mal davon aus, dass es richtig ist.
Also dieser Algorithmus hat schon fast alles, was Algorithmen ausmacht.
Er besteht aus einer Liste von einzelnen Anweisungen,
sind ja
vier Anweisungen
Jede der Anweisungen ist elementar,
sodass sie mit ein bisschen Mathematikkenntnisse diese Anweisungen ausführen können.
Es kommt eine bedingte Ausführung vor. Wenn irgendeine Bedingung gilt,
dann passiert etwas Spezielles. Es kommt eine Wiederholung vor.
Hier, dass also, wenn man hier angekommen ist,
fängt man hier oben wieder an und macht dann das nochmal.
Und das Wichtigste ist, was eigentlich das Spannende an Algorithmen ist,
die Tatsache, dass das funktioniert mit diesen einfachen vier Schritten,
ist überhaupt nicht trivial
Das ist nicht so einfach zu sehen, dass das ein korrekter Algorithmus ist.
Sie können es natürlich an ein paar Beispielen rechnen,
aber es ist immer funktioniert, ist schwer zu sehen.
Das heißt, das Besondere an Algorithmen ist,
dass sie ein schwieriges Problem herunterbrechen auf Schritte,
auf einzelne Schritte, wobei jeder einzelne Schritt einfach ausführbar ist.
So, okay, also wichtige Begriffe hier sind, wir haben ein Problem.
Das Problem ist das, was wir lösen wollen.
Unsere Probleme sind formalisiert, das bedeutet, sie definieren eine Eingabeausgabebeziehung.
Also das heißt, irgendwas geht hinein, irgendwas anderes soll heraus.
Erst wenn wir ein Problem auf dieser Ebene spezifiziert haben,
sind wir in der Lage, einen Algorithmus zu entwickeln.
Für dieses Problem gibt es Instanzen. Eine Instanz ist eine
mögliche Eingabe. 30.5 ist eine Instanz für unser GGT-Problem gewesen.
Der Algorithmus definiert die Art und Weise, wie wir unser Problem lösen.
Es ist also eine Folge, elementare Anweisung zur Lösung des Problems.
Für die Korrektheit verlangen wir natürlich, dass das richtige Ergebnis rauskommt.
Wir verlangen aber auch, dass der Algorithmus für jede
mögliche Eingabe hält
Und das hört sich jetzt erst mal so trivial an,
aber es gibt viele Beispiele,
wo das nicht so klar ist, wo es schwer ist,
nachzuweisen, dass für jede Eingabe ihr Verfahren auch stoppt.
Das muss man nachweisen dafür, dass sie sagen können,
das ist ein korrekter Algorithmus.
Die Eigenschaft von Algorithmen sind mechanische Ausführbarkeit,
mechanisch bedeutet nicht Zahnräder, mechanisch bedeutet ohne zusätzlichen intellektuellen Geist.
Sie müssen nicht mehr Schritte interpretieren, hochkomplexe Dinge machen,
wo nicht klar ist, was da zu tun ist.
Also es ist mechanisch
einfach ausführbar
Sie bestehen aus mehreren elementaren Schritten. Jeder dieser Schritte heißt elementar.
Das bedeutet, ist einfach ausführbar. Die Schritte werden gegebenenfalls
wiederholt durchlaufen. Das nennen wir Iterationen. Die Schritte werden
gegebenenfalls bedingt durchlaufen. Das nennen wir Selektionen. Und das Einzige,
was wir gerade an dem GGT-Algorithmus nicht gesehen haben, ist die Rekulsion,
die Verfahren führen sich gegebenenfalls selbst wieder aus mit veränderten Parametern.
Und das ist eine Rekulsion. Und das sind die Konzepte,
mit denen wir Algorithmen machen. So, ganz kurz zur
Beschreibung des Problems. Darüber werde ich nicht lange reden.
Es gibt es ist ein großes Gebiet der Informatik,
Probleme richtig zu modellieren. Das werden wir in der Algorithmik
nicht tun. Aber trotzdem sollte man am Anfang einmal sagen,
dass eine korrekte Modellierung ganz wichtig ist,
weil sonst entwickeln wir einen Algorithmus fürs falsche Problem.
Das heißt, wir müssen erst immer darauf achten,
dass das Problem sauber spezifiziert ist. Dazu gehört, dass Algorithmen,
also dass die Probleme vollständig detailliert und unzweideutig beschrieben sind.
Und hier ist so ein kleines Beispiel aus dem Buch,
nicht aus diesem hier, aber aus dem anderen.
Einfach um nochmal diese Begriffe zu erklären, was das bedeutet.
Also eine Problemstellung, Umgangssprachlich wäre, dass man sagt,
lieber Herr Lokomotivführer, Er hat hier die Kommotive,
die an der Position B steht.
Bitte führen Sie ein, arrangieren Sie hier mal die Waggons anders.
Und zwar stellen Sie die auf Gleis A stehenden Wagen,
die heißen 1, 2, 3, in der Reihenfolge 3,
1, 2 auf Gleis C ab.
Das wäre erstmal eine umgangssprachliche Problembeschreibung für das,
was der Lokomotivführer machen muss. Und der Lokomotivbau muss sich
jetzt einen Algorithmus überlegen. Wir hatten nämlich elementare Anweisungen,
die er der Lokomotive geben kann, vorwärts fahren,
rückwärts fahren und muss das übersetzen in die eine Lösung für
das komplexe Problem,
diese drei Waggons in anderer Reihenfolge auf dieses Gleis C
zu stecken
Diese Beschreibung ist noch keine Problemspezifikation in dem Sinne,
weil sie Vollständigkeit, Detailliertheit und Unzweilleitigkeit noch nicht wirklich berücksichtigt.
Also hier sind ein paar Fragen. Nur Beispielfragen, wo
diese Eigenschaften verletzt sind. Wir kennen nicht bei der Problembeschreibung
die Funktionalität der Lok. Also für eine vollständige Beschreibung
müssen wir wissen, was die Lok kann.
Also insbesondere wie viele Wagen kann die auf einmal ziehen?
Kann die drei Wagen ziehen oder kann die vielleicht auch
nur ein oder zwei Wagen gleichzeitig ziehen?
Wäre Vollständigkeit
Die Operation, die man dann hat,
müssen detailliert beschrieben werden. Wenn ich jetzt sage,
die Lokomotive kann bis zu drei Wagen gleichzeitig ziehen.
Habe ich aber noch nicht gesagt, was jetzt Ziehen bedeutet.
Ziehen kann das, bedeutet das jetzt, die kann die
hier hinten andocken und dann kann die die so rumziehen?
Oder hat diese Lokomotive auch die Möglichkeit, so einen Wagen
vorne anzudocken und kann den vorne und dann rückwärts ziehen?
Also was bedeutet das Ziehen eigentlich? Zum Beispiel dafür,
dass diese Operation detailliert genug beschrieben werden müssen.
Und Zweideutigkeit, da geht es immer um die Lösung.
Also ist die Lösung
eindeutig spezifiziert
Wissen wir, dass wenn diese Bedingungen hier erfüllt ist,
dass es exakt das ist, was wir haben wollen. Ja,
und hier ist ein schönes Beispiel,
was vielleicht eine Lösung ist, die wir nicht haben wollen,
die wir aber nicht genau spezifiziert haben, nämlich,
dass die Lok am Ende irgendwo zwischen diesen Wagen steht und nicht mehr wegfahren kann,
dann ist prinzipiell natürlich alles erfüllt,
die stehen alle auf Gleis C und auch in dieser Reihenfolge,
aber die Lok steht dann irgendwo dazwischen.
Und das wäre eine Lösung, die wir gar nicht wollten.
Deswegen ist es wichtig, immer genau zu definieren, was man will.
Problemspezifikation ist wichtig für jemanden, der sich mit Algorithmen auseinandersetzt,
weil sie typischerweise nicht die Probleme eines Informatikers lösen,
die sind ja der Informatiker, sondern sie lösen das Problem eines Anwenders.
Und der Anwender wird diese formale Sprache in der Regel nicht sprechen.
Der formale, der Anwender kommt zu ihnen und sagt,
ja, ich habe hier das Problem mit der Log
und stellen Sie die mal da rüber.
Und sie als Informatiker oder hier als Logführer,
also sie als Informatiker, haben die Aufgabe im Dialog zu klären,
was er genau meint.
Ja, genau dafür zu sorgen, dass diese Spezifikation des Problems erfolgt.
Und das ist ein ganz wichtiger Bestandteil. Also die Spezifikation
vom Problem, die wird auch Modellierung genannt und über Modellierung
kann man
eine Menge nachdenken
Das werden wir hier nicht weiter tun. Ich wollte Ihnen
dieses Beispiel nur sagen, um auf die Relevanz hinzuweisen.
Und wir gehen jetzt immer davon aus im Folgenden,
dass wir sehr präzise und korrekt modellierte und spezifizierte Probleme haben.
So eine Beschreibung, gerade diese Aktionen hier, die hier stattfindet,
die kann man machen und wird auch häufig so gemacht,
indem man vor- und nachbedingungen definiert.
Und immer genau sagt, wenn ich eine spezielle Aktion habe
oder wenn ich eine spezielles Resultat berechnen will,
was muss genau vorher gelten und was muss danach gehen
Okay, willkommen zur Beschreibung von Algorithmen. Also die Frage ist jetzt,
wie machen wir das denn jetzt? Wie schreiben wir das
jetzt auf? Und da ist bei Algorithmen die Gefahr,
dass uns das Gleiche passiert wie bei den Problemen.
Wir beschreiben die Algorithmen-Umgangssprachlich und sind dann nicht präzise.
Und das wäre nicht akzeptabel. Wir müssen ganz genau angeben,
wie der Algorithmus funktioniert. Das heißt, die natürliche Sprache
ist nicht geeignet, um Algorithmen wirklich gut zu beschreiben.
Wir können Computerprogramme verwenden, das wäre eigentlich das Naheliegendste,
zu sagen, wir können alle programmieren, wir nehmen das jetzt,
wir machen das jetzt in Java oder in C oder irgendwas.
Das können wir machen, aber Programmiersprachen enthalten so viel Detail
Was wichtig ist für die Umsetzung des Programms auf dem Computer,
was für den Algorithmus gar nicht relevant ist.
Insofern würden Sie hier eigentlich übers Ziel hinausschießen.
Und das ist der Grund, warum wir Pseudocode verwenden.
Das heißt, wir bewenden eine Mischung aus den Kontrollkonstrukten von Programmiersprachen
mit natürlich sprachlichen Ausdrücken oder logischen Ausdrücken.
Das ist gut lesbar, ist aber zu dem hinreichend präzise,
damit man genau sagt, was eigentlich gemacht werden soll.
Das ist der Grund, warum man das macht.
Vielleicht noch auf der Vollständigkeit halber auch Hardwareentwurf,
ist natürlich eine Beschreibung von Algorithmen
Ja, wenn sie also mit in Hardware ein Rechenwerk beschreiben,
was noch eine Wurzel ziehen kann, dann haben sie einen Algorithmus,
der die Wurzel zieht und der wird über Hardware beschrieben.
Also auch Hardware ist seine Beschreibungsform für Algorithmen.
Das ist für uns aber nicht weiter relevant.
Wir machen Pseudo-Code, um das Ganze präzise zu beschreiben.
Pseudo-Code ist angelehnt an imperative Programmiersprachen, hier steht Pascal C,
Java ist das alles sehr ähnlich, in dem Teil.
Und auf der Basis werden Pseudo-Codes aufgeschrieben,
die Kontroll- und Datenstrukturen werden aus den Programmiersprachen übernommen.
Und Bedingungen, Funktionen, etc. werden gegebenenfalls natürlich sprachlich formuliert
Vorausgesetzt, dass es präzise genug. Also es darf natürlich
dadurch nicht zweideutig wehren. Das ist das Wichtige. So,
wenn Sie jetzt in verschiedene Lehrbücher gucken, dann sehen Sie,
die Pseudocodes sehen alle mal ein bisschen anders aus.
Das ist halt so. Es ist normalerweise überhaupt kein Problem,
weil die so einfach zu lesen sind,
dass man das sofort versteht, was eigentlich gemeint ist.
Wir werden hier die Konvention aus dem Kormen verwenden und werde
ich Ihnen jetzt einmal kurz vorstellen,
die finden Sie natürlich auch im Kormen und ich möchte Sie bitten,
also in Bezug auf die Übung,
Sie werden natürlich auch Algorithmen schreiben und abgeben in den Übungen,
diese Notation auch zu verwenden
Okay, also, die Pseudo-Code-Nutterkonvention aus dem Kormen sind Einrücken kennzeichnet,
die Blockstruktur. Es gibt also keine zusätzlichen Klammern.
Dann gibt es bedingte Anweisungen mit IF, LCF,
Ls, also das LTS kann auch weggelassen werden.
Er ist natürlich auch für die bedingte Ausführung. Es gibt Schleifen,
Wile 4, die alternativ mit Two oder mit Down-Two beschrieben wird,
wenn sie rückwärts zählen. Und es gibt Repeats,
es gibt eine Wile-Schleife und es gibt eine Repeat an Till-Schleife,
wenn die Bedingungen zur Prüfung am Ende steht
Ja. Also es sieht so aus,
Wile und dann steht hier eine Bedingung oder ist das eine Vorschleife,
ui ist schon der erste Fehler,
da steht die Variable und dann kommt hier ein Gleichheitszeichen in der neuen Nomenklatur
und dann ein spezieller Wert und dann kommt das zu und dann ein anderer Wert,
dann kommt die Anweisung oder bei Repeat hat man erst den Anweisungsblock und dann ist es an Till und dann die Bedingungen, ja.
Ich habe eine ganz kleine Sache ergänzt zu diesem Pseudo-Code-Konventionen bezüglich des Commons,
weil auf den Folien ist typischerweise nicht so viel Platz,
was ich mache, ist, dass ich genau wie in oder C,
wenn ich IF-Bedingungen oder Wildschleifen habe,
die ja dann nur eine weitere Anweisung haben,
dass sich dann die Bedingungen in Klammern schreibe und die Anweisung dahinter.
Das ist das Einzige, was ich zusätzlich habe,
weil sonst kriege ich die immer nicht auf eine Folie drauf.
Das habe ich dann ergänzt. Okay,
dann hat man hier dieses Slash-Slash für die Einleitung von Kommentaren und man verwendet,
und das ist also auch jetzt in der neuen Konvention so,
das Doppelgleichzeichen für den Vergleich und das einfache Gleich für die Zuweisung.
Ja, es ist also genauso wie in den Programmiersprachen und hier sehen Sie,
wie es früher war,
da habe ich nämlich noch dem Pfeil stehen,
also früher waren die Zuweisungen immer über so
einen Pfeil beschrieben
Bei dieser ganzen Umformatiererei wird es wahrscheinlich noch die eine oder andere Stelle gesehen geben,
wo ich mal das eine oder andere übersehen habe.
Und das müssen wir dann hier in der Vorlesung herausfinden.
Okay, so, dann Feldelemente werden durch eckige Klammern indiziert.
Also wenn wir ein Array haben,
das so A von I. Und hier gibt es sogar den Luxus,
dass man auch Teil Arrays bezeichnen kann,
indem man zwei Indizes mit Punkten dazwischen angibt.
Also A von I bis J ist dann ein neues Array,
was also ihr Element von I
bis J hat
Zusammenhängende Daten werden als Objekte verstanden. Und das Objektattribut hat
den Punktoperator um ein entsprechendes Element des Objekts zu bezeichnen.
Das ist auch so, wie sie das kennen.
Also zum Beispiel, wenn sie ein Array haben,
was A heißt, dann gibt es ein Attribut A.Länge.
Das bezeichnet dann die Anzahl der Elemente,
die in dem Array A enthalten ist.
Das ist anders hier als in der alten Notation,
in der alten Notation wurden die Objekte quasi in eckigen Klammern dahinter geschrieben.
Das war damals völlig okay, aber heute ist das so ungewöhnlich,
weil wir in allen objektorientierten Sprachen die Attribute immer hinter
den Objekten haben.
Deswegen hat man
das geändert
So, Funktionsparameter werden als Wert übergeben,
das sollten sie auch kennen, das ist ein C-So,
Call-by-Value, das heißt, wir legen eine Kopie an,
wir haben keinen Call by Reference, das heißt,
wir haben keinen Verweis auf das Objekt,
wenn sie also in einer Funktion den Wert ist der Variablen ändern,
wird das nicht übergeben an die aufrufende Funktion.
Wenn sie komplexere Objekte oder Arrays haben,
dann ist es anders, dann geht man davon aus,
das ist auch wie ein C oder Java,
dass man hier immer die Adresse des Objekts meint
So, dann haben wir bulsche Operatoren. Die werden träge ausgewertet.
Auch das ist wie in den Programmierschwachen, also WNC und Java.
Das heißt, wenn sie eine Bedingung haben,
X und Y, dann bedeutet das,
dass Y nur ausgewertet wird, wenn X wahr ist.
Und wenn sie X oder Y als Bedingung haben,
dann wird Y nur ausgewertet, wenn X falsch ist.
Ja, weil, wenn bei X und Y,
wenn X falsch ist,
dann müssen sie,
dass der Ausdruck falsch ist
Wahrscheinlich denken sie jetzt, oder sollten sie eigentlich,
sie sollen jetzt eigentlich denken,
was schert mich denn das in einem Pseudo-Code, ja?
Ob der das jetzt beides auswertet oder nur eins,
ist ja eigentlich egal, ja? Das ist insofern nicht egal,
weil wir ja die Komplexität der Algorithmen bewerten wollen und die
Auswertung von so einem Ausdruck kann im Zweifelsfall relativ schwierige und langwierige Operationen sein.
Insofern spielt es eben eine Rolle,
ob quasi das Y immer ausgewertet wird oder nur in dem Fall,
wenn X war, ist.
Okay, so, das sind die Pseudo-Code-Regeln
Ah, mit dem wir also hier in der Vorlesung arbeiten werden
und werden auch viele Beispiele sehen, wie die benutzt werden.
Hier ist erstmal unser GGT-Algorithmus von eben als erstes Beispiel,
wie das aussehen kann. Hier ist der Algorithmus so,
wie er eben schon da stand,
war so mehr sprachlich formuliert in den vier Einzelschritten.
Der GGT-Algorithmus iterativ wäre also so geschrieben, also weil Amodolo B,
also Modulo als Division mit Restoperation, größer als null.
Müssen wir also, also A, teilt noch nicht weh.
Dann wird R auf A Modolo B gesetzt, A wird auf,
also B wird auf A gesetzt und B, nein,
A wird auf den Wert von B gesetzt
Und B kriegt den Wert von AR und dann wiederholen wir ihr
die Schleife, was man hier nur an der Blogstruktur sieht.
Keine Klammern, die da sind. Zuweisung über ein Gleichheitszeichen hier.
Normalerweise stehen im Kormen in jeder Zeile immer nur eine Anweisung.
Ich mache abends halt auch sowas mit einem Semikolon,
einfach auch, damit ich das auf eine Folie draufkriege.
Okay, so, der GGT-Algorithmus, den kann man auch rekrusiv beschreiben.
Das ist dann sogar noch ein bisschen einfacher.
Also der GGT von zwei Zahlen A und B wäre eher,
ist also der Rest von der Division von
Geteilt durch B, wenn der Rest größer ist als null,
dann haben wir noch keine Lösung gefunden.
Dann berechnen wir den größten gemeinsamen Teiler von B und R. Anderenfalls geben wir B zurück.
Es ist einfach nur die rekusive Beschreibung des gleichen Algorithmus.
Ja, okay. So, soviel zur Beschreibung. Und jetzt,
wo wir in der Lage sind, die Algorithmen korrekt zu beschreiben,
können wir uns dran machen, um diese zu analysieren.
Das Ziel dabei ist, dass wir rausfinden möchten,
wie gut diese Algorithmen funktionieren ohne, dass wir sie implementieren und testen müssen.
Ja, das ist eigentlich unser Ziel.
Das ist der ganze Grund, warum wir diese Analyse machen.
Dass der Grund ist, weil Programmieren aufwendig ist. Ja,
das dauert lange, da macht man noch Fehler,
da muss man das Thema kompilieren und so.
Ja, da muss man Tests machen, bis man weiß,
dass alles funktioniert. Jetzt wollen wir möglichst vermeiden.
Wir wollen gerne schon direkt auf dem Papier entscheiden können,
ob ein Algorithmus, ein guter Algorithmus ist,
ob ein Algorithmus besser ist als ein anderer Algorithmus.
Und dann entsprechend Entscheidungen treffen und dann möglichst nur einen Algorithmus
implementieren und nicht fünf und dann nachher zu gucken,
welche alle fünf implementiert habe,
welches der bessere von denen ist
Unsere Ziele sind also zu bestimmen, welche Probleme überhaupt erst mal lösbar sind.
Für welche Probleme können wir überhaupt Algorithmen anbieten?
Es gibt Probleme, für die können wir keine Algorithmen anbieten.
Und diese zu beschreiben ist natürlich dann wichtig,
weil sonst suchen sie und suchen sie und suchen sie und finden überhaupt keinen.
Mit diesen Problemen werden wir uns nicht beschäftigen. Das ist nicht so ganz trivial,
sich mit Problemen zu beschäftigen, von denen man nachweisen kann,
dass sie nicht lösbar sind mit Computeralgorithmen, Computerverfahren.
Es gibt aber ein paar ganz Prominente.
Kennen Sie eins
Kennst du ihn denn, also jetzt sagen sie nicht,
vorherzusagen, wie das Wetter wird in zehn Tagen.
Also irgendwas, was formal spezifizierbar ist,
wo wir mit dem Computer keinen Algorithmus,
oder wo wir keinen Algorithmus angeben können, der dieses Problem löst.
Das Rucksack-Problem, das kriegen wir gelöst.
Das werden wir sogar noch machen in der Vorlesung.
Noch ein Vorschlag? Ja, das kann ich jetzt nicht
genau beantworten. Das weiß ich nicht. Kann sein,
kann nicht sein. Ich sage ihm mal einen ganz einfach,
noch einen Vorschlag,
Also Sie meinen, so kryptografische Probleme könnten gegebenenfalls zu nicht lösbaren Problemen werden.
Also meines Wissens führen kryptografische Probleme immer zu Algorithmen, die sehr,
sehr lange dauern. Also die Kryptografie ist größtenteils sicher,
weil wir zu lange brauchen, um etwas auszurechnen.
Aber da kenne ich mich auch nicht gut genug aus.
Kann sein, dass es da in dem Bereich auch was gibt.
Aber ich mache Ihnen mal einen Vorschlag in einem
ganz einfachen Problem
Wollen Sie noch? Super, das ist der Klassiker, das Halteproblem.
Also Sie haben einen Algorithmus, jetzt sehen Sie sofort die Selbstbezüglichkeit der Informatik.
Sie haben einen Algorithmus und Sie haben einen Computer und Sie fragen,
hält dieser Algorithmus für jede mögliche Eingabe, die Sie geben können?
Und dann könnte man sagen, ja,
das könnte ich ja simulieren und gucken,
ob der hält oder nicht hält, aber Sie haben natürlich unendlich viele Eingaben,
ist also nicht so einfach zu simulieren.
Und in der Tat ist es bewiesen,
dass dieses Problem nicht durch einen Algorithmus,
zumindest nicht mit einem herkömmlichen Computer, den Computermodellen,
von denen wir ausgehen, lösbar ist.
Aber so viele, also wir werden hier in der Vorlesung
keine weiteren, nicht lösbaren Probleme analysieren.
Wir werden uns hier erstmal darauf konzentrieren, was man lösen kann.
Und dafür wollen wir dann gute Lösungen finden. So,
dann kann einen natürlich interessieren, ob das Computermodell eine Rolle spielt.
Also ob ein super Duper-Computer mit 1000 parallelen Kernen irgendwie andere Probleme lösen kann,
als ein, keine Ahnung, ein 20 Jahre alter Spiele-Computer.
Das könnte man sich fragen und das ist eine sehr theoretische Frage,
mit dem beschäftigt sich die politische Informatik und bearbeitet das.
Auch das werden wir hier nicht so primär machen.
Aber auch dafür braucht man natürlich die formale Beschreibung von Algorithmen
und muss diese entsprechend analysieren können.
So, das, was uns interessiert, ist die Ressourcenfrage.
Also welche Ressourcen brauchen wir mindestens,
um das Problem zu lösen und welche Ressourcen benötigt mein Algorithmus,
um das Problem zu lösen?
Diese Frage ist zentral. Neben der Frage natürlich,
ob der Algorithmus überhaupt korrekt ist. Das ist natürlich mal
das Erste, was man gucken muss. Also ist er korrekt,
rechnet er immer das richtige Ergebnis aus und dann ist die Ressourcenfrage da.
Und diese Ressourcenfrage können Sie sich ganz einfach so vorstellen,
Sie haben hier eine Skala mit einem Zeitbedarf.
Und der Zeitbedarf ist jetzt irgendwas, Imaginäres.
Da stehen jetzt noch nicht Sekunden oder so dran.
Also irgendwas, was die Zeit bestimmt,
die notwendig ist oder auf der sie irgendwie Zeit messen können.
Es ist egal, auf der sie Zeit messen können.
So, jetzt gibt es ihr Problem. Ihr Problem können
Sie hier eintragen auf dieser Zeitskala, an irgendeiner Position.
Und das ist die Zeit, die notwendig ist zur Lösung dieses Problems.
Das ist irgendwie hier ein Punkt auf dieser Skala.
Das zu finden wäre unser Ziel. Herauszufinden für ein Problem,
wie viel Zeit brauche ich? Und wie sieht dann natürlich
der Algorithmus aus dafür, um dieses Problem zu lösen?
In der Regel ist das sauschwer, das zu machen. Ja,
wenn nur ganz wenige Beispiele sehen, wo wir das wirklich schaffen,
hier exakt zu sagen, das ist die Zeit,
die man braucht, fühlt zur Lösung des Problems.
Was wir machen ist,
wir schauen als Informatiker auf das Problem drauf und überlegen und sagen so,
ja, das kann ich ja so machen und so machen,
so machen und sie schreiben den Algorithmus auf und was sie dann erhalten,
ist ein Algorithmus für das Problem P, der auch einen speziellen Zeitbedarf hat.
Der Zeitbedarf liegt es hier irgendwo, ja,
der liegt auf alle Fälle rechts davon,
weil so viel brauchen sie ja mindestens.
Das heißt, alle Algorithmen, die das Problem lösen,
liegen also rechts von diesem Punkt und haben irgendeine speziellen Laufzeitbedarf
Jeder Algorithmus ist also eine obere Schranke für die Zeit,
die ich mindestens brauche, um das Problem zu lösen.
Jetzt haben Sie den Algorithmus. Das ist ein bisschen dumm jetzt,
weil Sie wissen nämlich jetzt nicht, ob Sie einen wirklich guten Algorithmus haben.
Es könnte ja sein, dass jemand anders noch einen
anderen Algorithmus hat, der kann das Problem schneller lösen.
Sie sind sich erst sicher, dass das nicht mehr der Fall ist,
wenn Sie wissen, dass Sie an diesem Punkt angekommen sind.
Dann wissen Sie, es geht nicht mehr besser.
So, wie kann man das prüfen? Das ist
sehr schwierig. Was wir aber machen können, ist,
wir können für Probleme untere Schranken für die Laufzeit angehen.
Wir können sagen, um dieses Problem zu lösen,
brauchen wir mindestens so viel Zeit
Ja, dann hätten wir eine untere Schranke. Und wenn wir es dann schaffen,
dass die untere Schranke mit der oberen Schranke zur Deckung kommt,
dann haben wir es hingekriegt,
dass wir das Problem so genau charakterisiert haben, dass wir wissen,
wie lange wir brauchen, um das Problem zu lösen.
In der Regel, wenn wir das nicht schaffen,
wir werden Algorithmen haben und so langsam nach hier vorhangeln,
aber ob wir hier angekommen sind oder nicht,
das wissen wir häufig nicht.
Also es ist nicht so, dass wir sagen, ja,
wir sind irgendwie hier und das geht auch noch ein bisschen,
wir wissen es nicht.
Wir wissen nicht, ob das, was wir haben,
das Beste ist, was geht.
Und es gibt ganz tolle Beispiele, wo man lange,
lange geglaubt hat,
man hat das effizienteste Verfahren
30, 40, 50 Jahre ist man davon ausgegangen,
das ist das Beste,
das kann gar nicht besser gehen, ist ganz klar.
Und plötzlich kommt einer, der macht es besser,
weil man diese untere Schranke eben nicht kennt. Okay,
so, bevor wir uns mit den Ressourcen beschäftigen können,
müssen wir erst mal noch mal ein bisschen über die Korrektheit reden.
Also unsere Algorithmen müssen erst mal korrekt sein,
sonst macht es gar keinen Sinn, darüber nachzudenken,
wie viele Ressourcen die verbrauchen.
Formal Korrektheit nachzuweisen von Algorithmen ist sehr nah an dem,
was man in der Mathematik durch Beweise macht.
Es ist hier genauso,
man muss also über Beweise quasi zeigen,
dass der Algorithmus korrekt ist
Man macht das, indem man für jede Anweisung Bedingungen definiert,
die vorher und nachher gültig sind.
Also so präzise macht man es dann typischerweise nachher doch nicht.
Das wäre so aufwendig, das aufzuschreiben, aber das ist der Gedankengang dahinter.
Also ich sage, was gilt vorher? Und was gilt nachher?
Also nach dieser Zeile hier gilt, dass es eine Variable B gibt,
die den Wert 1 hat und eine Variable Idelwert Null hat.
Das wäre die Nachbedingung von dieser Zeile her. So,
wenn man jetzt diese Bedingungen dann verknüpft, also jede Nachbedingung
einer Zeile, ist die Vorbedingung für die nächste Zeile.
Und dadurch kann man die in einer Beweiskette miteinander verknüpfen,
kann dann sagen, aus dieser Nacht Bedingung folgt die Vorbedingung für die Anweisung,
daraus wieder die Nachbedingung und so weiter.
Und dann kann man zeigen, ist korrekt. Dabei gibt
es allerdings ein Problem. Und das Problem sind Schleifen,
weil wenn sie jetzt eine Schleife haben,
also hier ist so eine Schleife, die läuft hier so rum,
dann kommen sie ja plötzlich wieder hier oben an und dann müssen sie wieder überlegen,
was gilt jetzt vorher und nachher.
Und irgendwie gilt ja jetzt was anderes,
weil jetzt ist das I ja, ist eine Vorschleife,
nicht mehr null,
sondern im nächsten Durchlauf ist das ja dann eins oder zwei oder drei.
So, das heißt, wir müssen irgendwie überlegen,
wie wir mit diesen Schleifen umgehen,
wenn wir auf diese Art und Weise die Korrektheit von Algorithmen
beschreiben wollen.
Das macht man durch eine sogenannte Schleifen-In-Variante
Und schleifen in Varianten, sind nichts weiter als eine,
als Bedingung, die formuliert werden für Schleifen, die die Eigenschaft haben,
dass sie vorwährend und nach Ausführung einer Schleife gültig sind.
Das hört sich sehr komisch an. Also ich kann mich noch genau daran erinnern,
wo ich da saß,
wo sie saß und mir mein Professor damals das erste Mal,
was von schleifenden Varianten erzählt hat und ich fand das total unlogisch,
weil ich möchte ja am Ende, dass aus so einer Bedingung,
die ich hier formuliere, die Korrektheit folgt von dem Ganzen.
Und da ist es irgendwie fraglich,
wie sind bei einer Schleife, wo sie ständig was verändert,
da ändert sich der Wert von I und erinnert sich der Wert von B,
warum ich hier eine Bedingung haben soll, die immer gleich ist.
Die ist aber notwendig, um die Korrektheit zu beweisen.
Und die Schleifen in Varianten haben die Eigenschaft,
dass sie genau typischerweise die Variablen, die Dinge,
die sich ändern in der Schleife, so miteinander verknüpfen,
dass die Gesamtausgabenaussage immer gleich bleibt.
So, ein ganz einfaches Beispiel ist hier,
ein einfacher Algorithmus zur Berechnung von A hoch K,
wobei K größer Null eine ganze Zahl ist.
Also wir müssen, wir machen nichts weiter als eine Variable B,
die wird mit eins initialisiert,
hieß ein Zähler,
der ist Null
Der hätte gar nicht initialisiert werden müssen.
Dann haben wir die Vorschleife, die läuft von Igarch 0
bis K und das B wird immer mit A multipliziert.
Und dann kommt am Ende offensichtlich A hoch K raus.
So, was könnte die Innenvariante sein? Also die Bedingung,
die immer gültig ist, während dieser Algorithmus läuft,
aus dem wir dann die Korrektheit schließen können des Verfahrens.
Diese Innenvariante, die steht hier, die Innenvariante besagt,
dass B zu jedem Zeitpunkt gleich A hoch I ist.
Das ist die Innenvariante. Das ist eine Bedingung,
die gilt vor Ausführung der Schleife. Deswegen ist ja
auch die Zuweisung, also A hoch 0 wäre 1,
also hier gilt das vor Ausführung der Schleife
Während der Ausführung der Schleife wird das I ja immer erhöht,
aber das B wird auch mit A multipliziert.
Das heißt immer, wenn die Schleife einmal ausgeführt wurde,
ist das B wieder gleich A hoch I.
Und nach Beendigung der Schleife können wir daraus die Korrektheit folgen.
Denn wir wissen, am Ende der Schleife ist
diese Schleife halt Ka mal durchlaufen.
Und am Ende haben wir hier in B-A hoch I stehen.
Irgendeiner von ihnen muss jetzt sagen,
die wird aber kaplos einmal durchlaufen
Sehe ich auch gerade. Genau, da müsste hier eine
einstehen oder eine k-eins. Kabinus 1, das wäre gut.
Okay, sehen Sie. Deswegen macht man ihn Varianten.
Da findet man die Fehler in den Algorithmen.
Ja. Okay, also das ist die InnenVariante,
die man braucht, um das zu machen. So,
der Rest ist eigentlich das, was man in der Informatik sieht.
Wir werden Korrektheitsbeweise sehen an einigen Stellen. Wir werden das
hier noch nicht so intensiv betreiben in dieser Vorlesung,
weil das ist meistens relativ schwierig, diese Beweise zu formulieren.
Das macht man dann eher im Hauptstudium,
aber an der einen oder anderen Stelle werden wir es sehen.
Die kommen gleich dran
Das wäre noch verwendet, nur um es vollständig zu machen,
ist vollständige Induktion, die kennen Sie auch aus der Mathematik,
weil man da ja von E auf E plus 1 entsprechend schließt.
Ja, das ist, das ist jetzt in der Kormen-Notation,
das steht vorne auch nochmal bei den Schleifen, geht man davon aus,
dass die Vorschleife sich genauso verhält wie in C oder ich
glaube in Java auch und da ist die Schleifenvariable E,
nachher definiert, als der erste Wert,
der außerhalb des Bereichs liegt.
Das ist in der Programmiersprache auch so. Das heißt,
nach Beendigung der Schleife ist das IK plus 1. Deswegen kommt
das hier auch nicht hin. Das ist ein Problem,
weil das macht bei diesen In-Varianten die Sache immer irgendwie kompliziert.
Ja, das ist schwierig. Hier in dem Fall hilft das dann natürlich,
weil wenn hier Kaminus 1 steht, die erste Bedingung,
die wir überprüfen hier,
wäre das I gleich Also wenn ihr Karminus 1 stehen würdet,
i gleich K wäre, dann wäre das ungültig.
Wir würden die Vorschleife beenden. Und dann wäre das i
gleich K. Also wie gesagt, die Annahme ist,
ich kann noch mal zurückspulen, da steht das auch.
Na, hier steht nur, dass die Variable definiert ist.
Nach C-Konvention. Und nach C-Konvention hat sie den nächst höheren
Wert. Aber das wird, also wie gesagt,
wenn man dieses, also diesen Punkt überprüft bei den Korrektheitsbeweisen,
ist es immer hakelig normalerweise.
Okay, so, zur Laufzeitmessung unserer Algorithmen
Idealerweise würden wir natürlich gerne die physikalische Laufzeit bestimmen.
Wir hätten gerne den Algorithmus auf dem Blatt Papier.
Sie sagen, keine Ahnung, irgendwie Intel, iThree-Prozessor,
so und so viel Gigahertz, so und so viel Speicher.
Und dann sagt sie ihre Analyse, zwei Millisekunden.
Das ist natürlich völlig utopisch,
weil das hängt dann ganz stark von dem Computer ab.
Dann haben sie einen anderen, da müssen sie das dann
anders berechnen. Es hängt von so vielen Details ab.
Es ist völlig illusorisch davon auszugehen,
dass man sowas leicht berechnen kann
Es hängt aber auch eben von so vielen Details der Eingabe ab,
die wir nicht alle berücksichtigen können in der Analyse.
Deswegen machen wir das nicht. Also wir werden uns gleich
jetzt und hier davon verabschieben, die physikalische Laufzeit zu bestimmen.
Das werden wir nicht machen, sondern wir machen einfach
Modellannahmen und wir werden die Laufzeit innerhalb dieser Modellannahmen bestimmen.
Und ich werde ihnen dann zeigen,
in der nächsten Vorlesung wird es sein, werde ich Ihnen zeigen,
dass das trotzdem enorm viel Aussagekraft hat,
obwohl wir so viele Annahmen machen.
Hier sind unsere Annahmen. Wir nehmen davon aus,
dass wir zunächst mal ein Uniformes Kostenmaß haben. Uniformes Kostenmaß heißt,
dass unabhängig von der Größe von operanten Operationen gleich lange dauern.
Also völlig egal, ob sie einmal eins rechnen oder eine Milliarde,
mal eine Milliarde. Für uns bedeutet das immer eine Zeiteinheit.
Das ist das erste. Unsere erste Annahme. Dann haben
wir das Rambodell als unsere Grundlage, so ein Rambodell.
Es ist ein theoretisches Modell von dem,
was wir heute als unsere Computer verstehen.
Es ist also eine random Access Machine,
das hat nichts mit dem Speicher zu tun.
Random Access Machine ist die Abkürzung Ram. Hier,
und zwar dieses Rambodell ist, wie gesagt,
wie ein Computer heute und die wichtige Eigenschaft ist,
dass der Zugriff auf Daten,
konstante Zeit kostet
Egal wo im Speicher das Lied, geht das in konstanter Zeit.
Das zweite Modell, der zweite Aspekt des Modells ist es,
dass wir einen Prozessor haben und die Algorithmen sequenziell ausgeführt wird.
Eine Anweisung nach der anderen wird ausgeführt. Wir können dann
die Zeiten entsprechend addieren. Okay, so, diese Annahmen hier können
unterschiedlich schwerwiegend sein. Wenn Sie sich mit Kryptographie beschäftigen,
wie Sie gerade schon als Beispiel genannt haben,
dann ist so ein Uniformes Kostenmaß nicht adäquat,
weil sie mit riesigen Zahlen operieren werden und dann dauert das unterschiedlich lang.
Da muss man eben andere Modellannahmen machen. Für die meisten Probleme
ist es okay. Auch dieses Ram-Modell ist natürlich die Frage,
ob das so richtig ist, also Zugriff auf Daten kostet konstante Zeit.
Klar, solange das im Hauptspeicher ist, geht das in konstanter Zeit.
Also es ist immer gleich viel, egal auf welcher Speicherzelle die Information steht,
aber dann haben sie in modernen Computern sowas wie ein Cash.
Dann haben sie natürlich ausgelagerte Dateien, sie haben Paging,
sie haben Festplatten oder sonst was,
wo Daten stehen und dann ist es eben nicht konstant.
Für unsere Probleme ist es in der Regel okay.
Also es ist dann nicht mehr okay,
wenn wir so große Datenmengen haben, dass wir wissen,
dass wir nicht mehr quasi mit dem Hauptspeicher als eine Einheit operieren können.
Okay, was wir dann noch machen, ist,
wir werden nur noch Schranken berechnen,
also wir werden nicht versuchen, es exakt zu machen,
sondern nur Oberschranken und wir werden alle konstanten Faktoren vernachlässigen.
Das heißt, es ist uns ganz egal,
ob das Ganze noch ein Faktor 2 oder ein Faktor 5 mehr braucht.
Das ist sowieso nicht bestimmbar, weil so ein Faktor in
der Laufzeit des Algorithmus wird ja schon allein dadurch gegeben,
dass sie einen Prozessor haben, der schneller oder langsamer getaktet wird.
Also insofern ist es völlig sinnlos zu versuchen,
irgendwie auf einem Faktor genau die Laufzeit anzugeben.
Wir werden also den nicht bestimmen können. Okay,
Wenn wir Speicher bestimmen, was wir auch,
also wenn wir ab und zu uns überlegen,
wie viel Speicher braucht denn der Algorithmus,
haben wir eben auch seine Modelleannahme, nämlich,
dass ein elementares Datenobjekt immer unabhängig von der Größe des Wertes konstant viel Speicher benötigt.
Also wir können eine beliebig große Zahl in einer Speicherzelle speichern.
Auch das ist natürlich eine Modellannahme,
die für Computer einem so in der Form eigentlich nicht gilt.
Okay, so
Jetzt haben wir quasi viele Annahmen gemacht,
die das Problem oder die den Algorithmus abstrahieren von dem Computer.
Der Computer spielt keine Rolle mehr. Wir haben so ein
einfaches Modell. Wir sagen, wir zählen mehr oder weniger
die Anweisungen, die wir brauchen, um das zu berechnen.
Jede Anweisung hat mehr oder weniger konstante Zeit. Damit haben
wir einen großen Teil der Komplexität in der Analyse herausgenommen,
weil wir nicht mehr genau die Details des Computers verstehen müssen.
Aber wir haben ein Element nach wie vor drin und das ist die Eingabe.
Die Eingabe können wir nicht komplett abstrahieren. Das wäre dann absurd,
weil je nachdem, welche Eingabe da in den Algorithmus reingeht,
wird es länger oder weniger lang dauern,
um ein Ergebnis zu berechnen
Was wir machen, ist, dass wir die verschiedenen Eingaben,
also die verschiedenen Instanzen, einfach reduzieren auf einen Parameter,
der die Größe der Instanz angibt.
Also nehmen wir mal das Beispiel sortieren, wir wollen sortieren,
dann wird die Laufzeit des Sortieralgorithmus natürlich davon abhängen,
wie viele Zahlen wir sortieren wollen,
aber je nach Algorithmus wird es auch davon abhängen,
in welcher Reihenfolge die Zahlen da drin stehen.
Wenn die zum Beispiel schon sortiert sind,
dann kann vielleicht ein Algorithmus das ganz schnell berechnen,
indem man einfach mal guckt,
sind schon sortiert und dann sind wir fertig.
Wenn die ganz durcheinander sind,
braucht der Algorithmus vielleicht länger
Das heißt, die Reihenfolge würde eine Rolle spielen,
aber wir können keine Analyse machen, wo wir sagen,
für jede mögliche Reihenfolge rechnen wir jetzt aus,
wie lange das dauert.
Deswegen abstrahieren wir von dem genauen Detail der Eingabe und beschränken uns auf die Größe.
Wir sagen einfach nur, wie viele Daten wollen wir sortieren?
Und dann machen wir dafür die Analyse. Da gibt es
jetzt also unterschiedliche Fälle. Da gibt es den einen Fall,
da wird es ganz schnell gehen und den anderen,
da wird es lange dauern.
Deswegen haben wir im Prinzip drei verschiedene Fälle. Wir haben
den Worst Case, den Average Case und den Best Case.
Im besten Fall wird die Eingabe für diese Endzahl,
die wir sortieren wollen,
so sein,
dass der Algorithmus
ganz schnell ist
Im ungünstigen Fall müssen wir das alles sortieren,
das dauert ganz lange, das ist der Worst-Case und ein Average-Fall wäre,
also der Average-Case wäre halt die Situation,
dass wir einfach gucken, was passiert denn so im Mittel.
Diese drei Fälle werden in der Analyse unterschieden. Ja,
und damit berücksichtigen wir den genauen Aufbau der Eingabe.
Wir gucken also nicht genau darauf, wie ist die Eingabe,
sondern wir sagen einfach nur, was der ungünstigste Fall.
Oder was ist der typische mittlere Fall oder was ist der
beste Fall? Das, was wir machen werden,
ist fast fast immer den Worst-Case zu analysieren.
Das ist das, was uns interessiert. Also wenn es
mal schneller geht, freuen wir uns,
aber sonst wollen wir eigentlich wissen,
wie viel Zeit braucht der Algorithmus denn mindestens
Eine Eingabe einer speziellen Größe. Deswegen machen wir eine Worst-Case-Analyse
. So, und ja, was wir tun,
ist, wir bestimmen eine sogenannte asymptotische Laufzeit.
Asymptotische Laufzeit bedeutet, wir gehen davon aus,
die Eingabe widmet der Zeit, die wird immer größer.
Wir sortieren erst mal fünf Zahlen, dann sortieren wir mal zehn Zahlen.
Also wenn wir nur sagen, wir sortieren zehn Zahlen,
dann wird da irgendeine Zeit rauskommen.
Aber wir können nicht wirklich sehen, wie der Algorithmus sich verhält.
Deswegen müssen wir gucken, was passiert. Wenn die Eingabe
immer größer wird. Deswegen machen wir eine sogenannte asymptotische Analyse.
Wir fragen uns, wie verhält sich die Laufzeit des Algorithmus,
wenn die Eingabe immer größer wird
Okay. Also der Standardfall ist asymptotische Laufzeitanalyse im Worst Case.
Und mit Worst Case ist immer gemeint, dass unter allen
Eingaben mit einer speziellen Größe wir den ungünstigsten Fall annehmen.
Darauf bezieht sich Worst Case. So, was wir dafür brauchen,
als unser wesentlichstes und wichtigstes Konstrukt ist die O-Notation.
Die O-Notation muss sich glücklicherweise hier nur wiederholen,
weil die haben sie schon in verschiedenen Vorlesungen gesehen.
Und das mache ich deswegen hier auch relativ flott. Zunächst erstmal,
warum ist diese O-Notation wichtig, weil die U-Notation ermöglicht uns die Größenordnung der Funktionen zu beschreiben.
Wir haben also verschiedene Funktionen, das sind Laufzeit,
klassentypische Laufzeit, Klassen, die haben auch einen Namen,
also es ist eine konstante Laufzeit,
egal wie groß das Ende ist, Ende ist jetzt die Eingabegröße,
brauchen sie immer gleich viel Zeit, das ist konstant.
Und weil wir Faktoren vernachlässigen, bezeichnen wir diese Funktion dann als eins,
können wir auch mit irgendeinem Konfaktor multiplizieren, aber es ist egal.
Und hier haben sie jetzt unterschiedlich große Eingabe, also zehn Zahlen sortieren,
tausend Zahlen, eine Million Zahlen, haben sie eins.
Andere Laufzeitklassen sind zum Beispiel die lineare Laufzeit,
also N, das heißt, Wenn also die Laufzeit,
wenn die Daten sich hier verhundertfachen, dann verhundert sich,
facht sich auch die Laufzeit.
Es geht also hier, bei Eingabe müsste 10, 100,
11 Millionen, geht das so von eben auch 10, 101 Millionen.
Und jetzt können wir natürlich auch jede beliebige andere Funktion verwenden.
Also wir haben quadratische Laufzeit. Da würde bei der Eingabegröße 10,
hätten sie nur 100 stehen, bei 1000 schon eine Million
und hier schon 10 hoch 12.
Und im ganz schlimmen Fall hätten sie sowas wie ein exponentielles Laufzeitverhalten.
Ja, da hätten sie hier bei 10,
sie schon, also 2 hoch 10 ist
ungefähr 1000. Und bei 1000 hätten sie schon was für in
der Größenordnung von 10
Es ist schon sowas wie die Anzahl der im Weltall vermuteten Atome,
wie sie hier sehen. So viel Zeit werden sie wohl
nicht haben, um das Problem zu lösen. Okay,
also sie sehen, dass diese Laufzeit, diese Klasse,
die Funktionsklasse, in der wir uns befinden, wenn wir die Laufzeit angeben,
ein ziemlich gutes Bild davon gibt, wie die Funktion,
die Laufzeit wachsen wird, wenn die Eingabe größer wird.
Und genau das ist unser Ziel. Unser Ziel ist es
, diese Laufzeitklasse zu ermitteln in der Analyse
Okay, oh Kalkhöhl, Definition. Hier zunächst mal textuell und dann runter die mathematische Formulierung. Eine Funktion F ist höchstens von der Ordnung G,
falls Konstanten C und N 0 existieren,
mit null kleiner gleich F und N,
kleiner gleich C mal G von N,
für alle N größer als N 0. Oder kurz schreibweise der Mathematik,
es existiert eine konstante C,
größer Null und es existiert ein N 0, größer Null,
sodass für alle N größer ein Null gilt,
null kleiner gleich L von N, kleiner gleich C,
mal G von N.
Das Erste, was wir sehen ist,
wir interessieren uns nur für positive Funktionen, ja,
negative brauchen wir hier nicht,
weil wir wollen ja
Laufzeiten angeben
Konstante Faktoren werden vernachlässigt, das heißt, es reicht zu sagen,
dass diese Funktion kleiner gleich dieser anderen Funktion ist, mit irgendeiner konstant.
Es muss nur eine Konstante geben. Hier steht ein Existenzquantor
, es existiert eine konstant. Welche interessiert uns nicht,
ob das jetzt zehn ist oder eine Million, ist egal.
Und es muss so ein Null geben, was gerade diese
Asymptotik beschreibt. Das heißt, uns interessiert auch nicht,
was für kleine N passiert,
aber irgendwo muss es so ein N-0 geben und wenn
das Ende erstmal größer ist als dieses N-0,
dann muss diese Funktion F&N durchgehen
von N beschränkt sein
Das ist quasi die Definition des Okalkühls, die sie,
wie gesagt, schon in FGI 1 gesehen haben und wahrscheinlich
auch in der einen oder anderen Mathe-Kurs.
Wir schreiben F&N gleich O von G von N.
Hier gibt es unterschiedliche Meinungen. Es gibt Leute,
die schreiben hier Elementssymbole, die Informatiker überwiegend verwenden,
Gleichheitszeichen an dieser Stelle. Auch ein Elementssymbol ist eigentlich sinnvoll,
weil O von G von N eine Menge beschreibt.
Es ist die Menge aller Funktionen, die im Wachstum
nicht stärker sind, als diese Funktion G.
Es ist also eine Menge, könnte man
also Mengensymbol verwenden
Aber ich werde ihn in der nächsten Vorlesung noch ein bisschen zeigen,
wie wir mit dem O-Kalkül arbeiten und rechnen werden.
Und da werden sie sehen, dass wir in einer sehr
flexiblen Art und Weise des O-Kalkül sowohl für diese Klasse verwenden.
Dann ist es eine Menge, als auch für die Repräsentanten
, für einen Repräsentanten aus dieser Menge.
Und deswegen arbeiten wir hier, genau wie im Kommen,
mit dem Gleichheitszeichen an der Stelle.
So, neben Groß-O gibt es auch noch Klein-O,
Omega und Klein-Omega und Tetter.
Ich werde es Anfang der nächsten Vorlesung nochmal machen,
aber kann ich schon mal sagen,
wir brauchen im Wesentlichen das Groß-O und das Tetter
Gut, das zur Definition des OK-Kühls.
Wir machen hier mal Schluss und wir sehen uns wieder
am Freitag