CS 210 – Algorithms and Data Structures (Summer 2026) · unit page · YouTube
2026-04-22, 23:41

Click any sentence to play from there.

The transcript was generated automatically by YouTube's speech recognition and is offered as is. It may contain errors, in particular in concerning technical terms, names and formulas.

0:03 Im folgenden möchte ich Ihnen ein paar Klassen aus dieser auch umfangreichen Bibliothek von Klassen aus diesem äh Algorithmenbuch vorstellen. Also, das ist aus äh hier steht's noch mal äh diesem englischen Buch Algorithms Fourth Edition von Robert Satchwick Kevin Wayne. Das haben wir in der Bibliothek auch in der deutschen Übersetzung. Tatsächlich haben wir die physischen Bücher und das Ebook, glaube ich, nur in der deutschen Übersetzung und es gibt ein zwei physische englische Exemplare, die alle ausgeliehen sind. Falls Sie der Meinung sind, dass das Englische schöner ist, können wir auch noch mal fragen, ob wir noch Budget haben, da welche nachzubestellen. Das wurde in der Vergangenheit nicht so viel benutzt, deswegen haben wir da nur zwei Exemplare. Es gibt aber jetzt eine Reihe von Englischen, die schon da sind und das Ebook auch. Ähm, anders als bei meinem Buch bei Springer können Sie nicht einfach das PDF runterladen, sondern Sie müssen über das Online System des PDF im Browser lesen. Es ist unfassbar bequem, aber sie kommen wenigstens kostenlos ran. Äh und das gibt ja die paar Exemplare dann auch im Lehrbuchbestand.

1:09 Aus diesem Buch, wie gesagt, sind diese Klassen entlehnt. Die sind auch äh Open Source mit einer liberalen Lizenz auf Gitab verfügbar bzw. Weise auf der Webseite. Das heißt, sie können da ähm Reihe mit rumspielen. Ich will nur ein paar davon rausgreifen, damit sie über die Bescheid wissen, denn wir möchten auch versuchen, die in den Programmieraufgaben einzubinden. Äh dazu ist der aktuelle Stand, dass ähm dass es noch so ein bisschen ähm äh im Experimentiermodus ist, wie wie leicht das geht, dass man auf Kilonova sagt, die äh Bibliothek, die wir hier erlauben, die ist immer schon im Standardumfang mit drin und sie müssen die nicht irgendwie explizit hochladen mit einbinden. Ähm nur dann ist es wirklich bequem für die Programmieraufgaben. Abgesehen davon dürfen Sie natürlich trotzdem die Klassen verwenden für alles, was nicht direkt auf Kilonova ist. Es wird auch ein paar Programmieraufgaben geben, wo sich die Einreichung auf Kilonova vielleicht nicht so eignet.

2:17 Ich zeig vielleicht einmal noch ähm die nennen das Bookside für diese Bücher hier. Das ist eigentlich das Algorithmenbuch. Da gibt's Teile des äh Inhalts vom Buch auch in Kurzform auf der Webseite. Und es gibt hier den Teil Code. Da finden Sie ähm auch diese Ax 4J Char hier.

2:41 Äh und einige der Klassen sind hier auch noch mal explizit erwähnt. Wie gesagt, die Algorithmen, zu denen wir dann irgendwann kommen, sind die wesentlichen dem roten Buch. Diese Standbibliothek verwenden Sie viel auch in diesem Einführungsbuch. Amerikanisches System, da gibt's so äh Intro Courses, so diese CS101 heißt da zwar anders in Princeton, aber hat auch so eine Nummer ähm wie Sie vielleicht wissen, in USA fangen sie nicht unbedingt direkt mit einem festen Fach an, sondern sie fangen allgemein an der Uni an und können sich dann noch ein bisschen orientieren. Und das ist sozusagen der Kontext. Da gibt's so ein im ersten Jahr ein Einführungsmodul, was so einen breiten Rundumschlag über die Informatik geben soll und auch ein bisschen Werbung machen soll, dass man dann als Major Informatik wählt. Das ist so ein bisschen der Kontext. Deswegen passt dieses Buch auf keins der deutschen Module so ganz. Da ist so ein bisschen was von allem drin und aber alles noch nicht so tief. Aus dem Kontext ist aber auch hier ähm wie gesagt diese Standardbibliothek da, wenn Sie mehr dazu lesen wollen oder Beispiele sehen wollen, dann finden Sie die hier.

3:49 Obwohl das eigentliche Algorithmenbuch das rote ist. Hatte ich letztes Mal schon erwähnt, die Standardbibliothek in Java muss eben allen gerecht werden, den Profientwicklern, die das Tag für Tag verwenden wollen und eben so ein Stückchen auch ihnen, die sie gerade erst anfangen und da ist die Rücksichtnahme auf Anfänger, Anfängerinnen begrenzt. Außerdem gibt's noch so ein Java ist ja nicht die älteste Sprache, die man so lernen kann als Programmiersprache, es war auch nicht die jüngste. Und es ist unfassbar schwierig in der Standardbibliothek Dinge zu ändern, die dann nicht rückwärts kompatibel sind. Deswegen ist es sehr schwer Designfehler zu beheben, die man so in der Stürm und Drangzeit von Java durchaus begangen hat. Teilweise einfach auch ähm sich ändernde Tendenzen oder Präferenzen der Entwickler. Hier ein paar Beispiele, die ihn vielleicht nicht viel sagen, aber vielleicht auch doch. Äh, es gibt eine Klasse Date in der Java Runtime Library, die repräsentiert, was der Name angibt, ein ein Datum oder ein Zeitpunkt.

5:01 Und äh die ist eigentlich ein Wert. Ja, ein ein Datum ist ein fester Tag. Ähm der ändert sich nicht. Das sollte ein mathematisches Objekt sein. Wenn Sie zu einem Datum zum nächsten Tag gehen, dann ist es ein neues neues Objekt. So würde man das implementieren wollen heutzutage als immutable Data Type. Hat ganz viele Vorteile für paralleles oder nebenläufiges Programmieren und so weiter und so fort. Macht das Programmieren weniger fehleranfällig. Ist heute Konsens. Hat man aber damals aus unerfindlichen Gründen anders gesehen und hat eine Klasse gemacht, die mutable ist. Und das äh hat die Leute so sehr genervt, dass mittlerweile es ähm separat eine neue Klasse gibt. Äh die haben ein extra Package, weiß ich gar nicht mehr auswendig, Dateime und so weiter. Gibt's gibt's eine ganze Reihe von Klassen, die jetzt einfach diese ersetzen und immutable sind. An der Stelle reicht also, dass sie die neuen kennen. Warum es mir hier nur geht, ist es gab Dinge, wo man sich in Nachhinein einig ist, die sind ein Fehler gewesen, die würde man gerne ändern, aber diese Klasse jetzt einfach aus der Steuernbibliothek zu entfernen würde natürlich allen möglichen alten Code in irgendwelchen Legacy Systemen zerstören. Deswegen hat man das nicht gemacht. Ähnlicher Punkt. Äh vielleicht kennen Sie diese Klassen, Vector, hashtable, Stack. Wer hat die schon mal gesehen?

6:26 Wenn die irgendwo vorkamen in der Vorlesung, dann immer nur mit diesem mit diesem Zusatz bitte nicht verwenden. Hat jemand die schon mal gesehen? Ein der drei noch ein zwei der drauf aufbauen würde ich sagen. Sehr gut. Äh vergessen Sie sie auch sofort wieder. Ähm die sind alle alle Methoden synchronized, was für nebenläufiges Programmieren gedacht ist. Das heißt, die kann immer nur ein Them Zeitpunkt ähm ausführen. Das ist aber gleichzeitig langsam und zu schwach, um wirklich nebenläufige Systeme sicher zu machen. Eine Frage.

7:07 Genau. Mutable. Immutable. Immutable ist was man normalerweise will. Das heißt einfach unveränderlich. z.B. äh ein int ist jetzt kein tolles Beispiel. Nehmen wir Integer.

7:45 Wenn Sie ein Objekt von der Klasse Integer haben, dann repräsentiert das eine Zahl, ein int ein Rappertyp kennen Sie. Äh und diesen Wert kann ich nicht verändern. Das ist sozusagen eine Möglichkeit im Mutable zu erreichen ist, dass alle Class Members final sind. Natürlich nicht streng genug, wie Sie aus dem Java Quiz wissen. Final von einer Referenzvariable heißt ja nur, dass die Referenz sich nicht ändern kann, aber das Objekt könnte seinen Zustand verändern. Und das ist genau das, was Immutable einem garantiert. Das kann keiner lesen, gell? Versuch mal. Der Stift spinnt ein bisschen heute.

8:33 Etwas deutlicher zu schreiben. Immutable Klassen haben genau die Eigenschaft, dass wenn sie eine Referenz auf so ein Objekt haben und die Referenz ist final, dann ändert sich auch der Wert von dem Objekt nicht, weil das Objekt sich gar nicht verändern kann. Das ist genau der Grund, warum man das gerne macht.

8:51 Also im Prinzip sollte ich hier dazu schreiben, diese zwei Designfehler, das ist ah, das nervt tierisch. Kriege ich das denn gelöst hier? Das ist nicht Teil von Prüfungsstoff. Da ging es mir nur drum zu illustrieren, warum manche Sachen in so einer Standardbibliothek nicht so schön sind, wie man sie gerne hätte, weil man sie rückwirkend nicht leicht ändern kann.

9:15 Immutable ist aber wertvoll sonst zu wissen. Ähm das ist ein Konzept, was was Sie, wenn sie Software entwickeln definitiv im im Kopf behalten wollen. Für all diese Dinge, das ist jetzt auch noch mal definitiv kein Prüfungsstoff, aber wenn Sie guter Entwickler werden wollen, dann könnten Sie ähm Effective Java mal lesen.

9:45 Joshua Block, der hat einen signifikanten Anteil der Javaabibliothek geschrieben. Bild ein O und hat ein Buch darüber geschrieben über letztlich gute ähm Designmuster speziell in Java. Da wird auch viel über Immutable dann gesagt.

10:13 Okay, aber das nur am Rande, das ist natürlich auch wieder ähm nicht Teil äh unserer Vorlesung. Aus all diesen Gründen haben wir ähm uns entschlossen, diese Bibliothek auch zu verwenden, die in dem Algorithmen, dem roten Algorithmenbuch eingeführt wird, die für diverse Funktionalitäten so einen vereinfachten Zugriff einfach definiert. Gleich ein paar Beispiele dazu. Ähm, genau hier der das Sternchen mit den Programmieraufgaben ist in Arbeit. Gibt's dann demnächst äh Updates zu.

10:50 Der erste Punkt, da geht's um einen und Ausgabe. Kennen Sie bestimmt oder ich hoffe ganz arg, dass Sie das aus den anderen Veranstaltungen noch kennen. Ähm ist im Wesentlichen eine Errungenschaft von Unix, eine gute Abstraktion, die sich so sehr bewährt hat, dass wir sie seit dem vielleicht fast 50 Jahren unverändert verwenden, nämlich diese Idee von Eingabe und Ausgabe Streams. Ein Programm ähm als Prozess im Betriebssystem äh kann aus dem Standard in Stream Eingaben lesen und Ausgaben auf Standard Out schreiben. Das sind beides einfach letztlich Textstreams.

11:29 Ähm die erstmal keine vordefinierte Größe haben, sondern Stream heißt, ich kann da so viel reinschieben, wie jemand anderes dann bearbeiten kann und einlesen kann ich so viel wie eben kommt. eventuell muss ich auf die nächste nächsten Zeichen warten. Kennen Sie in Java ist äh dort genannt System in, System out. Ähm zusätzlich dazu gibt es noch äh diese Aufrufparameter von einem Java Programm. Also das, was sie hinter den Aufruf schreiben, das ist das, was in public static void main string ar landed.

12:20 Ja, diese Dinger hier, das sind die Commandline Arguments, getrennt an Leerzeichen oder an Whitespace. Die sind noch mal unabhängig von Standard in Standard out. Kennt ihr wag, denke ich alles. Äh insbesondere gibt's dann unter Unix die Möglichkeit, diese äh Streams von einem Programm in das nächste Programm zu pipen. Oder man kann die eine Datei umleiten oder aus eine Datei in ein Programm einlesen, also sousagen den Inhalt einer einer Datei in Standard für einen Prozess äh pipen. mal gleich ein paar Beispiele noch sehen.

13:05 In Java haben auch diese Klassen System in, System out so ein paar Eigenschaften, die vielleicht die man nicht unter allen Umständen so brauchen kann. Äh auch da sind die Details ähm nur sozusagen als Begründung, warum es Sinn macht, da ein bisschen was wegzukapseln. Aber da es so ein bisschen für Kyonova relevant ist, vielleicht doch einmal erwähnt, System in kann nicht bequem direkt integer oder Doubles oder sowas parsen. Die bequemste Version dafür ist dieses diese Scannerklasse, die man aber dann jedes Mal erst noch importieren muss und dann anlegen. Al ist so ein bisschen bisschen lästig, nicht schlimm, aber braucht mehr mehr Zeichen. Ähm System out ist an und für sich okay, aber was man wissen sollte, wenn man sehr große Ausgaben produziert, dass jede jedes jedes Newline ein Flush von dem Puffer bewirkt und das wiederum bedeutet dann einen relativ teuren Aufruf, der dafür sorgt, dass die Ausgabe dann auch wirklich ausgegeben wird. Äh zusätzlich noch in nebenläufigen Programmen ähm wird dafür gesorgt, dass sich die Ausgaben verschiedener Threads nicht komplett mischen, nur zeilenweise.

14:16 Auch all das hat noch Synchronisationoverhead. Wenn man also sehr viele Daten produzieren muss, wenn es wirklich Performance relevant ist, dann ist System out selbst unbequem. Man kann das äh beschleunigen, indem man das noch mal explizit puffert. Dann äh macht System out natürlich trotzdem noch, was es vorher schon getan hat, aber man hat einen Puffer davor geschaltet, der das dann beschleunigt.

14:44 Dann gab's noch so ein äh wir hatten über Character Encoding ganz kurz letztes Mal gesprochen, noch so ein nördiges Thema, die die sind beidorientiert und nicht zeichenorientiert, was dann manchmal bedeutet ähm, dass sie auch nicht leicht auf ein standardisiertes äh Zeichencoding äh umgemünzt werden können. Nicht so wichtig. Ähm, lass mich lieber die Lösung präsentieren, die wir hier verwenden. Es gibt für Standard in diesen Rapper, der heißt Standard In. Das ist eine Klasse, aus den alle Klassen in diesem Paket sind diesem etwas länglichen Package untergebracht, wie das in der Javawelt so üblich ist, in Domaennamen rückwärts. Weil die eben in Princeton sitzen, ist das dann Princeton at You. Ähm und Standard In hat eben so Klassen wie also so Methoden, wie man sie aus aus Scanner kennt. Man kann fragen, ob es noch Zeichen gibt und man kann äh in double booli direkt parson und dann gibt's noch so ein paar Hilfsmethoden, die manchmal auch bequem sind, wo einem gleich mehrere Dinge aus der ganzen äh Eingabe gelesen werden.

15:57 Ähm, was gibt's dazu noch so zu sagen? Ich habe gleich noch ein Beispiel, wo sie einmal in Aktion sehen können. Also oft ist bequem, um Strings einzulesen, dass man das zeilenweise macht. Man kann es auch zeichenweise machen oder eben auf dem Level von äh einzelnen Zahlen oder anderen Elementartypen.

16:25 Äh Standard in, das ist jetzt ähnlich wie System. System in besteht aus statischen Methoden. Das ist also kein Objekt, was Sie instanzieren, sondern äh es gibt ein Standard in und dann können Sie die Methoden aufrufen. Es gibt auch eine Variante ohne Standard davor, was Sie instanzieren können mit einer Quelle, was die gleichen Methoden hat. Das ist ganz ganz bequem, wenn man außer Datei einlesen will, dann schreibt man einfach new in und dann den Dateinamen oder auch eine URL und die Bibliothek kümmert sich dann darum, dass das eingelesen wird und man kann die gleichen Methoden verwenden, die man in Standard in als statische Methoden hat. Die hat dann in als instanzbare Methoden.

17:04 Manchmal manchmal bequem. Für Standard Out äh gibt's auch so ein Rapper, der ähm weniger wichtig ist, weil System Out weniger kaputt ist. Das funktioniert auch so. Vielleicht gefällt's Ihnen besser. Lasse ich ihn lasse ich ihn. Äh es gibt auch wieder die objektorientierte Variante, mit der man in Dateien oder äh Streams schreiben kann. werden wir vielleicht nicht so viel verwenden.

17:33 Äh schauen wir uns ein Mini Beispiel an, wie das aussehen kann. Das ist ein Programm, das äh Zahlen von der Eingabe liest. Also, ich habe hier so eine Schleife, die so lange läuft, bis Standard in Empty ist. Was heißt das denn eigentlich Standard In ist empty? Ich hatte vorhin ja gesagt, so ein so ein Eingabestream ist quasi unbegrenzt. Der kann ja nie leer sein. Kennt jemand die Unix Konvention dafür?

18:01 Okay, können ja gleich noch mal äh drüber nachdenken. Ich werde es dann auflösen. Solange es also noch was zu lesen gibt, versuchen wir ein Double einzulesen. Dann berechnen wir den Durchschnitt. Also, wir summieren die auf und teilen am Ende und wir machen uns mal keine Gedanken um jetzt um die numerische Präzision, sondern es geht einfach nur um das äh Interagieren mit Eingabe und Ausgabe.

18:35 Dann probieren wir das mal da diese Klassen. Ähm, ich versuch mal mit einer Hand. Da diese ähm Klassen aus der Bibliothek hier in dem Extra Jar liegen, muss ich das in den Class Path immer einbinden. Da bin ich mir nicht sicher, wie sehr sie damit schon mal gequellt wurden oder auch nicht. Also erstmal brauchen sie immer so ein Import Statement, wie auch ja für Klassen aus der Java Standard Standardbibliothek, die nicht in Java Lang liegen. Also, wenn Sie Scanner verwenden, schreiben Sie immer import Java Util Scanner oder sonst was. Äh, das gleiche können Sie hier auch machen. Äh, mit dem Stern importiert man alle Klassen, dann haben wir die alle und der Rest ist äh der Code von der Folie einfach kopiert.

19:48 Um das zu kompilieren, müssen Sie Java C verwenden. Kennen Sie. Und wenn ich das jetzt einfach so aufrufe, dann funktioniert es nicht, weil die Klassen hier unbekannt sind. Ja, Java schaut immer im Class Path nach irgendwelchen importierten Klassen. Der Standard Class Path ist alles, was das die Java Runtime enthält plus das aktuelle Verzeichnis. Aber keins von diesen beiden Dingen enthält diese Ax 4J Klassen. Das heißt, der Compiler beschwert sich, ich weiß nicht, was du hier meinst. Die Klasse kenne ich nicht. Ähm, hilf mir mal. Und wir helfen ihm, indem wir diesen Glass path explizit setzen und dafür müssen Sie dieses Jar runterladen. Habe ich jetzt schon vorbereitet, damit wir das nicht noch mal machen müssen. Ähm, aber hatte ich Ihnen ja vorhin gezeigt. Finden Sie hier auf dieser äh Website mit dem Code äh Junk sehr kleinang.

20:59 Also der der Order, den ich mir gemerkt habe, ist hier unter diesen Klassen. Da ist das Char verlinkt. Sie können auch das aus äh GTA holen.

21:15 Damit kompiliert das, wenn ich jetzt hier mein Average wieder dazu packe. Keine Ausgabe ist eine gute Nachricht. Wenn ich das jetzt versuche auszuführen, habe ich das gleiche Problem. Ich kann natürlich sagen Java average und dann kriege ich wieder die gleiche Fehlermeldung. Du benutzt die irgendwelche Klassen Standard in, die kenne ich nicht. Hilf mir mal. Also auch hier müssen wir wieder einen Class path angeben. Also genauso wie vorhin.

21:46 Jetzt habe ich den Class Path auf das Char gesetzt und average hinten dran. Jetzt sollte es gehen, oder was passiert, wenn ich Enter drücke? Ja, genau. Jetzt fehlt Average. Ich muss auch den aktuellen Ordner wieder mit einbinden. Und der Unix mit einem Doppelpunkt Windows Semikolon, ne? Und dann geht es. Jetzt würde er die Klasse ausführen. Jetzt muss ich irgendwelche Zahlen eintippen.

22:17 Jetzt habe ich Zahlen eingetippt, aber der hört nicht auf, der wartet. Jetzt kommen wir auf die Frage von vorhin zurück. Was bedeutet Standard in ist empty? Dafür muss ich das End of file äh Symbol schicken. Ja.

22:32 Äh End of Line geht nicht. Ich habe hier schon Enter gedrückt. Das ist ja ein New Line Character. Undter Unix ist Steuerung D, was das äh Ender File Symbol schickt. Ähm kann man natürlich, wenn man den Stream generiert als String ist es auch einfach irgendein ein Askzeichen. Steuerung D ist das, was Sie tippen müssen, wenn Sie es in der Shell benutzen. Und dann sehen Sie hier wurde jetzt der Average ausgegeben von meinen vier Zahlen. ist natürlich in dem Umfang äh unfassbar nützlich, aber funktioniert. Okay, gut. Also hier auch noch mal die zwei Befehle aufgeführt ähm in der Variante für Unix. Wie gesagt, Windows braucht sem aus irgendwelchen Gründen, aber das kennen Sie, das ist ja ähm nicht spezifisch hier für diese Klassen.

← Video 2-1: StandardbibliothekenVideo 2-3: Malen nach Zahlen, StdDraw →