From e3c73f4593b23a0abde5a4977cf9bf25382cfeae Mon Sep 17 00:00:00 2001 From: Robert Jeutter Date: Mon, 12 Oct 2020 11:00:07 +0200 Subject: [PATCH] starting 3rd semester --- .gitignore | 556 +- Algorithmen und Datenstrukturen.md | 4312 +++++----- Assets/Aktionspotential.svg | 1766 ++-- Assets/Precordial_Leads_2.svg | 1632 ++-- Einführung in die Medizinische Informatik.md | 2140 ++--- ...n und Diskrete Strukturen - Cheatsheet.tex | 1530 ++-- ...dlagen und Diskrete Strukturen - short.tex | 488 +- Grundlagen und Diskrete Strukturen.md | 1330 +-- LICENSE | 1348 ++-- Neurobiologische Informationsverarbeitung.md | 462 +- Neuroinformatik.md | 1760 ++-- Programmierparadigmen.md | 3102 +++---- README.md | 77 +- Rechnerarchitekturen 1.md | 312 +- Stochastik.md | 47 + Telematik 1-cheatsheet.tex | 1912 ++--- Telematik 1.md | 7130 ++++++++--------- 17 files changed, 14976 insertions(+), 14928 deletions(-) create mode 100644 Stochastik.md diff --git a/.gitignore b/.gitignore index 3df46a1..8355e61 100644 --- a/.gitignore +++ b/.gitignore @@ -1,278 +1,278 @@ -.vscode - -## Core latex/pdflatex auxiliary files: -*.aux -*.lof -*.log -*.lot -*.fls -*.out -*.toc -*.fmt -*.fot -*.cb -*.cb2 -.*.lb - -## Intermediate documents: -*.dvi -*.xdv -*-converted-to.* -# these rules might exclude image files for figures etc. -# *.ps -# *.eps -# *.pdf - -## Generated if empty string is given at "Please type another file name for output:" -.pdf - -## Bibliography auxiliary files (bibtex/biblatex/biber): -*.bbl -*.bcf -*.blg -*-blx.aux -*-blx.bib -*.run.xml - -## Build tool auxiliary files: -*.fdb_latexmk -*.synctex -*.synctex(busy) -*.synctex.gz -*.synctex.gz(busy) -*.pdfsync - -## Build tool directories for auxiliary files -# latexrun -latex.out/ - -## Auxiliary and intermediate files from other packages: -# algorithms -*.alg -*.loa - -# achemso -acs-*.bib - -# amsthm -*.thm - -# beamer -*.nav -*.pre -*.snm -*.vrb - -# changes -*.soc - -# comment -*.cut - -# cprotect -*.cpt - -# elsarticle (documentclass of Elsevier journals) -*.spl - -# endnotes -*.ent - -# fixme -*.lox - -# feynmf/feynmp -*.mf -*.mp -*.t[1-9] -*.t[1-9][0-9] -*.tfm - -#(r)(e)ledmac/(r)(e)ledpar -*.end -*.?end -*.[1-9] -*.[1-9][0-9] -*.[1-9][0-9][0-9] -*.[1-9]R -*.[1-9][0-9]R -*.[1-9][0-9][0-9]R -*.eledsec[1-9] -*.eledsec[1-9]R -*.eledsec[1-9][0-9] -*.eledsec[1-9][0-9]R -*.eledsec[1-9][0-9][0-9] -*.eledsec[1-9][0-9][0-9]R - -# glossaries -*.acn -*.acr -*.glg -*.glo -*.gls -*.glsdefs -*.lzo -*.lzs - -# uncomment this for glossaries-extra (will ignore makeindex's style files!) -# *.ist - -# gnuplottex -*-gnuplottex-* - -# gregoriotex -*.gaux -*.gtex - -# htlatex -*.4ct -*.4tc -*.idv -*.lg -*.trc -*.xref - -# hyperref -*.brf - -# knitr -*-concordance.tex -# TODO Comment the next line if you want to keep your tikz graphics files -*.tikz -*-tikzDictionary - -# listings -*.lol - -# luatexja-ruby -*.ltjruby - -# makeidx -*.idx -*.ilg -*.ind - -# minitoc -*.maf -*.mlf -*.mlt -*.mtc[0-9]* -*.slf[0-9]* -*.slt[0-9]* -*.stc[0-9]* - -# minted -_minted* -*.pyg - -# morewrites -*.mw - -# nomencl -*.nlg -*.nlo -*.nls - -# pax -*.pax - -# pdfpcnotes -*.pdfpc - -# sagetex -*.sagetex.sage -*.sagetex.py -*.sagetex.scmd - -# scrwfile -*.wrt - -# sympy -*.sout -*.sympy -sympy-plots-for-*.tex/ - -# pdfcomment -*.upa -*.upb - -# pythontex -*.pytxcode -pythontex-files-*/ - -# tcolorbox -*.listing - -# thmtools -*.loe - -# TikZ & PGF -*.dpth -*.md5 -*.auxlock - -# todonotes -*.tdo - -# vhistory -*.hst -*.ver - -# easy-todo -*.lod - -# xcolor -*.xcp - -# xmpincl -*.xmpi - -# xindy -*.xdy - -# xypic precompiled matrices and outlines -*.xyc -*.xyd - -# endfloat -*.ttt -*.fff - -# Latexian -TSWLatexianTemp* - -## Editors: -# WinEdt -*.bak -*.sav - -# Texpad -.texpadtmp - -# LyX -*.lyx~ - -# Kile -*.backup - -# gummi -.*.swp - -# KBibTeX -*~[0-9]* - -# TeXnicCenter -*.tps - -# auto folder when using emacs and auctex -./auto/* -*.el - -# expex forward references with \gathertags -*-tags.tex - -# standalone packages -*.sta - -# Makeindex log files -*.lpz +.vscode + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Comment the next line if you want to keep your tikz graphics files +*.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz diff --git a/Algorithmen und Datenstrukturen.md b/Algorithmen und Datenstrukturen.md index 9a59516..d08fc91 100644 --- a/Algorithmen und Datenstrukturen.md +++ b/Algorithmen und Datenstrukturen.md @@ -1,2157 +1,2157 @@ ---- -titel: Algorithmen und Datenstrukturen -date: Sommersemester 2020 -autor: Robert Jeutter ---- -# 1. Vorbereitung -## 1.1. O-Notation - - -## 1.2. Spezifkationstechnik für Datentypen - - -## 1.3. Implementierungen fundamentaler Datentypen -- Wir werden Datentypen spezifizieren und Implementierungen betrachten. Ihnen sollten Stacks, Queues, Arrays und Lineare Listen bekannt sein. Wir benutzen diese als einfache Beispiele und um Techniken einzüben. Wörterbuch ist ein grundlegender Datentyp mit sehr vielen unterschiedlichen Implementierungsmöglichkeiten, insbesondere auf der Basis von Suchbäumen (verschiedene Varianten) und von Hashtabellen. Damit werden wir uns ausgiebig beschäftigen. -- Binäre Heaps sind eine Implementierung des Datentyps "Prioritätswarteschlange". (Man benutzt sie auch bei Heapsort, einem Sortieralgorithmus.) -- Wir werden eine Reihe von Algorithmen für Graphen sehen. Basis hierfür sind geeignete Datenstrukturen für die rechnerinterne Darstellung von Graphen. Die "Union-Find-Datenstruktur" ist ein Beispiel für einen Hilfsdatentyp für Graphalgorithmen. -- Ein fundamentales Thema der Vorlesung ist, dass man für (rechenzeit-)effziente Algorithmen clevere Datenstrukturen braucht und für effziente Datenstrukturen auch manchmal schlaue Algorithmen: Ein Wechselspiel! -- Mergesort und Quicksort sind schon bekannt. Hier werden Details der exakten Analyse nachgetragen. -- Bei Heapsort ist der Korrektheitsbeweis interessant, und die Anwendungen der Datenstruktur "Prioritätswarteschlangen". -- Breitensuche und Tiefensuche sind Methoden zur Exploration von Graphen, sehr großen Graphen, weit jenseits dessen, was man sich anschaulich machen kann. Denken Sie an zig Millionen von Knoten! -- Divide-and-Conquer: ein Algorithmenparadigma, das heißt, eine Entwurfsstrategie. Wir werden mehrere Entwurfsstrategien sehen, mit typischen klassischen Algorithmen, aber auch dem Potenzial, dass man selber Algorithmen nach dieser Methode entwirft. -- Greedy: Ein weiteres Algorithmenparadigma. Man konstruiert eine Lösung Schritt für Schritt, macht in jedem Schritt kurzsichtig "optimale" Entscheidungen, ohne an die Zukunft zu denken (daher "greedy/gierig"), und durch eine eingebaute Magie ergibt sich dann doch eine optimale Lösung. Manchmal, aber manchmal auch nicht. In die Kategorie greedy gehören extrem wichtige Graphalgorithmen, wie kürzeste Wege von einem Startknoten aus oder billigste Teilnetzwerke, die "alles verbinden" ... -- Dynamische Programmierung (DP) (Das hat mit Programmierung im modernen Sinn nichts zu tun.) Hier berechnen wir kürzeste Wege zwischen allen Knotenpaaren in einem Graphen oder die geringste Anzahl von Buchstabenoperationen, um aus einem String (z. B. "FREIZEIT") einen anderen zu machen (z. B. "ARBEIT"). -- Schwierige Probleme (Rucksackproblem oder Traveling Salesperson Problem, beide NPvollständig) können durch DP-Algorithmen etwas schneller als ganz naiv gelöst werden. - - -## 1.4. Auswahlkriterien für elementare Datenstrukturen kennen und anwenden - - -## 1.5. Kenntnis grundlegender Entwurfsstrategien - - -## 1.6. Kenntnis grundlegender Algorithmen und ihrer Eigenschaften -- Sortieren: Mergesort, Quicksort, Heapsort -- Graphdurchläufe: Breitensuche, einfache Tiefensuche -- Volle Tiefensuche, starke Zusammenhangskomponenten -- Divide-and-Conquer: Multiplikation von ganzen Zahlen und von Matrizen, Auswahlproblem, Schnelle Fourier-Transformation (eventuell) -- Greedy-Ansatz: Kürzeste Wege, Human-Codes, Minimale Spannbäume, fraktionales Rucksackproblem -- Dynamische Programmierung: Kürzeste Wege, Editierdistanz, 0-1-Rucksackproblem - -## 1.7. Auswahlkriterien für Algorithmen, insbesondere Ressourcenverbrauch, kennen und anwenden - - -## 1.8. Standard-Analysemethoden für Ressourcenverbrauch (Rechenzeit, Speicherplatz) - - -## 1.9. Korrektheitsbeweise für Algorithmen verstehen und darstellen - - -# 2. Einführung und Grundlagen -## 2.1. Beispiel: Sortieren -Beispiel Sortieren mit Insertion Sort (Sortieren durch Einfügen) -```pseudocode -for i from 2 to n do // Runden i = 2,...,n - x A[i] ; // entnehme A[i] - j i ; - while j > 1 and* x.key < A[j-1].key do - A[j] A[j-1] ; // Einträge größer als A[i] werden einzeln - j j-1 ; // um 1 Position nach rechts verschoben - A[j] x ; // Einfügen - return A[1..n] . // Ausgabe -``` -- Die erste (unnummerierte) Zeile gibt den Namen und den Input an. -- (1)-(7): Eine for-Schleife, die für i = 2,...,n (in i) ausgeführt wird. -- (2), wenn i Wert i enthält: - - Datensatz ai (in A[i]) wird nach x kopiert, ist dort gesichert. - - Speicherstelle A[i] ist jetzt frei verfügbar. -- (3)-(6): Diese Schleife durchläuft j=i, i-1, i-2;... und testet immer, ob der Schlüssel von A[j-1] größer ist als der Schlüssel von x. Falls ja: Verschiebe A[j-1] an Position j im Array. - - "sequenzielles and" bedeutet, dass die zweite Bedingung nur ausgeführt wird, wenn die erste "wahr" ergibt. - - Wenn also j=1 ist, stoppt die Schleife, ohne dass (fehlerhaft) auf A[0] zugegriffen wird. -- Wenn Zeile (7) erreicht wird, gibt j die Stelle an, an die x gespeichert werden muss. -- Ende des Algorithmus, Rückgabe des Arrays als Ausgabe. - -### 2.1.1. Ist dieser Algorithmus Korrekt? -Die Frage nach der Korrektheit eines gegebenen bzw. soeben neu entworfenen Algorithmus wird uns durch die Vorlesung begleiten. -Damit die Frage nach einem Beweis der Korrektheit überhaupt sinnvoll ist, müssen wir zunächst die zu lösende Aufgabe spezifizieren. -Bemerkung: Aus einer vagen Problemstellung eine präzise Spezi kation des zu lösenden Problems zu gewinnen ist ein in der Praxis extrem wichtiger Schritt, dessen Bedeutung oft unterschätzt wird. -Hier: Spezi kationstechniken für grundlegende Algorithmen (und Datenstrukturen, siehe Kap. 2). -Ein Beispiel: Beim Sortieren gibt es das Konzept des "stabilen Sortierverfahrens": Objekte mit demselben Schlüssel ändern ihre relative Reihenfolge nicht. Wenn die Implementierung diese Eigenschaft nicht hat, der Kunde sie aber für seine Anwendung voraussetzt, weil Softwareingenieur/in und Kunde sich nicht präzise verständigt haben oder die Beschreibung des Programms nur sagt, dass es "sortiert", kann dies unangenehme Folgen haben. Auf präziser Spezi kation zu bestehen und sie bereitzustellen liegt in der Verantwortung des -Informatikers/der Informatikerin! Man nennt dies "Stand der Technik" ("state of the art"), der angewendet werden muss. - - -### 2.1.2. Wie lange dauern Berechnungen mit diesem Algorithmus? -Die "Laufzeitanalyse" ist das zweite Grundthema in Richtung Algorithmen. -Erklärung: Ein Berechnungsproblem P besteht aus -1. einer Menge I von möglichen Eingaben ("Inputs","Instanzen") (I kann unendlich sein!) -2. einer Menge O von möglichen Ausgaben -3. einer Funktion $f:I \rightarrow O$ -Ein Algorithmus A "löst P", wenn A genau die Eingaben aus I verarbeitet und zu Eingabe $x\in I$ Ausgabe $A(x) = f(x)$ liefert. -Spezialfall $O = {1,0} \approx {true,false} \approx {Ja,Nein}$ P heißt Entscheidungsproblem. -Bei der Festlegung, was Eingabemengen und Ausgabemengen eines Algorithmus sind, gibt es dieselben Unschärfen wie bei den Algorithmen selbst. Die Darstellungsform für den Input bleibt offen. Selbst wenn man weiß, dass die Schlüsselmenge die Menge N ist, ist nicht klar, ob eine Zahl in Dezimal- oder in Binärdarstellung gegeben ist. -Beispiel: Beim Sortierproblem hat man es mit Objekten zu tun, die ein Attribut "Schlüssel" haben. Es muss eine Funktion geben, ja sogar ein algorithmisches Verfahren, das aus dem Objekt a den Schlüssel *key(a)* ermittelt. Die Details dieser Funktion werden aber nicht festgelegt. -Es ist nicht präzisiert, in welcher Weise die Funktion f beschrieben sein soll. Aus praktischen Gründen will man dies auch nicht. Mathematische Beschreibungen sind in der Regel akzeptabel. Wenn Ein-/Ausgabeformat ignoriert werden und man beliebige mathematische Funktionen f als Beschreibung akzeptiert, kann man eine Problemspezi kation durchaus als ein mathematisches Tripel (I;O; f) schreiben. -Ein Entscheidungsproblem $(I, {true, false}, f)$ entspricht der Menge ${x\in I | f(x) = true}$. - -## 2.2. Was ist ein Algorithmus -Ein Algorithmus A ist eine durch einen endlichen Text gegebene Verarbeitungsvorschrift, die zu jeder gegebenen Eingabe x aus einer Menge I -(der Menge der möglichen Eingaben) eindeutig eine Abfolge von auszuführenden Schritten ("Berechnung") angibt. Wenn diese Berechnung nach endlich vielen Schritten anhält, wird ein Ergebnis A(x) aus einer Menge O (der Menge der möglichen Ausgaben) ausgegeben. -Beschreibungsformen: Umgangssprache, Pseudocode, Programm in Programmiersprache, Programm fur formales Maschinenmodell, Programm in Maschinensprache, Turingmaschinenprogramm, . . . -Es handelt sich nicht um eine formale Def inition. Viele Formalismen können benutzt werden, um das Algorithmenkonzept formal/mathematisch -zu erfassen: Turingmaschinenprogramme, while-Programme, Programme für andere (mathematisch genaue) Maschinenmodelle,... -Man beweist, dass viele unterschiedliche Formalismen zu exakt derselben Klasse von "berechenbaren Funktionen" führt. Erfahrungstatsache: Alle bekannten Algorithmenkonzepte liefern dieselbe Klasse von "berechenbaren Funktionen". Die Church-Turing-These sagt, dass unsere informale, intuitive Beschreibung genau dem entspricht, was man mit diesen mathematischen De finitionen erfasst. - -### 2.2.1. Was ist mit nicht abbrechenden Berechnungen? -Eine grundlegende Tatsache der Berechenbarkeitstheorie, nämlich die Unentscheidbarkeit des Halteproblems hat als unangenehme Konsequenz, dass Folgendes passiert: Wenn man der De nition des Algorithmenbegriffs die Aussage "A hält auf allen Inputs" hinzufügt, dann kann ein Compiler einen vorgelegten Programmtext P nicht mehr automatisch (d.h. mit einem Computerprogramm, d.h. mit einem Algorithmus) darauf überprüfen, ob P einen Algorithmus darstellt oder nicht. Das würde bedeuten, dass der Compiler entweder eigentlich legale Algorithmen zurückweist oder "Nicht-Algorithmen" passieren lässt. -Einen Algorithmenbegriff ohne Entscheidungsverfahren will man nicht haben. (Man möchte Programme aufgrund einer reinen Syntaxüberprüfung in korrekt/fehlerhaft einteilen.) Dies ist der Grund, weshalb Algorithmen mit nicht-stoppenden Berechnungen in Kauf genommen werden. - -## 2.3. Merkmale eines Algorithmus -- Endlicher Text -- Ein Algorithmus für eine große (oft: unendliche!) Menge I von Eingaben x (Beachte: Zeitliche Trennung der Formulierung des Algorithmus bzw. der Programmierung und der Anwendung auf eine Eingabe.) -- Eindeutig vorgeschriebene Abfolge von Schritten, wenn Eingabe x vorliegt (im Rahmen des benutzten Modells) -- Wenn Verarbeitung anhält: Ausgabe $A(x)\in O$ ablesbar -- Nicht verlangt: Terminierung auf allen $x \in I$. - -Algorithmen werden erfunden und in Software umgesetzt. Der Algorithmus, den Sie in Ihrer späteren Tätigkeit entwerfen und implementieren, wird (hoffentlich!) vieltausendfach verkauft und von Kunden eingesetzt, in Umgebungen und für Inputs, an die beim Algorithmenentwurf und bei der Implementierung niemand gedacht hat. Reales Beispiel: Bankensoftware, in den 1960er Jahren in COBOL geschrieben, wurde bis weit ins 21. Jh. eingesetzt, auf Rechnern, die es bei der Erstellung der Programme noch gar nicht gab. Diese Situation ist ein großer Reiz im Informatiker/innen dasein, aber auch eine Riesenverantwortung. Es muss genauestens spezi fiziert sein, was genau ein Stück Software tut, und für welche Inputs es geeignet ist. -Je nach Modell oder Detaillierungsgrad des Algorithmus kann "eindeutig vorgeschriebene Abfolge von Schritten" unterschiedliche Dinge bedeuten. Beispiel: Man kann die Addition von natürlichen Zahlen als Elementaroperation ansehen oder die Details der Addition von Dezimalzahlen (Schulmethode) als Teil des Algorithmus betrachten. Nicht selten werden Algorithmen in einer Form beschrieben, die viele Details offen lässt. (Beispielsweise könnte es in einem Algorithmus ein Hilfsprogramm geben, das eine Folge sortiert. Der Algorithmus gilt oft auch dann als vollständig, wenn die verwendete Sortiermethode gar nicht fixiert ist.) -Noch ein Wort zu Eingabe/Ausgabe: Vor der Verarbeitung durch einen Computer müssen Daten in eine interne Darstellung transformiert werden. Die Ausgabe eines Programms muss wieder in "reale" Daten übersetzt werden. - -## 2.4. Erweiterung des Algorithmusbegriffs -- *Online-Algorithmen*: Die Eingabe wird nicht am Anfang der Berechnung, sondern nach und nach zur Verfügung gestellt, Ausgaben müssen nach Teileingabe erfolgen. Häufi ge Situation bei Datenstrukturen, Standard bei Betriebssystemen, Systemprogrammen, Anwendungsprogrammen mit Benutzerdialog usw. -- *Randomisierung*: Algorithmus führt Zufallsexperimente durch, keine Eindeutigkeit der Berechnung gegeben. -- *Verteilte Algorithmen*: Mehrere Rechner arbeiten zusammen, kommunizieren, zeitliche Abfolge nicht vorhersagbar - - -#### 2.4.0.1. Varianten -Zu einer Eingabe $x\in I$ könnte es mehrere legale Ergebnisse geben. Formal: In 3. haben wir statt einer Funktion f eine Relation $R\subseteq I \times O$ mit $\forall x \in I \exists y \in O: R(x, y)$. A löst P, wenn A genau die Eingaben aus I verarbeitet und $R(x,A(x))$ für jedes $x\in I$ gilt. -Beispiel "nicht-stabiles Sortieren": Beim Sortieren von Objekten/Datensätzen, wobei Schlüssel wiederholt vorkommen dürfen, kann jede sortierte Anordnung der Objekte eine legale Lösung sein. Dann ist die Lösung nicht eindeutig. -- Online-Situation: Eingabe wird "in Raten" geliefert, Zwischenausgaben werden verlangt. - -#### 2.4.0.2. Spezi kation des Sortierproblems -Parameter: Die Grundbereiche (Klassen), aus denen die zu sortierenden Objekte und die Schlüssel stammen: -- $(U,<)$: total geordnete Menge (endlich/unendlich, Elemente heißen "Schlüssel"). -- Beispiele: Zahlenmengen ${1,...,n}, \N, \Z, \Q$ Mengen von Strings. -- D: Menge (Elemente heißen "Datensätze"). -- key : $D \rightarrow U$ gibt zu jedem Datensatz einen "Sortierschlüssel" an. -- $I = O = Seq(D) := D^{<\infty} := U_{n\geq 0} D^n = {(a_1,...,a_n)|n\in \N, a_1,...,a_n \in D}$ (die Menge aller endlichen Folgen von Datensätzen) -Es ist häufi ger der Fall als nicht, dass die zu verwendenden Grundbereiche bei einem Berechnungsproblem (oder einer Datenstruktur) als Parameter angegeben werden, die für eine konkrete Verwendung oder auch für eine konkrete Implementierung noch festgelegt werden müssen. Bei der objektorientierten Programmierung entspricht dies der Verwendung von "generischen Typen" (Java-Terminologie) oder Templates (C++-Terminologie). -Der Schlüssel $key(x)$ könnte ein simples Attribut $x:key$ des Objekts x sein, oder mit einer Methode aus x berechnet werden. In Beispielen lassen wir oft die Datensätze (fast) ganz weg und konzentrieren uns auf die Schlüssel. Dies ist bei realen Anwendungen fast nie so. (Sehr selten will man eine Liste von puren Zahlen sortieren, sondern man will meistens komplexere Datensätze nach ihnen zugeordneten Nummern sortieren.) -$D^n$ ist die Menge aller n-Tupel von Datensätzen. $D^0$ hat nur das Element $()$ (die leere Folge). $D^1$ hat als Elemente die Folgen $(a)$ für $a\in D$. Die Menge $Seq(D)$ erhält man, indem man alle diese Mengen zusammenwirft. Bitte die Notation $Seq(D)$ einprägen! - -#### 2.4.0.3. Alternative Formulierung des Sortierproblems: -Die Ausgabe ist nicht die sortierte Folge, sondern die Permutation $\pi$, die die Eingabefolge in die richtige Reihenfolge bringt, wie oben beschrieben. $O' = {\pi | \pi Permutation einer Menge {1,...,n},n\in \N}$ -Defi nition: $(a_1,...,a_n)$ wird durch $\pi$ sortiert: $\iff key(a_{\pi (1)}) \leq key(a_{\pi (2)}) \leq ... \leq key(a_{\pi (n)})$ -$x = (a1,...,an)\in I$ und $\pi\in O$ stehen in der Relation $R'$, d.h.: $R'(x,\pi )$ gilt$:\iff x$ wird durch $\pi$ sortiert.Dann ist $(I,O',R')$ ebenfalls eine Spezi kation des Sortierproblems. -Wir können nun präzise nach der Korrektheit eines Sortieralgorithmus fragen. Auch ein "Beweis der Korrektheit" eines Algorithmus ergibt nun einen Sinn. Die Korrektheitsbeweise dieser Vorlesung funktionieren alle "mathematisch". Es gibt auch maschinenbasierte Korrektheitsbeweise für Programme. Bei Algorithmen, deren Kern eine Schleife ist, verwendet man oft Beweise, die vollständige Induktion benutzen. Wir machen (vollständige) Induktion über $i= 1,...,n$, das heißt, es werden gar nicht alle natürlichen Zahlen betrachtet. -Den Beweis selbst muss man nicht beim ersten Lesen studieren, aber irgendwann doch. Er stellt an einem sehr einfachen Beispiel dar, wie man präzise über das Verhalten eines Algorithmus argumentieren kann, ohne die Formalismen zu übertreiben. - -#### 2.4.0.4. Löst Insertionsort das Sortierproblem? -Gilt für jede Eingabe $(a_1,...,a_n)$ in $A[1..n]$, dass nach Ausführung von Insertionsort dieselben Elemente im Array stehen, aber nach Schlüsseln aufsteigend sortiert? -**Korrektheitsbeweis an Beispiel**: Durch vollständige Induktion über $i =1,2,...,n$ zeigt man die folgende (Induktions-)Behauptung: -Nach Durchlauf Nummer i (in i) der äußeren Schleife $(1)-(7)$ stehen in $A[1..i]$ dieselben Elemente wie am Anfang, aber aufsteigend sortiert. Nach Durchlauf Nummer n, also am Ende, gilt dann $(IB_n)$. Diese Behauptung sagt gerade, dass die Einträge aus der ursprünglichen Eingabe nun in aufsteigender Reihenfolge in $A[1..n]$ stehen. - -**Korrektheitsbeweis für Insertionsort** -Zunächst erledigen wir zwei (triviale) Randfälle: Wenn n = 0 ist, also das Array leer ist, oder wenn n = 1 ist, es also nur einen Eintrag gibt, dann tut der Algorithmus gar nichts, und die Ausgabe ist korrekt. -Sei nun $n\geq 2$ beliebig, und der Input sei im Array $A[1..n]$ gegeben. Wir beweisen die Induktionsbehauptung $(IB_i)$ durch Induktion über $i=1,2,...,n$. -- I.A.: i = 1: "Nach Durchlauf für i = 1" ist vor Beginn. Anfangs ist das Teilarray $A[1..1]$ (nur ein Eintrag) sortiert, also gilt (IB1). -- I.V.: Wir nehmen an: $1 < i \leq n$ und $(IB_{i-1})$ gilt, d.h. $A[1..i - 1]$ ist sortiert, enthält dieselben Objekte wie am Anfang, und Schleifendurchlauf i beginnt. -- I.-Schritt: Betrachte Schleifendurchlauf i (Zeilen 2-7). - - $x := A[i]$ ist das aktuelle Objekt; es wird in Variable x kopiert. - - Position $A[i]$ kann man sich jetzt als leer vorstellen. - - Sei $m=m_i$ die größte Zahl in ${0,...,i-1}$, so dass $key(A[j]) \leq key(x)$ für $1\leq j \leq m$. - - (Wenn es gar kein $j\leq i - 1$ mit $key(A[j]) \leq key(x)$ gibt, ist $m = 0$. - - Wenn für alle $1\leq j \leq i - 1$ die Ungleichung erfüllt ist, ist $m = i - 1$.) -- Weil nach I.V. $A[1,..,i - 1]$ sortiert ist, gilt: $key(x) < key(A[j])$ für $m + 1 \geq j \geq i - 1$. - Die innere Schleife 4-7 mit der Initialisierung in Zeile 3 testet, durch direkten Vergleich in Zeile 4, die Zahlen $j-1=i-1,i-2,i-3,...,0$ nacheinander darauf, ob $j-1 = m$ ist. Entweder wird dabei $j = 1$ erreicht, dann ist $m = 0 = j - 1$, oder man stellt für ein $j\geq 2$ fest, dass $key(A[j - 1]) \leq key(x)$ gilt. Dann ist offenbar ebenfalls $m = j - 1$. -- Schon während der Suche nach m werden (in Zeile 5) die Einträge $A[i-1],A[i-2],...,A[m+1]$, in dieser Reihenfolge, um eine Position nach rechts verschoben, ohne die Sortierung dieser Elemente zu ändern. Nun stehen $A[1],...,A[m]$ an ihrer ursprünglichen Position, $A[m+ 1],A[m+ 2],...,A[i-1]$ (vorher) stehen jetzt in $A[m + 2..i]$. In Zeile 7 wird x (aus x) an die Stelle $A[m+1]$ geschrieben. Nach den Feststellungen in den Boxen und aus der I.V. ergibt sich, dass nun $A[1..i]$ aufsteigend sortiert ist. Also gilt $(IB_i)$. Nach Durchlaufen der äußeren Schleife Schleife für $i=2,..,n$ gilt die Aussage $(IB_n)$, also ist nach Abschluss des Ablaufs das Array sortiert. - -**Methoden für Korrektheitsbeweise** -- Vollständige Induktion: Damit wird die Korrektheit von Schleifen bewiesen. Meist ist dabei die Formulierung einer geeigneten Induktionsbehauptung zentral, die dann "Schleifeninvariante" genannt wird. -- Verallgemeinerte Induktion (d.h. man schließt von ($IB_j$) für alle $j 1$" wird zwischen 1-mal und i-mal durchgeführt, der Test $x.key < A[j-1].key$ zwischen 1-mal und $(i-1)$-mal, inputabhängig. Kosten für Zeilen $(4)(6)$ bei Schleifendurchlauf für $i: (k_i+1) * O(1) = O(k_i+1)$. -Kosten insgesamt: Summiere über $2\geq i\geq n = O(n+\sum_{2\geq i\geq n} k_i)$ -Typisch für solche Analysen: Nicht jede Operation zählen, sondern Zurückziehen auf das Zählen von "charakteristischen Operationen", die den Rest bis auf einen konstanten Faktor dominieren. - -Definition $F_x = \sum_{2\geq i \geq n} k_i$ -Anzahl der Fehlstände in $x=(a_1,...,a_n)$. Z.B. gibt es in $x=(4,7,5,3)$ vier Fehlstände: (1,4),(2,3),(2,4),(3,4). Gesmtaufwand von Insertionsort auf Eingabe x der Länge n ist $O(n+f_x)$ - -Welchen Wert $F_x$ sollte man für irgendein beliebiges x erwarten? aus $\sum_{0\geq i von $m_0*2^{l-1}$ auf $m_0*2^l$. Bei der l-ten Verdopplung entstehen Kosten $\Theta(m_0*2^{l-1})$. - -k := Anzahl der push-Operationen in $Op_1,..., Op_N \Rightarrow$ Zahl der Einträge ist immer $geq$k, also gilt, wenn die Verdopplung von $m_0*2^{l-1}$ auf $m_0*2^l$ tatsächlich statt ndet: $m_0*2^{l-1} < k$. Sei L maximal mit $m_0*2^{L-1} < k$. Dann sind die Gesamtkosten für alle Verdopplungen zusammen höchstens: -$$\sum_{1\leq i \leq L} O(m_0*2^{l-1})= O(m_0*(1+2+2^2+...+2^{L-1})) = O(m_0*2^L) = O(k)$$ -Die Gesamtkosten für alle Verdopplungen zusammen sind also $N*\Theta(1)+O(k)=\Theta(N)$ - -Wenn ein Stack mit Arrays und der Verdoppelungsstrategie implementiert wird, gilt: -1. Die Gesamtkosten für N Operationen betragen $\Theta(N)$. -2. Der gesamte Platzbedarf ist $\Theta(k)$, wenn k die maximale je erreichte Stackhöhe ist. - -##### 3.1.1.2.3. Vergleich Listen-/Arrayimplementierung -| Arrayimplementierung | Listenimplementierung | -| ---------------------------------------------------------------------------------- | ------------------------------------------------------------- | -| $O(1)$ Kosten pro Operation, "amortisiert" (im Durchschnitt über alle Operationen) | $O(1)$ Kosten pro Operation im schlechtesten Fall | -| Sequentieller, indexbasierter Zugriff im Speicher (cachefreundlich) | (jedoch: relativ hohe Allokationskosten bei push-Operationen) | -| Höchstens 50% des allozierten Speicherplatzes bleibt ungenutzt | Zusätzlicher Platz für Zeiger benötigt. | - -Experimente zeigen, dass die Arrayimplementierung spürbar kleinere Rechenzeiten aufweist. - -Generelle Erkenntnis: Datentypen lassen sich ebenso exakt spezi zieren wie Berechnungsprobleme. - -#### 3.1.1.3. Datentyp "Dynamische Arrays" -Stacks + "wahlfreier Zugriff" - -Neuer Grunddatentyp: Nat - durch $\N = {0,1,2,...}$ interpretiert. - -Operationen, informal beschrieben: -- empty(): liefert leeres Array, Länge 0 -- read(A; i): liefert Eintrag A[i] an Position i, falls $1\leq i \leq n$. -- write(A; i; x): ersetzt Eintrag A[i] an Position i durch x, falls $1 \leq i \leq n$. -- length(A): liefert aktuelle Länge n. -- addLast(A; x): verlängert Array um 1 Position, schreibt x an letzte Stelle (= push). -- removeLast(A): verkürzt Array um eine Position (= pop). - -Wieso gibt es kein "isempty"? Überprüfung durch "length" zeigt ein leeres Array falls keine Einträge vorhanden - -1. Signatur - - Sorten: - - Elements - - Arrays - - Nat - - Operationen - - empty: -> Arrays - - addLast: Array x Elements -> Arrays - - removeLast: Arrays -> Arrays - - read: Arrays x Nat -> Elements - - write: Arrays x Nat x Elements -> Arrays - - length: Arrays -> Nat -2. Mathematisches Modell - - Sorten: - - Elements: (nichtleere) Menge D (Parameter) - - Arrays: Seq(D) - - Nat: $\N$ - - Operationen: - - emtpy():=() - - addLast$((a_1,...,a_n),x):= (a_1,...,a_n,x)$ - - removeLast$((a_1,...,a_n)):= \begin{cases} (a_1,...,a_{n-1}), falls (n\geq 1) \\ undefiniert, falls (n=0) \end{cases}$ - - read$((a_1,...,a_n),i):= \begin{cases} a_i, falls (1\leq i \leq n) \\ undefiniert, sonst \end{cases}$ - - write$((a_1,...,a_n),i,x):= \begin{cases} (a_1,...,a_{i-1},x,a_{i+1},...,a_n), falls (1\leq i \leq n) \\ undefiniert, sonst \end{cases}$ - - length$((a_1,...,a_n)):= n$ - -**Implementierung**: Wir erweitern die Arrayimplementierung von Stacks in der offensichtlichen Weise, gleich mit Verdoppelungsstrategie. - -**Kosten**: -- empty, read, write, length: O(1). -- addLast: k addLast-Operationen kosten Zeit O(k). -- removeLast: Einfache Version (Pegel dekrementieren): O(1). - -## 3.2. Queues (Warteschlangen, FIFO-Listen) -(First-in-First-Out Listen) Stacks und Queues verhalten sich sehr unterschiedlich -- "enqueue": Man fügt ein Element ein, indem man hinten an die Kette anhängt. -- "dequeue": Man entnimmt ein Element am vorderen Ende der Kette. -- "fi rst": Man kann den vordersten Eintrag auch lesen. - -### 3.2.1. Spezifikation des Datentypes "Queue" über D -Die Signatur ist identisch zur Signatur von Stacks (bis auf Umbenennungen). Rein syntaktische Vorschriften! -1. Signaur - - Sorten: - - Elements - - Queues - - Boolean - - Operationen: - - empty: -> Queues - - enqueue: Queues x Elements -> Queues - - dequeue: Queues -> Queues - - first: Queues -> Elements - - isemtpy: Queues -> Boolean -2. Mathematisches Modell - - Sorten: - - Elements: (ncihtleere) Menge D (Parameter) - - Queues: Seq(D) - - Boolean: {true, false} - - Operationen: - - empty():=() - - enqueue$((a_1,...,a_n),x):= (a_1,...,a_n,x)$ - - dequeue$((a_1,...,a_n)):= \begin{cases} (a_2,...,a_n), falls (n\geq 1)\\ undefiniert, falls (n=0) \end{cases}$ - - first$((a_1,...,a_n)):= \begin{cases} a_1, falls (n\geq 1)\\ undefiniert, falls (n=0) \end{cases}$ - - isemtpy$((a_1,...,a_n)):= \begin{cases} false, falls (n\geq 1)\\ true, falls (n=0) \end{cases}$ - - -Die leere Folge () stellt die leere Warteschlange dar. -Das mathematische Modell ist fast identisch zu dem für Stacks. Nur fügt enqueue(x) das Element x hinten an die Folge an, während push(x) das Element x vorne anfügt. - -### 3.2.2. Implementierung von Queues -**Listenimplementierung** -Implementierung mittels einfach verketteter Listen mit Listenendezeiger/-referenz. Bei der Verwendung von Listen ist zu beachten, dass man mittels Zeigern/Referenzen Zugang zu beiden Enden der Liste benötigt: mit einem "head"-Zeiger hat man Zugriff auf den Anfang, mit -einem "tail"-Zeiger Zugriff auf das Ende. - -**Arrayimplementierung** - -##### 3.2.2.0.1. TODO ########################################################################################################################## -!TODO seite 40(394) -##################################################################################################################################### - - - -# 4. Binärbaume -## 4.1. Grundlagen -## 4.2. Definition -Ein Binärbaum T besteht aus einer endlichen Menge V von "inneren" Knoten, einer dazu disjunkten endlichen Menge L von "äußeren" Knoten sowie einer injektiven Funktion - -D sei Menge von (möglichen) Knotenmarkierungen, Z sei Menge von (möglichen) Blattmarkierungen: -1. Wenn $z \in \Z$ dann ist (z) ein (D,Z)-Binärbaum -2. Wenn $T_1, T_2$ (D,Z)-Binärbaume sind und $x \in D$ ist, dann ist auch $(T_1,x,T_2)$ ein (D,Z)-Binärbaum -3. nichts sonst ist (D,Z)-Binärbaum - -## 4.3. Operationen -1. Signatur - - Sorten: - - Elements - - Bintrees - - Boolean - - Operationen - - empty: -> Bintrees - - buildTree: Elements x Bintrees x Bintrees -> Bintrees - - leftSubtree: Bintrees -> Bintrees - - rightSubtree: Bintrees -> Bintrees - - data: Bintrees -> Elements - - isemtpy: Bintrees -> Boolean -2. mathematisches Modell - - Sorten: - - Elements: (nichtleere) Menge D - - Bintrees: {T | T ist (d,{-})-Binärbaum} - - Boolean: {true, false} - - Operationen: - - empty():= {}:= (-) - - $buildTree(x,T_1,T_2) := (T_1,x,T_2)$ - - $leftSubtree(T) := \begin{cases} T_1, falls\ T=(T_1,x,T_2) \\ undefiniert, falls\ T=(-) \end{cases}$ - - $rightSubtree(T) := \begin{cases} T_2, falls\ T=(T_1,x,T_2) \\ undefiniert, falls\ T=(-) \end{cases}$ - - $data(T) := \begin{cases} x, falls\ T=(T_1,x,T_2) \\ undefiniert, falls\ T=(-) \end{cases}$ - - $isempty(T) := \begin{cases} false, falls\ T=(T_1,x,T_2) \\ true, falls\ T=(-) \end{cases}$ - -## 4.4. Terminologie -- Binärbaum T, engl: "binary tree" -- Wurzel, engl "root" -- (innerer) Knoten v, engl: "node" -- (äußerer) Knoten l = Blatt, engl: "leaf" -- Blatteintrag: z= data(l) -- Knoteneintrag: $x = data(v) = data(T_0)$ -- $T_v$: Unterbaum mit Wurzel v -- Vater/Vorgänger, engl: "parent", von v: p(v) - - linkes Kind, engl: "left child", von v: von v: child(v, left) - - rechtes Kind, engl: "right child", von v: von v: child(v, right) - - Vorfahr (Vater von Vater von Vater . . . von u), engl: "ancestor" - - Nachfahr (Kind von Kind von . . . von v), engl: "descendant" -- Weg in T: Knotenfolge oder Kantenfolge, die von v zu einem Nachfahren u führt -- Länge eines Wegs $(v_0,v_1,...,v_s)$: Anzahl s der Kanten auf dem Weg -- Tiefe/Level eines Knotens: Die Länge (das ist die Kantenzahl) des Wegs von der Wurzel zum Knoten heißt die Tiefe oder das Level $d(v)$ von Knoten v. Die Knoten mit Tiefe l bilden das Level l. -- - -## 4.5. TIPL und TEPL -### 4.5.1. Totale innere Weglänge (Total internal path length) -TIPL(T) = Anzahl der Knoten * Tiefe der Knoten - -Mittlere innere Weglänge: $\frac{1}{n}* TIPL(T) > log(n - 2)$ - -### 4.5.2. Totale äußere Weglänge (Total external path length) -TEPL(T) = Anzahl der Blätter * Tiefe der Blätter - -Mittlere äußere Weglänge: $\frac{TEPL(T)}{n+1} \geq log(N)$ - -TEPL(T) = TIPL(T) +2n - -## 4.6. Baumdurchläufe -(D,Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation. -Organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T) löst Abarbeitung einer Methode von data(T) aus. - -### 4.6.1. Inorder Durchlauf ->"Erst den linken Unterbaum, dann die Wurzel, dann den rechten Unterbaum" - -Bsp: falls $T=(T_1,x,T_2)$ - - Inorder Durchlauf durch $T_1$ - - i-visit(x) - - Inorder Durchlauf durch $T_2$ - -Man besucht abwechselnd externe und interne Knoten. - -### 4.6.2. Präorder Durchlauf -> "Erst die Wurzel, dann den linken Unterbaum, dann den rechten Unterbaum" - -Bsp: falls $T=(T_1,x,T_2)$ - - i-visit(x) - - Inorder Durchlauf durch $T_1$ - - Inorder Durchlauf durch $T_2$ - -### 4.6.3. Postorder Durchlauf -> "Erst den linken Unterbaum, dann den rechten Unterbaum, zuletzt die Wurzel" -Bsp: falls $T=(T_1,x,T_2)$ - - Inorder Durchlauf durch $T_1$ - - Inorder Durchlauf durch $T_2$ - - i-visit(x) - -### 4.6.4. Kombi Durchlauf -Ermöglicht Datentransport von der Wurzel nach unten in den Baum hinein und wieder zurück. -Bsp: falls $T=(T_1,x,T_2)$ - - preord-i-visit(x) - - Kombi Durchlauf durch $T_1$ - - inord-i-visit(x) - - Kombi Durchlauf durch $T_2$ - - postord-i-visit(x) - -### 4.6.5. Zeitanalyse für Baumdurchlauf -Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. - -Beispiel: Inorder Durchlauf - - Angewendet auf einen Baum T mit n inneren Knoten - - Für jeden inneren und äußeren Knoten wird die Prozedur inorder() einmal aufgerufen, insgesamt $(2n+1)$-mal - - Kosten pro Aufrug $O(1)$ plus Kosten für i-visit/e-visit-Operation - - Insgesamt: $(2n+1)*(O(1)| +C_{visit})$ wobei $C_{visit}$ eine Schranke für die Kosten der visit-Operationen ist - -Behauptung: Baumdurchläufe haben lineare Laufzeit. - -# 5. Hashverfahren -Gegeben: Universum U (auch ohne Ordnung) und Wertebereich R. Hashverfahren (oder Schlüsseltransformationsverfahren) implementieren ein Wörterbuch (alias dynamische Abbildung, assoziatives Array) $f: S \rightarrow R$, mit $S \subseteq U$ endlich. - -Ziel: Zeit $O(1)$ pro Operation "im Durchschnitt" unabhängig vom Umfang der Datenstruktur - -Grundansatz: "x wird in h(x) umgewandelt/transformiert" (Ideal: Speichere Paar (x, f(x)) in Zelle T[h(x)] ) - -Eine Funktion $h: U \rightarrow [m]$ heißt Hashfunktion. Wenn $S \subseteq U$ gegeben ist, verteilt h die Schlüssel in S auf $[m]$. $B_j := {x \in S | h(x) = j}$ heißt Behälter ("bucket"). -$h$ perfekt (ideal) für S falls $h$ zu S injektiv, d.h. gür jedes $j \in [m]$ existiert höchstens ein $x \in S$ mit $h(x) = j$. - -**Uniformitätsannahme** (UF): Werte $h(x_1),...,h(x_n)$ in $[m]$ sind "rein zufällig": Jeder der $m^n$ Vektoren $(j_1,...,j_n)\in [m]^n$ kommt mit derselben Wahrscheinlichkeit $1/m^n$ als $(h(x_1),...,h(x_n))$ vor. UF tritt (näherungsweise) ein, wenn: - - U endlich ist und - - h das Universum in gleich große Teile zerlegt ($|h^{-1}({j}) = \lfloor |U|/m \rfloor$ oder $\lceil |U|/m \rceil$ ) - - $S \subseteq U$ eine rein zufällige Menge der Größe n ist -Pr(keine Kollision)=Pr(injektiv auf S) $< e^{-\frac{n(n-1)}{2m}}$ - -"Geburtsparadoxon": $x_1,...,x_n$ sind Leute und $h(x_1),...,h(x_n) \in [m]$ die Nummern ihrer Geburtstage im Jahr, $m=365$. Wenn z.B. $n=23$ ist, ist Pr(alle Geburtstage verschieden)$< e^{-\frac{23*22}{365*2}} = e^{\frac{-506}{730}} < 0,5$. -Mit Wahrscheinlichkeit >1/2 sind unter 23 Personen mit zufälligen Geburtstagen zwei, die am selben Tag Geburtstag haben. - -Wunsch: Linearer Platzverbrauch, also "Auslastungsfaktor" $\alpha := \frac{n}{m}$ nicht kleiner als eine Konstante $\alpha_0$. Dann: Pr(h injektiv auf S)$\leq e^{-\alpha_0(n-1)/2}$. D.h. falls h nicht auf S abgestimmt ist, kommen Kollisionen praktisch immer vor! $\rightarrow$ Kollisionsbehandlung ist notwendig. - -## 5.1. Hashing mit Verketteten Listen -engl.: chained hashing - -Auch: "offenes Hashing", weil man Platz außerhalb von T benutzt. In $T[0... m-1]$: Zeiger auf die Anfänge von m einfach verketteten linearen Listen $L_0,...,L_{m-1}$. (Oder auch: Zeiger auf "kleine" Arrays/Vektoren mit variabler Länge.) Liste $L_j$ enthält die Einträge mit Schlüsseln x aus Behälter/Bucket: $B_j={x\in S | h(x) = j}$ - -### 5.1.1. Wir implementieren die Wörterbuchoperationen: Algorithmen -- empty(x) - - Erzeugt Array $T[0...m-1]$ mit m NULL-Zeigern/NULL-Referenzen und legt $h:U\rightarrow [m]$ fest. - - Kosten: $\Theta(m)$ - - Beachte: Man wählt h, ohne S zu **kennen** -- lookup(x) - - Berechne $j=h(x)$ suche Schlüssel x durch Durchlaufen der Liste $L_j$ bei $T[j]$; falls Eintrag gefunden: $return R$; sonst: $return "nicht vorhanden"$ - - Kosten/Zeit: O(1+ Zahl der Schlüsselvergleiche "x=y?"); Erfolglose Suche exakt $|B_j|$; Erfolgreiche Suche höchstens $|B_j|$ -- insert(x,r) - - Berechne $J=h(x)$ suche Schlüssel x in Liste $L_j$ bei $T[j]$; falls gefunden ersetze Daten bei x durch r - - Kosten: wie bei lookup -- delete(x) - - Berechne $J=h(x)$, suche Schlüssel x in Liste $L_j$ bei $T[j]$; falls gefunden lösche Eintrag $(x,f(x))$ aus $L_j$ - - Kosten: wie bei lookup - -Ziel: analysiere erwartete Kosten für lookup, insert, delete. Hierfür genügt Analyse erwarteter Anzahl der Schlüsselvergleiche. -- Pr(A): Wahrscheinlichkeit für Ereignis A -- E(X): Erwartungswert der Zufallsvariablen X -- abgeschwächte "Uniformitätsannahme": Für je 2 Schlüssel $x \not = z$ in U gilt: $Pr(h(x)=h(z)\leq \frac{1}{m})$ - -### 5.1.2. Verdoppelungsstrategie -Wenn nach $insert(x, r)$ (mit x neu) der Wert load die Grenze $a_1m$ überschreitet: -- Erzeuge neue Tabelle $T_{neu}$ der Größe $2m$. -- Erzeuge neue Hashfunktion $h_{neu}:U \rightarrow [2m]$. -- Übertrage Einträge aus den alten Listen in neue Listen zu Tabelle $T_{neu}$, gemäß neuer Hashfunktion. Dabei Einfügen am Listenanfang ohne Suchen. (Wissen: Alle Schlüssel sind verschieden!) Kosten: O(m) im schlechtesten Fall. -- Benenne $T_{neu}$ in $T$ und $h_{neu}$ in $h$ um. - -## 5.2. Hashfunktionen -### 5.2.1. Einfache Hashfunktionen -Kriterien für Qualität: -1. Zeit für Auswertung von $h(x)$ (Schnell!) entscheidend: Schlüsselformat -2. Wahrscheinlichkeit für Kollisionen (unter "realistischen Annahmen" über Schlüsselmenge S). (Klein, am besten $\leq c=m$ für c konstant.) - -#### 5.2.1.1. Fall: Schlüssel sind natürliche Zahlen: $U \subseteq \N$ -##### 5.2.1.1.1. Divisionsrestmethode -$h(x)= x\ mod\ x$ Sehr einfach, recht effzient. -Nachteile: -- Unflexibel: Nur eine feste Funktion für eine Tabellengröße. -- Bei strukturierten Schlüsselmengen (z. B. aus Strings übersetzte Schlüssel) deutlich erhöhtes Kollisionsrisiko. - -##### 5.2.1.1.2. Diskrete Multiplikationsmethode -$U=[2^k]$ und $m=2^l$. $h_a(x)=(ax\ mod\ 2^k)div 2^{k-l}$ -mit $a\in[2^k]$ ungerade und z.B. $\frac{a}{2^k} \approx \frac{1}{2}(\sqrt{5} -1 ) = 0,618...$ -Oder: $a\in [2^k]$ ungerade, zufällig. Sehr effziente Auswertung ohne Division. - -#### 5.2.1.2. Fall: Schlüssel sind Strings/Wörter: $U \subseteq Seq(\sum)$ -$\sum$:"Alphabet" (endliche nichtleere Menge). $Seq(\sum)$: Menge aller endlichen Folgen von Elementen von $\sum$:"Wörter über $\sum$". -- Kollisionen $n(x) = n(y)$ nie auflösbar! -- Selbst wenn n injektiv: Ineffziente Auswertung von $h(^x)$. -##### 5.2.1.2.1. Lineare Funktionen über Körper $\Z_p = [p] = {0,...,p-1}$ -$\sum \subseteq [p]$ für p Primzahl, $m = p$. (Beispiel: ISO-8859-1 $b= [256] \subseteq [p] = [1009]$) -Wähle Koeffzienten $a_1, ..., a_r \in [p]$ mit $h(c_1...c_r)=(\sum_{i=1}^r a_i*c_i) mod\ p$ -Vorteile: -- Rechnung nur mit Zahlen $< p_2 = m_2$ (wenn man nach jeder Multiplikation/Addition Rest modulo p bildet); -- sehr effzient; -- theoretisch nachweisbares gutes Verhalten, wenn $a_1,...,a_r$ aus $[p]$ zufällig gewählt werden. - -### 5.2.2. Anspruchsvolle Hashfunktionen -Qualitätskriterien: -1. Zeit für Auswertung von $h(x)$ (klein!) -2. geringe Wahrscheinlichkeit für Kollisionen ohne Annahmen über die Schlüsselmenge S (ähnlich der zufälligen Situation!) -3. Effiientes Generieren einer neuen Hashfunktion (benötigt z.B. bei der Verdoppelungsstrategie) -4. Platzbedarf für die Speicherung von h (Programmtext, Parameter) (gering gegenüber n!) - -Universelles Hashing (Idee): Bei der Festlegung der Hashfunktion h wird (kontrolliert) Zufall eingesetzt ("Randomisierter Algorithmus"). (Bei Programmierung: "Pseudozufallszahlengenerator", in jeder Prog.-Sprache bereitgestellt.) Analyse beruht auf dadurch vom Algorithmus erzwungenen Zufallseigenschaften von h. - -$a_1,...,a_r$ seien (uniform) zufällig gewählt aus $[p]$. Definiere $h(c_1...c_r)=(a_1*c_1+...+a_r*c_r)mod\ p$. Es gilt für $x,z \in U$ mit $x \not = z$: $Pr(h(x)=h(z))?\frac{1}{p}$ - -Wähle a aus ${1, ..., p-1}$ (uniform) zufällig, wobei p Primzahl. Es gilt für $x,z \in U$ mit $x\not = z$: $Pr(h(x)=h(z))\leq \frac{2}{m}$ - -Mit multiplikativem Hashing (wobei $U=[2^k]$, $m=2^l$), mit $h(x)=(a*x\ mod\ 2^k)div\ 2^{k-l}$ als a eine zufällige ungerade Zahl in $[2^k]$ wählt, dann gilt für beliebige $x,z\in U, x\not = z$: $Pr(h(x)=h(z))\leq \frac{2}{2^l}=\frac{2}{m}$ - -**Tabellenhashing** -Universum $U=\sum^r$, mit $\sum={0,..., s-1}$. $m=2^l$ mit $l\leq w$ (w: Wortlänge, z.B. w=32). Wertebereich: [m] entspricht ${0,1}^l$ via Binärdarstellung. Repräsentation der Hashfunktion h: Array $A[1...r, 0... s-1]$ mit Einträgen aus ${0,1}^w$ -- Nachteil: Array $A[1..r,0..s-1]$ benötigt Platz $r*s$ (Wörter). Sinnvoll nur für große Hashtabellen. - - Platzsparend, etwas langsamer: $\sum={0,1}^4={0,1,...,9,A,...,F}$ ("Tetraden" bzw. Hexadezimalziffern.) -- Vorteile von Tabellenhashing: - - Extrem schnelle Auswertung - - Dasselbe A kann für $m=2^4,2^5,2^6,...,2^w$ benutzt werden. Ideal für die Kombination mit der Verdoppelungsstrategie: Verdopple Tabellengröße = erhöhe l um 1; Einträge in A bleiben unverändert. - - Beweisbar gutes Verhalten, wenn Einträge von A zufällig. - -Sei c konstant. Wenn $Pr(h(x) = h(z))\leq \frac{c}{m}$, für beliebige $x,z\in U$, $x \not = z$, und wenn wir Hashing mit verketteten Listen benutzen, dann ist die erwartete Zahl von Schlüsselvergleichen -- höchstens $c*a$ bei der erfolglosen Suche und -- höchstens $1 + c*a$ bei der erfolgreichen Suche. - -## 5.3. Geschlossenes Hashing -> oder "offene Adressierung": Kollisionsbehandlungs-Methode. -Idee: Für jeden Schlüssel $x\in U$ gibt es eine Sondierungsfolge $h(x,0),h(x,1),h(x,2),...$ in [m]. Beim Einfügen von x und Suchen nach x werden die Zellen von T in dieser Reihenfolge untersucht, bis eine leere Zelle oder der Eintrag x gefunden wird. - -### 5.3.1. Lineares Sondieren -$h(x,k)=(h(x)+k)mod\ m, k=0,1,2,...$ - -Ergebnisse für lineares Sondieren: Eine einzelne erfolglose Suche wird z.B. bei zu 90% gefüllter Tabelle durchaus teuer. Bei vielen erfolglosen Suchen in einer nicht veränderlichen Tabelle (anwendungsabhängig!) sind diese Kosten nicht tolerierbar. $a\leq 0,6$ oder $0,7$ liefert jedoch akzeptable Suchkosten. Die (über $x_i\in S$) gemittelte Einfüge-/Suchzeit ist dagegen sogar bei 90% gefüllter Tabelle erträglich. - -### 5.3.2. Quadratisches Sondieren -$h:U\rightarrow [m]$ sei beliebige Hasfunktion. $h(x,k)=(h(x)+\lceil \frac{k}{2} \rceil^2 * (-1)^{k+1})mod\ m$, für $k=0,1,2,...$ -Ist m Primzahl, so dass $m+1$ durch 4 teilbar ist, dann gilt bei der Verwendung von quadratischem Sondieren: ${h(x,k)| 0\leq k < m}=[m]$ -Quadratisches Sondieren verhält sich sehr gut. - -### 5.3.3. Doppel Hashing -Benutze zwei (unabhängig berechnete) Hashfunktionen $h_1:U\rightarrow [m]$ und $h_2:U\rightarrow [m-1]$ und setzte für $k=0,1,...$: $h(x,k):=(h_1(x)+k*(1+h_2(x)))mod\ m$. Wenn m Primzahl ist, dann gilt für Doppel-Hashing ${h(x,k) | 0 \leq k < m}$. Man kann beweisen: Wenn $h_1(x), h_2(x), x \in S$, rein zufällig sind, verhält sich Doppel-Hashing sehr gut, nämlich im Wesentlichen wie "Uniformes Sondieren". - -### 5.3.4. Uniformes Sondieren / Ideales Hashing -Keine Methode, sondern eine Wahrscheinlichkeitsannahme für Verfahren mit offener Adressierung: -$(h(x,0), h(x,1),..., h(x,m-1))$ ist eine rein zufällige Permutation von $[m]$, unabhängig für jedes $x\in U$. - -## 5.4. Löschen -Jede Zelle hat Statusvariable status (voll, leer, gelöscht ). -Löschen: Zelle nicht auf leer, sondern auf gelöscht setzen (engl.:"tombstone"). -Suchen: Immer bis zur ersten leeren Zelle gehen. -Zellen, die gelöscht sind, dürfen mit einem neuen Schlüssel überschrieben werden. - -Überlauf tritt spätestens ein, wenn die letzte leere Zelle beschrieben werden würde. -Sinnvoller: Überlauf tritt ein, wenn die Anzahl der vollen und gelöschten Zellen zusammen eine feste Schranke bound überschreitet. - -Operationen bei offener Adressierung -- empty(m): - - Lege leeres Array $T[0...m-1]$ an. - - Initialisiere alle Zellen $T[j]$ mit $(-,-, leer)$. - - Wähle Hashfunktion $h: U x [m] \rightarrow [m]$. - - Initialisiere inUse mit 0. (Zählt nicht-leere Zellen.) - - Initialisiere load mit 0. (Zählt Einträge.) - - Initialisiere bound (z.B. mit $\alpha_0m$, maximal $m-1$). -- lookup/delete(x) - - Finde erstes l in der Folge $h(x,0),h(x,1),h(x,2),...$ mit - - 1.Fall: $T[l].status = leer$: return "not found" bzw mache nichts - - 2.Fall: $T[l].status = voll$ und $T[l].key=x$: return data bzw lösche key und setzte status auf gelöscht (load--) -- insert(x) - - 1. Fall: $T[l].status = voll$: $T[l].data \leftarrow r$ (Update) - - 2. Fall: $T[l'].status = gelöscht: T[l']\leftarrow (x,r,voll); load++ (überschreibe gelöschtes Feld) - - 3. Fall: $T[l'].status = leer$: $l=l'$, neue Zelle - -## 5.5. Cuckoo Hashing -Implementierung eines dynamisches Wörterbuchs. Zwei Tabellen $T_1, T_2$, jeweils Größe m. Zwei Hashfunktionen $h_1$ und $h_2$, $x\in S$ sitzt in $T_1[h_1(x)]$ oder in $T_2[h_2(x)]$. $\Rightarrow$ Konstante Suchzeit garantiert; auch delete(x) in $O(1)$ Zeit. -$h_1,\ h_2$ passen zu $S$, falls die Schlüssel aus $S$ gemäß der Regel gespeichert werden können, d.h. man kann $S$ in $S_1$ und $S_2$ partitionieren, so dass $h_1$ auf $S_1$ und $h_2$ auf $S_2$ injektiv ist. Das Verfahren heißt "Kuckucks-Hashing" wegen seiner Einfügeprozedur: -Schlüssel $x$, der eingefügt werden soll, kann Schlüssel $y$, der in $T_1[h_1(x)]$ oder $T_2[h_2(x)]$ ("im Nest") sitzt, hinauswerfen (verdrängen). Der verdrängte Schlüssel geht zu seinem alternativen Platz. - -Hashfunktionen verteilen Schlüssel rein zufällig. Wenn man Cuckoo-Hashing mit $n$ Schlüsseln in zwei Tabellen mit je m Plätzen durchführt, wobei $\frac{}{m} \leq 1- \beta$ (essenziell!), dann passen $h_1, h_2$ mit Wahrscheinlichkeit $1-O(\frac{1}{m})$ zur Schlüsselmenge S. -Falls $h_1, h_2$ passen, ist die erwartete Einfügezeit $O(\frac{1}{\beta} )$. -Nachteil: Auslastung der Tabelle unter 50%. - -# 6. Sortierverfahren -Input: Tupel $x =(a_1,..., a_n)$ von Objekten $a_i$ mit Schlüssel- und Datenteil: $a_i.key$ und $a_i.data$. Gegeben als Array $A[1..n]$ oder als lineare Liste. - -Stabil (Bei Vorkommen gleicher Sortierschlüssel) Sortierverfahren heißt stabil, wenn Objekte mit identischen Schlüsseln in der Ausgabe in derselben Reihenfolge stehen wie in der Eingabe. - -Maßzahlen für Sortieralgorithmen (in Abhängigkeit von n): -1. Laufzeit (in O-Notation) -2. Anzahl der Vergleiche ( wesentliche Vergleiche“) - ”$a_i.key < a_j.key$“ bzw. "$a_i.key \leq a_j.key“ -3. Anzahl der Datenverschiebungen oder Kopiervorgänge -4. der neben dem Array (bzw. der linearen Liste) benötigte Speicherplatz; - wenn dieser nur $O(1)$, also von n unabhängig, ist: Algorithmus arbeitet "in situ“ oder "in-place“. - -## 6.1. Mergesort -(engl. merge = vermengen, reißverschlussartig zusammenfügen) -Algorithmenparadigma oder -schema: "Divide-and-Conquer“ (D-a-C, teile und herrsche“). (Kleine Teilarrays werden durch Insertionsort sortiert) -Sortiert stabil. Rechenzeit ist $\Theta(n\ log(n))$ - -Vorgehen auf Instanz $x\in I$: -0. Trivialitätstest: Wenn P für x einfach direkt zu lösen ist, tue dies. – Sonst: -1. Teile: Zerteile x in (zwei oder mehr) Stücke $x_1,..., x_a \in I$. - (Wesentlich für Korrektheit/Terminierung: Jedes der Stücke ist "kleiner“ als x .) -2. Rekursion: Löse P für $x_1,..., x_a$, separat, durch rekursive Verwendung von A. - Teillösungen: $r_1,..., r_a$ . -3. Kombiniere: Baue aus $x$ und $r_1,..., r_a$ und $x_1,..., x_a$ eine Lösung $r$ für $P$ auf $x$ auf. - -```cpp -function Mergesort (a, b) // 1 ≤ a ≤ b ≤ n , sortiert A[ a..b ] - if b − a ≤ n 0 // n 0 ≥ 0 ist vorausgesetzt - then Insertionsort (a, b) - else // Wissen: Länge von A[ a..b ] ist ≥ 2 - m = a + $\lfloor$b(b − a)/2 $\rfloor$; - Mergesort(a, m); - Mergesort( m + 1, b) ; - Merge (a, m , b) // fügt sortierte Teilfolgen zusammen; - -function Merge (a, m, b) // für 1 ≤ a ≤ m < b ≤ n , sortiert A[ a..b ], nimmt an, dass A[ a..m ] und A[ m + 1..b ] sortiert sind. - i = a; // Index in A[ a..m ] - j = m + 1; // Index in A[ m + 1..b ] - k = a; // Index in B[ a..b ] - while i ≤ m and j ≤ b do - if A[i] ≤ A[j] - then B[k] = A[i]; ++i; ++k - else B[k] = A[j]; ++j; ++k // verbleibendes Schlussstück kopieren: - while i ≤ m do B[k] = A[i]; ++i; ++k; - while j ≤ b do B[k] = A[j]; ++j; ++k; - // B[ a..b ] nach A[ a..b ] kopieren: - for k from a to b do A[k] = B[k] -``` - -## 6.2. Quicksort -Folgt ebenso wie Mergesort dem Divide-and-Conquer-Ansatz. -Quicksort ist nicht stabil. -Rechenzeit beträgt $O(n)+O(Gesamtzahl\ aller\ Schlüssel) =: V$ - -Ansatz für qsort(a, b), gleichzeitig Korrektheitsbetrachtung: -0. Trivialitätstest: Wenn $a \leq b$, ist nichts zu tun. (Oder: Wenn b − a < n 0 : Insertionsort(a, b).) -1. Teile: (Hier "partitioniere“) Wähle Pivotelement x ∈ {A[a].key,...,A[b].key}. - Arrangiere die Einträge von A[a..b] so um, dass für ein p mit a ≤ p ≤ b gilt: - A[p].key = x und A[a].key, . . . , A[p − 1].key ≤ x < A[p + 1].key, . . . , A[b].key. -2. Rekursion auf Teilinstanzen x 1 = A[a..p − 1] und x 2 = A[p + 1..b]: - qsort(a, p − 1); r qsort(p + 1, b). - Nach I.V. gilt nun: A[a..p − 1], A[p + 1..b] sortiert. -3. Kombiniere: Es ist nichts zu tun: A[a..b] ist sortiert. - -- "Clever Quicksort“: Das Pivotelement x ist der Median der drei Schlüssel A[a].key, A[b].key, A[a + b(b − a)/2c].key -- "Randomisiertes Quicksort“: Wähle einen der b − a + 1 Einträge in A[a..b] zufällig. -- Allgemein: Wähle ein s mit a ≤ s ≤ b, vertausche A[a] mit A[s]. Das Pivotelement ist danach immer A[a].key. - -```cpp -function qsort(a, b) // Rekursive Prozedur im Quicksort-Algorithmus, 1 ≤ a ≤ n + 1, 0 ≤ b ≤ n. - if a < b then - s = ein Element von {a, . . . , b}; // Es gibt verschiedene Methoden, um s zu wählen; - vertausche A[a] und A[s]; - partition(a, b, p); // p: Ausgabeparameter - qsort(a, p − 1); - qsort(p + 1, b); - -function partition(a, b, p) // Voraussetzung: a < b; Pivotelement: A[a] - x = A[a].key; - i = a + 1; - j = b; - while i ≤ j do // noch nicht fertig; Hauptschleife - while i ≤ j and A[i].key ≤ x do ++i; - while j > i and A[j].key > x do --j; - if i = j then --j; // Wissen: A[i].key > x - if i < j then - vertausche A[i] und A[j]; - ++i; --j; - if a < j then vertausche A[a] und A[j]; - p = j; // Rückgabewert -``` - - -## 6.3. Heapsort -Heap-Ordnung in Binärbäumen - -Min-Heapsort: Ein Binärbaum T mit Knotenbeschriftungen m(v) aus (U, <) heißt min-heapgeordnet (kurz oft: heapgeordnet), wenn für alle Knoten v und w gilt: v Vorgänger von w ⇒ m(v) ≤ m(w). ⇒ in Knoten v steht der minimale Eintrag des Teilbaums $T_v$ mit Wurzel v. -T heißt max-heapgeordnet, wenn für alle v , w gilt: v Vorgänger von w ⇒ m(v) ≥ m(w). - -Ein "linksvollständiger“ Binärbaum: Alle Levels j = 0, 1, . . . voll (jeweils 2 j Knoten) bis auf das tiefste. Das tiefste Level l hat von links her gesehen eine ununterbrochene Folge von Knoten. - -(Unendlicher) vollständiger Binärbaum (mit Kunstwurzel), Kante zu linkem/rechtem Kind mit 0/1 beschriftet, Knoten gemäß Leveldurchlauf-Anordnung nummeriert. Beispiel: $(101110)_2 = 46$. Damit können linksvollständige Binärbaume ohne Zeiger als Arrays dargestellt werden: -Speichere Eintrag zu Knoten Nummer i im Baum in A[i]. -Dennoch können wir leicht zu Kindern und Vorgängern navigieren: -- Knoten 1 ist die Wurzel; -- Knoten 2i ist linkes Kind von i; -- Knoten 2i + 1 ist rechtes Kind von i; -- Knoten i ≥ 2 hat Vorgänger $\lfloor i/2 \rfloor$. - -Min-Heap: $A[\lfloor i/2 \rfloor ].key ≤ A[i].key$, für 1 < i ≤ k (analog Max-Heap) - -### 6.3.1. Heap reparieren -Heaps reparieren nach austausch von Knoten/Werten: -```cpp -function bubbleDown (1, k) // Heap-Reparatur in A[ 1 . . k ]. Vorbedingung: Höchstens A[ 1 ] ist zu groß - j = 1; // aktueller Knoten“ - done = (2 · j > k); - while not done do // (∗) höchstens A[j] ist zu groß, A[j] hat Kind A[ 2 · j] im Baum - m = 2 · j; - if m + 1 ≤ k and A[m+1].key < A[m].key - then m = m + 1 ; // nun gilt: A[m] ist einziges oder "kleineres“ Kind von A[j] - if A[m].key < A[j].key - then vertausche A[j] mit A[m]; - j = m; // neuer aktueller Knoten - done = (2 · j > k) ; // wenn done = false, gilt wieder (∗) - else done = true. // fertig, kein Fehler mehr. -``` - -### 6.3.2. Heap sortieren -Die Idee von Heapsort für ein Array A[1..n] ist nun folgende: -1. (Heapaufbau) Arrangiere A[1..n] so um, dass ein Heap entsteht. -2. (Auswahlphase) Für k von n abwärts bis 2: - Entnimm kleinsten Eintrag A[1] aus dem Heap A[1..k]. Stelle mit den in A[2..k] verbliebenen Einträgen in A[1..k − 1] wieder einen Heap her. - (In A[k] ist dann Platz für den entnommenen Eintrag.) - -```cpp -function HeapSelect(1, n) - for k from n downto 2 do // in A[1] steht das Minimum von A[1..k] - vertausche A[1] mit A[k]; // in A[1..k − 1] ist höchstens A[1] zu groß - bubbleDown(1, k − 1); // Heapreparatur -``` -Die Prozedur HeapSelect(1, n) führt höchstens 2n log n Vergleiche durch und hat Rechenzeit O(n log n). - -### 6.3.3. Heap aufbauen -Idee: Betrachte im linksvollständigen Baum mit n Knoten die Teilbäume $T_l$ mit Wurzel l, und stelle in diesen "von unten nach oben“, also in der Reihenfolge $l = n, n − 1, . . . , 3, 2, 1$, die Heapbedingung her. - -Also löst die folgende Variante von bubbleDown (s.o.) die Aufgabe (mit j=l als Startbedingung). -```cpp -function makeHeap(1, n) // Transformiert Array A[1 . . n] in einen Heap - for ell from $\lfloor$ n/2 $\rfloor$ downto 1 do - bubbleDown(ell, n); -``` -Ein Aufruf makeHeap(1, n) wandelt A[1..n] in einen Heap um. Die Anzahl der Vergleiche ist nicht größer als 2n; die Rechenzeit ist $O(n)$. - -#### 6.3.3.1. HeapSort -Der Aufruf HeapSort(A[1 . . n]) sortiert A[1 . . n] in fallende Reihenfolge. Die gesamte Rechenzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1). HeapSort arbeitet in situ/in-place (ist aber nicht stabil). -```cpp -function HeapSort(A[1 . . n]) - makeHeap(1, n); - HeapSelect(1, n); -``` - -## 6.4. Datentyp: Prioritätswarteschlange (oder Vorrangwarteschlangen) -In einer Prioritätswarteschlange werden Objekte aufbewahrt, die mit einem Schlüssel aus einem totalgeordneten Universum (U, <) versehen sind. (Oft sind die Schlüssel Zahlen.) Objekte werden eingefügt und entnommen. Einfügungen sind beliebig möglich. Beim Entnehmen wird immer ein Eintrag mit minimalem Schlüssel gewählt. Idee: Schlüssel entsprechen hier "Prioritäten“ – je kleiner der Schlüssel, desto höher die Priorität. Wähle stets einen Eintrag mit höchster Priorität! Der Datentyp Prioritätswarteschlage ist mit Heaps effizient zu realisieren. - -Datentyp: SimplePriorityQueue (Einfache Prioritätswarteschlange) -1. Signatur: - - Sorten: - - Keys - - Data - - PrioQ // "Priority Queues“ - - Boolean - - Operatoren: - - empty : → PrioQ - - isempty : PrioQ → Boolean - - insert : PrioQ × Keys × Data → PrioQ - -extractMin: PrioQ → PrioQ × Keys × Data -2. Mathematisches Modell - - Sorten: - - Keys: (U, <) //totalgeordnetes Universum - - Data: D // Menge von "Datensätzen" - - Boolean: {false, true} - - PrioQ: die Menge aller endlichen Multimengen (Elemente dürfen mehrfach vorkommen) P ⊆ U × D - - Operationen: - - empty ( ) = ∅ // die leere Multimenge - - isemtpy(P) = true, für P = ∅; false, für $P \not= ∅$ - - insert(P, x, d) = P ∪ {(x, d)} (als Multimenge), - - extractMin(P) = undefiniert, wenn P = ∅; (P' , x_0 , d_0 ), wenn P \not= ∅ - -extractMin: Implementierung von extractMin(P): Ein Eintrag mit minimalem Schlüssel steht in der Wurzel, d. h. in Arrayposition 1. -Zeitaufwand: $O(log(n))$, wobei n die aktuelle Größe des Heaps ist. -```cpp -function extractMin() -// Entnehmen eines minimalen Eintrags aus Priority-Queue -// Ausgangspunkt: Pegelstand n (in n), A[1 . . n] ist Heap, n ≥ 1 - if n = 0 - then Fehlerbehandlung“; - x = A[1].key; - d = A[1].data; - A[1] = A[n]; - n--; - if n > 1 then bubbleDown(1, n); - return (x, d); -``` - -Für Fehlerbehandlung z.B. bubbleUp um Heap zu reparieren -```cpp -function bubbleUp(i) // Heapreparatur ab A[i] nach oben - j = i; - h = $\lfloor$ j/2 $\rfloor$ ; - while h ≥ 1 and A[h].key > A[j].key do - vertausche A[j] mit A[h]; - j = h; - h = $\lfloor$ j/2 $\rfloor$. -``` - -Überlaufbehandlung -```cpp -function insert(x, d) // Einfügen eines neuen Eintrags in Priority-Queue -// Ausgangspunkt: Pegel n enthält n, A[1 . . n] ist Heap. - if n = m - then "Überlaufbehandlung"; // z. B. Verdopplung - n++; - A[n] ← (x, d); - bubbleUp(n) -``` - -Allgemeinere Operation: "decreaseKey" ersetzt einen beliebigen Schlüssel im Heap (Position i) durch einen kleineren. Mit bubbleUp(i) wird die Heapeigenschaft wieder hergestellt. -```cpp -function decreaseKey(x, i) -// Erniedrigen des Schlüssels an Arrayposition i auf x - if A[i].key < x - then Fehlerbehandlung - A[i].key = x; - bubbleUp(i) -``` - -Dabei erfordern empty und isempty (und das Ermitteln des kleinsten Eintrags) konstante Zeit, und insert, extractMin und decreaseKey benötigen jeweils Zeit O(log n). Dabei ist n jeweils der aktuelle Pegelstand, also die Anzahl der Einträge in der Prioritätswarteschlange. - - -### 6.4.1. Technisches Problem, noch zu klären: -Wie soll man der Datenstruktur "mitteilen“, welches Objekt gemeint ist, wenn decreaseKey auf einen Eintrag angewendet werden soll? -Erweiterung der Datenstruktur: Objekt (x, d) erhält bei Ausführung von insert (x, d) eine eindeutige und unveränderliche "Identität“ p zugeteilt, über die dieses Objekt angesprochen werden kann. (Damit können sogar verschiedene Kopien ein und desselben Datensatzes unterschieden werden!) - -Datentyp: PriorityQueue (Prioritätswarteschlange) -1. Signatur: - - Sorten: - - Keys - - Data - - Id // "Identitäten“ - - PrioQ - - Boolean - - Operationen: - - empty : → PrioQ - - isempty : PrioQ → Boolean - - insert: PrioQ × Keys × Data → PrioQ × Id - - extractMin: PrioQ → PrioQ × Id × Keys × Data - - decreaseKey : PrioQ × Id × Keys → PrioQ -2. Mathematisches Modell - - Sorten: - - Keys: (U, <) // totalgeordnetes Universum“ - - Data: D // Menge von Datensätzen“ - - Id: N = {0, 1, 2, . . .} // unendliche Menge möglicher Identitäten“ - - Boolean: {false, true} - - PrioQ: die Menge aller Funktionen f : X → U × D, wobei X = Def (f ) ⊆ N endlich ist - - Operationen: - - empty () = ∅ // die leere Funktion - - isempty(f) = true, für f = ∅; false, für f \not = ∅ - - insert(x, d, f ) = (f ∪ {(p, (x, d))}, p), für ein p ∈ N − Def(f ) - - extractMin(f) = undefiniert, für f = ∅; (f 0 , p 0 , x 0 , d 0 ), für f \not= ∅ - - decreaseKey(p,x) = (f − {(p, (y, d))}) ∪ {(p, (x, d))}, falls f (p) = (y, d) mit x ≤ y (sonst Fehler) - -## 6.5. Untere Schranke für Sortieren -Ein Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren, wenn in A auf Schlüssel x, y aus U nur Operationen: -$x dfs num(w). - -```cpp -function dfs (v) // "volle“ Tiefensuche in v , nur für v neu erlaubt - dfs count++; - dfs num[ v ] ← dfs count; - status[ v ] ← aktiv ; - dfs-visit (v) ; // Aktion an v bei Entdeckung für jeden Nachfolger w von v (Adjazenzliste!) tue: - 1. Fall: status[w] = neu: T ← T ∪ {(v, w )} ; dfs ( w ) ; - 2. Fall: status[w] = aktiv: B ← B ∪ {(v, w )} ; - 3. Fall: status[w] = fertig ∧ dfs num[ v ] < dfs num[w]: F ← F ∪ {(v, w )} ; - 4. Fall: status[w] = fertig ∧ dfs num[ v ] > dfs num[w]: C ← C ∪ {(v, w )} ; - f count++; - f num[ v ] ← f count; - fin-visit (v) ; // Aktion an v bei Abschluss - status[ v ] ← fertig . -``` - -Initialisierung: dfs count ← 0; f count ← 0. -Alle Knoten sind neu ; Mengen T , B, F , C sind leer. -Tiefensuche von $v_0$ aus ("dfs(v 0 )“) entdeckt $R_{v_0}$ . - -Tiefensuche für den ganzen Graphen: DFS(G) wie vorher, nur mit der voll ausgebauten dfs-Prozedur, und der Initialisierung von f count und T , B, F , C. -```cpp -function DFS (G) // Tiefensuche in G = (V, E) , voll ausgebaut - dfs count ← 0 ; - f count ← 0 ; - T ← ∅; B ← ∅; F ← ∅; C ← ∅; - for v from 1 to n do status[v] ← neu ; - for v from 1 to n do - if status[v] = neu then - dfs ( v ) ; // starte (volle) Tiefensuche von v aus -``` - -- Beobachtung 1: Jede Kante (v, w) wird genau einmal betrachtet und daher genau in eine der Mengen T , B, F und C eingeordnet. -- Beobachtung 2: Die dfs-Nummern entsprechen einem Präorder-Durchlauf, die f-Nummern einem Postorder-Durchlauf durch die Bäume des Tiefensuch-Waldes. -- Beobachtung 3: Folgende Aussagen sind äquivalent: - - dfs(w) beginnt nach dfs(v) und endet vor dfs(v) (d.h. dfs (w) wird (direkt oder indirekt) von dfs (v) aus aufgerufen); - - dfs num[v] < dfs num[w] ∧ f num[v] > f num[w]; - - v ist Vorfahr von w im Tiefensuch-Wald. - - -## 8.3. Tiefensuche in ungerichteten Graphen -Einfacher als Tiefensuche in gerichteten Graphen. -Zweck: -- Zusammenhangskomponenten finden -- Spannbaum für jede Zusammenhangskomponente finden -- Kreisfreiheitstest - -```cpp -function udfs(v) // Tiefensuche von v aus, rekursiv; nur für v mit status[v] = neu aufrufen - dfs count++; - dfs num[v] ← dfs count; - dfs-visit(v); // Aktion an v bei Erstbesuch - status[v] ← aktiv ; - für jede neue“ Kante (v, w) (Adjazenzliste!) tue: - setze Gegenkante (w, v) auf gesehen“ ; - 1. Fall: status[w] = neu : T ← T ∪ {(v, w)}; udfs(w); - 2. Fall: status[w] = aktiv: B ← B ∪ {(v, w)}; - f count++; - f num[v] ← f count; - fin-visit(v); // Aktion an v bei letztem Besuch - status[v] ← fertig. - -//Globale Tiefensuche in (ungerichtetem) Graphen G: -function UDFS(G) // Tiefensuche in G = (V, E) - dfs_count ← 0; - f_count ← 0; - for v from 1 to n do status[v] ← neu ; - T ← ∅; B ← ∅; - for v from 1 to n do - if status[v] = neu then - udfs(v); // starte Tiefensuche von v aus -``` - -$udfs(v_0)$ werde aufgerufen. Dann gilt: -- $udfs(v_0)$ entdeckt genau die Knoten in der Zusammenhangskomponente von $v_0$ -- Die Kanten (v, w), für die udfs(w) unmittelbar aus udfs(v) aufgerufen wird, bilden einen gerichteten Baum mit Wurzel v 0 ("Tiefensuchbaum") -- (Satz vom weißen Weg) u ist im DFS-Baum ein Nachfahr von v genau dann wenn zum Zeitpunkt des Aufrufs udfs(v) ein Weg von v nach u existiert, der nur neue (weiße) Knoten enthält. - -$UDFS(G)$ werde aufgerufen. Dann gilt: -- Die T -Kanten bilden eine Reihe von Bäumen (die Tiefensuch-Bäume). Die Knotenmengen dieser Bäume sind die Zusammenhangskomponenten von G. -- Die Wurzeln der Bäume sind die jeweils ersten Knoten einer Zusammenhangskomponente in der Reihenfolge, die in Zeile (2) benutzt wird. - -Gesamtrechenzeit: $O(|V | + |E|)$: linear! - -Kreisfreiheitstest in Graphen und Finden eines Kreises, wenn es einen gibt: -Nach Ausführung von UDFS(G) gilt: $B \not= ∅ ⇔ G$ enthält einen Kreis. - -## 8.4. Kreisfreiheitstest und topologische Sortierung -- Ein Kantenzug $(v_0 , v_1 , . . . , v_k )$ in einem Digraphen G heißt ein Kreis oder Zyklus, wenn k ≥ 1 und $v_0 = v_k$ . -- Ein Kreis $(v_0 , v_1 , . . . , v_{k−1} , v_0 )$ heißt einfach, wenn $v_0 , . . . , v_{k−1}$ verschieden sind. - -- Ein Digraph G heißt kreisfrei oder azyklisch, wenn es in G keinen Kreis gibt, sonst heißt G zyklisch. -- Azyklische gerichtete Graphen: "Directed Acyclic Graphs", daher DAGs. - -## 8.5. Starke Zusammenhangskomponenten in Digraphen -Zwei Knoten v und w in einem Digraphen G heißen äquivalent, wenn $v \rightarrow w$ und $w \rightarrow v$ gilt. – Notation: $v \leftrightarrow w$. - -Die Äquivalenzklassen zur Relation $\leftrightarrow$ heißen starke Zusammenhangskomponenten von G. - -- Trick 1: Führe DFS im "Umkehrgraphen“ $G^R$ durch, der durch Umkehren aller Kanten in G entsteht. - - Beobachtung: G R hat dieselben starken Zusammenhangskomponenten wie G. -- Trick 2: Verwende die f-Nummern einer ersten DFS in G, um zu bestimmen, in welcher Reihenfolge die Knoten in der Hauptschleife der zweiten DFS (in $G^R$ ) betrachtet werden. - -Strong Components(G) (von S. R. Kosaraju, 1978) -- Eingabe: Digraph G = (V, E) -- Ausgabe: Starke Zusammenhangskomponenten von G -- (1) Berechne die f-Nummern mittels DFS(G); -- (2) Bilde "Umkehrgraphen“ $G^R$ durch Umkehren aller Kanten in G; -- (3) Führe $DFS(G^R)$ durch; Knotenreihenfolge: f-Nummern aus (1) absteigend -- (4) Ausgabe: Die Knotenmengen der Tiefensuchbäume aus (3) . - - -# 9. Divide-and-Conquer-Algorithmen -## 9.1. Multiplikation ganzer Zahlen -Algorithmus Karatsuba(x, y)\ -Eingabe: Zwei n-Bit-Zahlen x und y, nichtnegativ -```cpp -if n ≤ n 0 - then return SM(x, y) // Schulmethode -else - k ← dn/2e; - zerlege x = A · 2 k + B und y = C · 2 k + D; - E ← A − B und F ← C − D; // auf dn/2e Bits aufgefüllt - G ← Karatsuba(A, C); // Rekursion - H ← Karatsuba(B, D); // Rekursion - I ← Karatsuba(|E|, |F |); // Rekursion - return G · 2 2k + (G + H − sign(E) · sign(F ) · I) · 2 k + H -``` -## 9.2. Matrixmultiplikation -Eingabe: Zwei $n × n$-Matrizen A und B. -- Falls $n ≤ n_0$ : Berechne $A · B$ mit der direkten Methode. Kosten $n^3_0$ Multiplikationen. -- Falls $n > n_0$ , zerlege A, B in jeweils 4 quadratische $(n\ 2) ×(n\ 2)$-Teilmatrizen -$A=(\frac{C | D}{E | F}); B=(\frac{G | H}{K | L}); A*B=(\frac{C*G+D*K| C*H+D*L}{E*G+F*K| E*H+F*L})$ -$\rightarrow$ Einfache Analyse ergibt: Dies führt zu $n^3$ Multiplikationen in R, kein Gewinn. - -Mit "Straßentrick": 7 Multiplikationen genügen -- $P_1 = C · (H − L) $ -- $P_5 = (C + F ) · (G + L)$ -- $P_2 = (C + D) · L $ -- $P_6 = (D − F ) · (K + L)$ -- $P_3 = (E + F ) · G $ -- $P_7 = (C − E) · (G + H)$ -- $P_4 = F · (K − G)$ -Dann: -$A x B = (\frac{P_5 + P_4 − P_2 + P_6 | P_1 + P_2}{ P_3 + P_4 | P_1 + P_5 − P_3 − P_7})$ - -## 9.3. Master Theorem -"Rekursionsbaum“: Veranschaulicht Kostenaufteilung -Wenn v ein Knoten auf Level i ist, dann gilt: $B(n/b_i ) ≤$ Summe der Einträge im Unterbaum unter v. - -Es gelte $B(n) ≤ \begin{} g, falls n = 1; \ a · B(n/b) + f (n) , sonst, \end{}$ -für ganzzahlige konstante $b > 1$ und $a > 0$. Dann gilt für $n = b^l$: -1. Fall: $f (n) = O(n^α )$ mit $α < log_b a$. Dann: $B(n) = O(n*log_b a )$ -2. Fall: $f (n) = O(n^α )$ mit $α = log_b a$. Dann: $B(n) = O(n*log_b a * log n)$ -3. Fall: $f (n) = Ω(n^α )$ mit $α > log_b a$ und $f(n/b) ≤ \frac{c}{a} * f (n)$, für c < 1 konstant. - Dann gilt $B(n) = O(f (n))$. - -## 9.4. Das Selektionsproblem -Gegeben ist eine Folge $(a_1 , . . . , a_n )$ von n Objekten aus einer totalen Ordnung $(D, <)$ (in Array oder als Liste), sowie eine Zahl $k, 1 ≤ k ≤ n$. -Aufgabe: Finde das Element x der Folge, das Rang k hat, d. h. das Objekt x in der Liste mit $|{i | a_i < x}| < k ≤ |{i | a_i ≤ x}|$. - -```cpp -Prozedur rqSelect(a, b, k) -// Rekursive Prozedur im Quickselect-Algorithmus, 1 ≤ a ≤ b ≤ n , a ≤ k ≤ b . -// Vorbedingung: Alle Einträge vom Rang < a [ > b ] links [rechts] von A[ a..b ] -// Nachbedingung: Eintrag vom Rang k in A[ k ], kleinere links, größere rechts davon. - if a = b (= k) then return; - s ← ein zufälliges Element von {a, . . . , b}; - if (a < s) then vertausche A[a] und A[s]; - partition(a, b, p); // wie bei rqsort - if k = p then return; - if k < p then rqSelect(a, p − 1, k) - else rqSelect(p + 1, b, k). -``` - - -# 10. Greedy-Algorithmen: Prinzipien -Greedy-Algorithmen sind anwendbar bei Konstruktionsaufgaben, deren Ziel es ist, eine optimale Struktur zu finden, die aus mehreren Komponenten besteht. Sie finden eine Lösung, die sie schrittweise aufbauen. -In jedem Schritt wird eine "lokal“ oder aus der aktuellen Sicht optimale Entscheidung getroffen, ohne "an die Zukunft zu denken“. -(Was dies konkret bedeutet, versteht man besser anhand der später betrachteten Beispiele.) -Es werden dabei nicht mehr Teillösungen konstruiert als unbedingt nötig. -Es werden nie Entscheidungen korrigiert oder zurückgesetzt. - -## 10.1. Beispiel 1: Hörsaalbelegung -Gegeben: Veranstaltungsort (Hörsaal), Zeitspanne $[T_0 , T_1 )$ (z. B. 7 Uhr bis 21 Uhr) und eine Menge von n Aktionen (Vorlesungen oder ähnliches), die durch Start- und Endzeit spezifiziert sind: $[s_i , f_i )$ mit $T_0 ≤ s_i < t_i ≤ T_1$ , für $1 ≤ i ≤ n$. - -Gesucht: Belegung des Hörsaals, die möglichst viele Ereignisse mit disjunkten Zeitspannen stattfinden lässt. -$ A ⊆ {1, . . . , n}$ heißt zulässig, wenn alle $[s_i , f_i ), i ∈ A$, disjunkt sind. - -Trick: Bearbeite Ereignisse in der Reihenfolge wachsender Schlusszeiten. O.B.d.A.: Veranstaltungen nach Schlusszeiten aufsteigend sortiert (Zeitaufwand $O(n log n)$ ) , also: $f_1 ≤ f_2 ≤ · · · ≤ f_n$ -Wiederhole: Wähle die wählbare Aktion mit der kleinsten Schlusszeit und füge sie zum Belegungsplan hinzu. Eine Aktion ist wählbar, wenn ihre Startzeit mindestens so groß wie die Schlusszeit der letzten schon geplanten Veranstaltung ist. - -Algorithmus Greedy Scheduling (GS) -Eingabe: Reelle Zahlen $T_0 < T_1$ , Paare $(s_1 , t_1 ), . . . , (s_n , f_n )$, mit $T_0 ≤ s_i < f_i ≤ T_1$ für $1 ≤ i ≤ n$ -Ausgabe: Maximal großes $A ⊆ {1, . . . , n}$ mit $[s_i , f_i ), i ∈ A§, disjunkt -```cpp -Sortiere Paare // gemäß $f_1 , . . . , f_n$ , nummeriere um, so dass $f_1 ≤ · · · ≤ f_n$ ; -A ← {1}; -f_last ← f_1 ; -for i from 2 to n do - if s_i ≥ f_last then // [s i , f i ) wählbar - A ← A ∪ {i}; - f_last ← f_i ; -return A -``` - -## 10.2. Beispiel 2: Fraktionales ("teilbares") Rucksackproblem -Veranschaulichung: Ein Dieb stiehlt Säckchen mit Edelmetallkrümeln (Gold, Silber, Platin) und Edelsteinen. Er hat einen Rucksack mit Volumen b dabei. Durch teilweises Ausleeren der Säckchen kann er beliebige Teilvolumina herstellen. Der Wert pro Volumeneinheit ist unterschiedlich für unterschiedliche Materialien. Was soll er in seinen Rucksack mit Volumen b packen, um den Wert der Beute zu maximieren? - -Dazu: Benenne den Bruchteil $λ_i ∈ [0, 1]$, den er von Säckchen i mitnehmen soll. -Gegeben: ( n Objekte mit:) - - Volumina $a_1 , . . . , a_n > 0$, - - Nutzenwerte $c_1 , . . . , c_n > 0$, - - Volumenschranke b -Gesucht: - - Vektor $(λ_1 , . . . , λ_n ) ∈ [0, 1]^n$ , so dass $λ_1 a_1 + . . . + λ_n a_n ≤ b$ ("zulässig") und $λ_1 c_1 + . . . + λ_n c_n$ maximal. -Kern der Lösungsidee: - - Berechne "Nutzendichten“: $d_i=\frac{c_i}{a_i}, 1 \leq i \leq n$, - - und sortiere die Objekte gemäß $d_i$ fallend. - - Nehme von vorne beginnend möglichst viele ganze Objekte, bis schließlich das letzte Objekt teilweise genommen wird, so dass die Volumenschranke vollständig ausgeschöpft wird. - -```cpp -function Greedy_Fractional_Knapsack() //(GFKS) - for i from 1 to n do - d_i = c_i /a_i ; - λ_i = 0; - Sortiere Objekte gemäß d i fallend; - i = 0; - r = b; // Inhalt r ist das verfügbare Rest-Volumen - while r > 0 do - i++; - if a_i ≤ r - then λ_i = 1; r = r − a_i ; - else λ_i = r/a_i ; - r = 0; -``` -Der Algorithmus GFKS ist korrekt (liefert eine zulässige Lösung mit maximalem Gesamtnutzen) und hat Rechenzeit $O(n log n)$. - -Charakteristika der Greedy-Methode: -1. Der erste Schritt der Greedy-Lösung ist nicht falsch. Es gibt eine optimale Lösung, die als Fortsetzung des ersten Schrittes konstruiert werden kann. -2. "Prinzip der optimalen Substruktur“: Kombiniert man das Ergebnis des ersten "Greedy-Schritts“ mit einer beliebigen optimalen Lösung für die reduzierte Instanz (Wegnehmen des Teils, der durch den ersten Schritt erledigt ist), dann ergibt sich eine optimale Lösung für die Originaleingabe. -3. Der Algorithmus löst das verbleibende Teilproblem rekursiv (oder mit einem zur Rekursion äquivalenten iterativen Verfahren). - -## 10.3. Huffman-Codes -Gegeben: Alphabet A mit $2 ≤ |A| < ∞$ und "Wahrscheinlichkeiten“ oder relativen Häufigkeiten“ $p(a) ∈ [0, 1]$ für jedes $a ∈ A$. -Also: $\sum_{a \in A} p(a) = 1$ - -Gesucht: ein "guter" binärer Präfixcode für (A, p) -Definition Präfixcode: Jedem $a ∈ A$ ist "binärer Code“ $c(a) ∈ {0, 1}^∗$ (Menge aller Binärstrings) zugeordnet, mit Eigenschaft Präfixfreiheit: Für $a, b ∈ A, a \not= b$ ist $c(a)$ kein Präfix von $c(b)$. - - -Kompakte Repräsentation des Codes als Binärbaum. Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das -Codewort wieder (links: 0, rechts: 1). - -Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. -Wiederhole mit dem Restwort, bis nichts mehr übrig ist. -Präfixeigenschaft ⇒ keine Zwischenräume nötig. - -1. Idee: Mache alle Codewörter $c(a)$ gleich lang. Am besten ist dann eine Länge von $\lceil log_2 |A| \rceil$ Bits. ⇒ $c(a_1 . . . a_m)$ hat Länge $\lceil log 2 |A| \rceil · m$. -2. Idee: Einsparmöglichkeit: Häufige Buchstaben mit kürzeren Wörtern codieren als seltenere Buchstaben. Ein erster Ansatz zur Datenkompression (platzsparendes Speichern, zeitsparendes Übermitteln)! Hier: verlustfreie Kompression“ – Information ist unverändert vorhanden - -Ein Codierungsbaum für A ist ein Binärbaum T , in dem -- die Kante in einem inneren Knoten zum linken bzw. rechten Kind (implizit) mit 0 bzw. 1 markiert ist -- jedem Buchstaben $a ∈ A$ ein Blatt (externer Knoten) von T exklusiv zugeordnet ist. -- Der Code $c_T (a)$ für a ist die Kanteninschrift auf dem Weg von der Wurzel zum Blatt mit Inschrift a. -- Die Kosten von T unter p sind definiert als: $B(T, p) = \sum_{a \in A} p(a) · d_T (a)$, $a∈A$ wobei $d_T (a) = |c_T (a)|$ die Tiefe des a-Blatts in T ist. -- Ein Codierungsbaum T für A heißt optimal oder redundanzminimal für p, wenn für alle Codierungsbäume $T_0$ für A gilt: $B(T, p) ≤ B(T_0 , p)$. - -Aufgabe: Gegeben (A, p), finde einen optimalen Baum. Methode: "Greedy“ -Es seien $a, a_0$ zwei Buchstaben mit $p(a) ≤ p(a_0 ) ≤ p(b)$ für alle $b ∈ A − {a, a_0 }$. ($a , a_0$ sind zwei "seltenste“ Buchstaben.) Dann gibt es einen optimalen Baum, in dem die Blätter für $a$ und $a_0$ "Geschwister“ sind, also Kinder desselben inneren Knotens. - -Damit ist der erste Schritt zur Realisierung eines Greedy-Ansatzes getan! -Man beginnt den Algorithmus mit "Mache die beiden seltensten Buchstaben zu Geschwistern“. Dann ist sicher, dass dies stets zu einer optimalen Lösung ausgebaut werden kann. Dann werden diese beiden Buchstaben "zusammengeklebt“, so dass man ein Alphabet erhält, das eine um 1 kleinere Größe hat. Konzeptuell wendet man dann Rekursion an. - -Huffman-Algorithmus (rekursiv): -Wir bauen "bottom-up“ einen Baum auf. -- Wenn |A| = 1: Baum hat nur einen (externen) Knoten. (Code für den einen Buchstaben ist das leere Wort. Seltsam, aber als Rekursionsbasis geeignet.) Die Kosten sind 0. (Optimalität ist klar.) -- Wenn |A| > 1, werden zwei "seltenste“ Buchstaben a, a 0 aus A zu benachbarten Blättern gemacht. - -Man könnte nach dem angegebenen Muster eine rekursive Prozedur programmieren. -- PQ: Datenstruktur Prioritätswarteschlange, - - Einträge: Buchstaben und Kunstbuchstaben; - - Schlüssel: die Gewichte p(b), b (Kunst-)Buchstabe. -- Operationen: - - PQ.insert: Einfügen eines neuen Eintrags; - - PQ.extractMin: Entnehmen des Eintrags mit kleinstem Schlüssel. - - Beide Operationen benötigen logarithmische Zeit (s. Kap. 6). - - Anfangs in PQ: Buchstaben a ∈ A mit Gewichten p(a) als Schlüssel. - - Ermitteln und Entfernen der beiden seltensten“ Buchstaben a, a 0 durch zwei Aufrufe ”PQ.extractMin"; - - Einfügen des neuen Kunstbuchstabens b durch PQ.insert(b). -- Resultierende Rechenzeit: $O(n log n)$, für $|A| = n$. - - - -Iterative Implementierung mit ein paar Tricks wird viel effizienter. - -Algorithmus Huffman($p[ 1 .. n ]$) -Input: Gewichts-/Wahrscheinlichkeitsvektor $p[ 1 .. n ]$, sortiert: $p [1] ≤ · · · ≤ p [n]$. -Output: Optimaler Baum T , dargestellt als $pred[1..2n − 2]$ und $mark[1..2n − 2]$ -```cpp -Erweitere den Vektor p[ 1 .. n ] auf Länge 2n − 1 ; -pred[1] ← n + 1; -pred[2] ← n + 1; -mark[1] ← 0; -mark[2] ← 1; -p[n + 1] ← p[1] + p[2] ; -k ← 3 // erster nicht verarbeiteter Knoten in [ 1..n ] -h ← n + 1 // erster nicht verarbeiteter Knoten in [ n + 1..2n − 2 ] -for b from n + 2 to 2n − 1 do // Die folgenden beiden Zeilen finden, in i und j, die Positionen der beiden noch nicht verarbeiteten Buchstaben mit kleinsten Gewichten - if k ≤ n and p[k] ≤ p[h] - then i ← k; - k++ - else - i ← h; - h++; - if k ≤ n and (h = b or p[k] ≤ p[h]) - then j ← k; - k++ - else - j ← h; - h++; - pred[i] ← b; - pred[j] ← b; - mark[i] ← 0 ; - mark[j] ← 1 ; - p[b] ← p[i] + p[j]; -``` -Ausgabe: $pred[ 1 .. 2n − 2 ]$ und $mark[ 1 .. 2n − 2 ]$. - -Aus $pred[1..2n−2]$ und $mark[1..2n−2]$ baut man den optimalen Huffman-Baum wie folgt: -Alloziere ein Array leaf[1..n] mit Blattknoten-Objekten -und ein Array inner[n + 1..2n − 1] mit Objekten für innere Knoten. -```cpp -for i from 1 to n do - leaf[i].letter ← Buchstabe a_i - if mark[i] = 0 - then inner[pred[i]].left ← leaf[i] - else inner[pred[i]].right ← leaf[i] -for i from (n + 1) to (2n − 2) do - if mark[i] = 0 - then inner[pred[i]].left ← inner[i] - else inner[pred[i]].right ← inner[i] -return inner[ 2n − 1 ] // Wurzelknoten -``` -Der Algorithmus Huffman ist korrekt und hat Laufzeit $O(n log n)$, wenn n die Anzahl der Buchstaben des Alphabets A bezeichnet. - -# 11. Greedy-Algorithmen für Graphprobleme -## 11.1. Kürzeste Wege mit einem Startknoten: Der Algorithmus von Dijkstra -1. Ein gewichteter Digraph $G = (V,E, c)$ besteht aus einem Digraphen $(V,E)$ und einer Funktion $c: E \rightarrow \R$, die jeder Kante $(v,w)$ einen Wert $c(v,w)$ zuordnet. -2. Ein gerichteter Kantenzug $p=(v_0, v_1,...,v_k)$ in G hat Kosten/länge/Gewicht $c(p)=\sum_{1\leq i \leq k} c(v_{i-1}, v_i)$ -3. Der (gerichtete) Abstand von $v,w \in V$ ist $d(v,w) :=$ min{c(p) | p Kantenzug von v nach w} - ($=\infty$ , falls kein Kantenzug von v nach w existiert; $=-\infty$, falls es von v nach w Kantenzüge mit beliebig stark negativen Kosten gibt.) - -Hier betrachten wir einen Algorithmus für das Problem "Single-Source-Shortest-Paths (SSSP) (Kürzeste Wege von einem Startknoten aus). -Gegeben: Gewichteter Digraph $G = (V, E, c)$ mit Kantenkosten $c(v, w) ≥ 0$ und $s ∈ V$ . -Gesucht: Für jedes $v ∈ V$ der Abstand $d(s, v)$ und im Fall $d(s, v) < \infty$ ein Weg von s nach v -der Länge $d(s, v)$. -$\rightarrow$ Der Algorithmus von Dijkstra löst dieses Problem. - -Algorithmus Dijkstra-Distanzen(G, s) -Eingabe: gewichteter Digraph $G = (V, E, c)$, Startknoten $s ∈ V$ -Ausgabe: Länge der kürzesten Wege von s zu den Knoten in G -```cpp -S = ∅; -dist[s] = 0; -for w ∈ V − {s} - do dist[w] = ∞; -while ∃u ∈ V − S: dist[u] < ∞ do // "Runde" - u = ein solcher Knoten u mit minimalem dist[u]; - S = S ∪ {u}; - for w mit (u, w) ∈ E und w $\not ∈$ S do // Nachfolger von u, nicht bearbeitet - dist[w] = min{dist[w], dist[u] + c(u, w)}; -Ausgabe: das Array dist[1..n]. -``` -Der Algorithmus Dijkstra-Distanzen gibt in $dist[v]$ für alle $v ∈ V$ den Wert $d(s, v) aus. - -Wir wollen aber eigentlich nicht nur die Distanzen $d(s, v)$, sondern kürzeste Wege berechnen. -Idee: Für jeden Knoten v merken wir uns, über welche Kante $(u, v)$ Knoten $v$ erreicht wurde. - -Algorithmus Dijkstra(G, s) -Eingabe: gewichteter Digraph $G = (V, E, c)$, Startknoten $s ∈ V$ -Ausgabe: Länge $d(s, v)$ der kürzesten Wege, Vorgängerknoten $p(v)$ -```cpp -S = ∅; -dist[s] = 0; -p[s] = −2; -for w ∈ V − {s} - do dist[w] = ∞; p[w] = −1; -while ∃u ∈ V − S: dist[u] < ∞ do - u = ein solcher Knoten u mit minimalem dist[u]; - S = S ∪ {u}; - for (u, w) ∈ E mit w $\not ∈$ S do // Nachfolger von u, nicht bearbeitet: update ( u , w ) - dd = dist[u] + c(u, w); - if dd < dist[w] then - dist[w] = dd; - p[w] = u; -Ausgabe: dist[1..n] und p[1..n]. -``` - -Nach dem Algorithmus ist klar, dass $p[v]\not = −1$ ("undefiniert“) genau dann gilt, wenn $dist[v] < \infty$. -Ein (einfacher) Weg $(s = v_0 , v_1 , . . . , v_t )$ in G heißt ein S-Weg, wenn alle Knoten außer eventuell $v_t$ in S liegen. - -Ergebnis: -Wenn der Algorithmus von Dijkstra anhält, führen die $p[v]$-Verweise von jedem Knoten v aus entlang eines kürzesten Weges (zurück) zu s. Da die $p[v]$-Verweise keinen Kreis bilden können (mit dem Schritt $S ← S ∪ {u}$ wird der Verweis vom neuen S-Knoten u auf den S-Knoten $p[u]$ endgültig fixiert), bilden die Kanten ($p[v], v$) einen Baum, den sogenannten Baum der kürzesten Wege. - -Implementierungsdetails: -Noch zu klären: Wie findet man effizient einen Knoten u mit kleinstem Wert dist[u]? -Verwalte die Knoten $w ∈ V −S$ mit Werten $dist[w] < ∞$ mit den $dist[w]$-Werten als Schlüssel in einer Prioritätswarteschlange PQ. Wenn $dist[w] = ∞$, ist $w$ (noch) nicht in PQ. $extractMin$ liefert den nächsten Knoten u, der zu S hinzugefügt werden soll. - -Dijkstra(G, s) // (Vollversion mit Prioritätswarteschlange) -Eingabe: gewichteter Digraph $G = (V, E, c) , V = {1, . . . , n}$ , Startknoten s ; -Ausgabe: Länge $d(s, v)$ der kürzesten Wege, Vorgängerknoten p(v) -Hilfsdatenstrukturen: PQ: eine (anfangs leere) Prioritäts-WS; inS, p, dist: s.o. -```cpp -for w from 1 to n do - dist[w] = ∞; - inS[w] = false; - p[w] = −1; -dist[s] = 0; -p[s] = −2; -PQ.insert(s); -while not PQ.isempty do - u = PQ.extractMin; - inS[u] = true; // u wird bearbeitet - for Knoten w mit (u, w) ∈ E and not inS[w] do - dd = dist[u] + c(u, w); - if p[w] ≥ 0 and dd < dist[w] then - PQ.decreaseKey(w,dd); - p[w] = u; - dist[w] = dd; - if p[w] = −1 then // w wird soeben entdeckt - dist[w] = dd; - p[w] = u; - PQ.insert(w); -Ausgabe: dist[1..n] und p[1..n]. -``` - -Aufwandsanalyse: -Die Prioritätswarteschlange realisieren wir als (binären) Heap. -Maximale Anzahl von Einträgen: n. -Initialisierung: Zeit $O(1)$ für PQ, $O(n)$ für den Rest. -Es gibt maximal $n$ Durchläufe durch die while-Schleife mit Organisationsaufwand jeweils $O(1)$, zusammen also Kosten $O(n)$ für die Schleifenorganisation. -In Schleifendurchlauf Nummer t, in dem $u_t$ bearbeitet wird: PQ.extractMin kostet Zeit $O(log n)$. -Durchmustern der $deg(u_t )$ Nachbarn von $u_t$: Jedes $PQ.insert$ oder $PQ.decreaseKey$ kostet Zeit $O(log n)$. - -Der Algorithmus von Dijkstra mit Verwendung einer Prioritätswarteschlange, die als Binärheap realisiert ist, ermittelt kürzeste Wege von Startknoten s aus in einem Digraphen $G = (V, E, c)$ in Zeit $O((n + m) log\ n)$. -Wobei $n = |V |$ (Knotenzahl), $m = |E|$ (Kantenzahl). - -Resultierende Rechenzeit für Algorithmus von Dijkstra: $O(m + n\ log\ n)$. -Lineare Rechenzeit für Graphen mit $m = Ω(n log n)$ Kanten. - -## 11.2. Minimale Spannbäume: Der Algorithmus von Jarnı́k +Prim -Ein Graph G heißt ein freier Baum (oder nur Baum), wenn er zusammenhängend und kreisfrei ist. Kreisfreie Graphen heißen auch (freie) Wälder. - -Wenn $G = (V, E)$ ein Graph mit n Knoten und m Kanten ist, dann sind folgende Aussagen äquivalent: -1. G ist ein Baum. -2. G ist kreisfrei und $m ≥ n − 1$. -3. G ist zusammenhängend und $m ≤ n − 1$. -4. Zu jedem Paar u, v von Knoten gibt es genau einen einfachen Weg von u nach v . -4. G ist kreisfrei, aber das Hinzufügen einer beliebigen weiteren Kante erzeugt einen Kreis (G ist maximal "kreisfrei“). -5. G ist zusammenhängend, aber das Entfernen einer beliebigen Kante erzeugt einen nicht zusammenhängenden Restgraphen ( G ist minimal "zusammenhängend“). - -Aus dem Fundamental-Lemma für Bäume folgt, für einen Baum G mit n Knoten: -1. G hat $n − 1$-Kanten. -2. Wenn man zu G eine Kante $(u, w)$ hinzufügt, entsteht genau ein Kreis (aus $(u, w)$ und dem eindeutigen Weg von u nach w in G). -3. Wenn man aus G eine Kante (u, w) streicht, zerfällt der Graph in 2 Komponenten (U und W) - -Es sei $G = (V, E)$ ein zusammenhängender Graph. Eine Menge $T ⊆ E$ von Kanten heißt ein Spannbaum für G, wenn $(V, T )$ ein Baum ist. - -Es sei $G = (V, E, c)$ ein gewichteter Graph, d.h. $c: E → R$ ist eine "Gewichtsfunktion“ oder "Kostenfunktion“. - -Jeder Kantenmenge E ⊆ E wird durch $c(E'):= \sum_{e \in E'} c(e)$ ein Gesamtgewicht zugeordnet. Sei G zusammenhängend. Ein Spannbaum $T ⊆ E$ für G heißt ein minimaler Spannbaum, wenn er minimale Kosten unter allen Spannbäumen hat, d. h. wenn $c(t) = min{c(T') | $ T' Spannbaum für G}. Abkürzung : MST ("Minimum Spanning Tree“). - -## 11.3. Algorithmus von Jarnı́k/Prim: -S: Menge von Knoten. Enthält die bisher "erreichten“ Knoten. -R: Menge von Kanten. Enthält die bisher "gewählten“ Kanten. -1. Wähle einen beliebigen (Start-)Knoten $s ∈ V$ . $S ← {s}; R ← ∅;$ -2. Wiederhole $(n − 1)$-mal: Wähle eine billigste Kante $(v, u)$, die ein $v ∈ S$ mit einem $u ∈ V − S$ verbindet, d.h. finde $v ∈ S$ und $u ∈ V − S$, so dass $c(v, u)$ minimal unter allen Werten $c(v', u'), v' ∈ S, u' ∈ V − S$, ist. - $S ← S ∪ {u};$ - $R ← R ∪ {(v, u)};$ -3. Ausgabe: R. - -### 11.3.1. Schnitteigenschaft -Für den Korrektheitsbeweis des Algorithmus von Jarnı́k/Prim: "Cut property“ – Schnitteigenschaft. Eine Partition $(S, V − S)$ von V mit $∅ = S \not= V$ heißt ein Schnitt. -Eine Menge $R ⊆ E$ heißt erweiterbar (zu einem MST), wenn es einen MST T mit $R ⊆ T$ gibt. - -Sei $R ⊆ E$ erweiterbar und sei $(S, V − S)$ ein Schnitt, so dass es keine R-Kante von S nach V − S gibt, und sei $e = (v, w), v ∈ S, w ∈ V −S$ eine Kante, die den Wert $c((v', w')), v' ∈ S, w'∈ V − S$, minimiert; Dann ist auch $R ∪ {e}$ erweiterbar. - -### 11.3.2. Implementierungsdetails im Algorithmus von Jarnı́k/Prim: -Wir nehmen an, dass $G = (V, E, c)$ mit $V = {1, . . . , n}$ in Adjazenzlistendarstellung gegeben ist. Die Kantengewichte $c(e)$ stehen in den Adjazenzlisten bei den Kanten. Für jeden Knoten $w ∈ V − S$ wollen wir immer wissen: -1. die Länge der billigsten Kante $(v, w) , v ∈ S,$ falls es eine gibt: in $dist[ w ]$ ("Abstand von S“), für Array $dist[ 1..n ]$. -2. den (einen) Knoten $p(w) ∈ S$ mit $c(p(w), w) = dist[ w ]$, falls ein solcher existiert: in $p[ w ]$ ("Vorgänger in S“), für Array $p[ 1..n ]$. - -Solange es von S keine Kante nach w gibt, gilt $dist[ w ] = ∞$ und $p[ w ] = − 1$ . -Verwalte die Knoten $w ∈ V − S$ mit Werten $dist[ w ] < ∞$ mit den $dist[ w ]$-Werten als Schlüssel in einer Prioritätswarteschlange PQ. Wenn $dist[ w ] = ∞$ , ist w (noch) nicht in der PQ. - -Eingabe: gewichteter Graph $G = (V, E, c) , V = {1, . . . , n}$ , Startknoten $s ∈ V$ (ist beliebig); -Ausgabe: Ein MST für G. -Hilfsstrukturen: PQ: eine (anfangs leere) Prioritäts-WS; inS, p: wie oben -```cpp -for w from 1 to n do - dist[w] ← ∞ ; inS[w] ← false; p[w] ← −1 ; -dist[ s ] ← 0 ; p[ s ] ← −2 ; PQ.insert( s ); -while not PQ.isempty do - u ← PQ.extractMin; inS[u] ← true; - for Knoten w mit ( u , w ) ∈ E and not inS[w] do - dd ← c( u , w ) ; // einziger Unterschied zu Dijkstra! - if p[w] ≥ 0 and dd < dist[w] then - PQ.decreaseKey(w,dd); p[w] ← u; dist[w] ← dd; - if p[w] = −1 then // w vorher nicht zu S benachbart - dist[w] ← dd; p[w] ← u; PQ.insert(w); -Ausgabe: T = {(w, p[ w ] ) | inS[ w ] = true , w 6 = s} . // Menge der gewählten Kanten -``` -Der Algorithmus von Jarnı́k/Prim mit Verwendung einer Prioritätswarteschlange, die als Binärheap realisiert ist, ermittelt einen minimalen Spannbaum für $G = (V, E, c)$ in Zeit $O((n + m) log\ n)$. - -## 11.4. Algorithmus von Kruskal -Starte mit $R = ∅$. Dann folgen $n − 1$ Runden. In jeder Runde: -Wähle eine Kante $e ∈ E − R$ von kleinstem Gewicht, die mit $(V, R)$ keinen Kreis schließt, und füge e zu R hinzu. - -Eine offensichtlich korrekte Methode, dies zu organisieren: Durchmustere Kanten in aufsteigender Reihenfolge des Kantengewichts, und nimm eine Kante genau dann in R auf, wenn sie mit R keinen Kreis bildet. - -## 11.5. Hilfsstruktur: Union-Find -Union-Find-Datenstrukturen dienen als Hilfsstruktur für verschiedene Algorithmen, insbesondere für den Algorithmus von Kruskal. Zwischenkonfiguration im Algorithmus von Kruskal: Menge $R i−1 ⊆ E$, die Wald bilden, und Folge $e_i , . . . , e_m$ von noch zu verarbeitenden Kanten. - -Ansatz: Repräsentiere die Knotenmengen, die den Zusammenhangskomponenten von $(V, R)$ entsprechen, in einer Datenstruktur. -Es soll schnell zu ermitteln sein, ob zwei Knoten in derselben Komponente/Menge liegen. Wenn wir einen Schritt des Kruskal-Algorithmus ausführen, bei dem eine Kante akzeptiert, also in R aufgenommen wird, müssen wir zwei der disjunkten Mengen vereinigen. - -Eine Partition (In der Mathematik heißt die gesamte Aufteilung Partition, die Teile Klassen) von ${1, 2, . . . , n}$ ist eine Zerlegung in Mengen (hier: Klassen“) ${1, 2, . . . , n} = S_1 ∪ S_2 ∪ · · · ∪ S_l$, wobei $S_1 , S_2 , . . . , S_l$ disjunkt sind. - -Operationen: -- $init(n)$: Erzeugt zu $n ≥ 1$ die diskrete Partition“ mit den n einelementigen Klassen ${1}, {2}, . . . , {n}$, also $K_i = {i}$. -- $find(i)$: Gibt zu $i ∈ {1, . . . , n}$ den Namen $r(i)$ der Klasse $K_{r(i)}$ aus, in der sich i (gegenwärtig) befindet. -- $union(s, t)$: Die Argumente s und t müssen Repräsentanten verschiedener Klassen $K_s$ bzw. $K_t$ sein. Die Operation ersetzt in der Partition $K_s$ und $K_t$ durch die Vereinigung $K_s ∪ K_t$. Als Repräsentant von $K_s ∪ K_t$ kann ein beliebiges Element verwendet werden. (Meistens: s oder t.) - -Algorithmus von Kruskal mit Union-Find -Input: Gewichteter zusammenhängender Graph $G = (V, E, c)$ mit $V = {1, . . . , n}$. -1. Schritt: Sortiere Kanten $e_1 , . . . , e_m$ nach Gewichten $c_1 = c(e_1), . . . , c_m = c(e_m )$ aufsteigend. Resultat: Kantenliste $(v_1 , w_1 , c_1 ), . . . , (v_m , w_m , c_m ), c_1 ≤ · · · ≤ c_m$. -2. Schritt: Initialisiere Union-Find-Struktur für ${1, . . . , n}$. -3. Schritt: Für $i = 1, 2, . . . , m$ tue folgendes: - - $s = find(v_i )$;$ t ← find(w_i )$; - - $if s \not= t$ then begin $R ← R ∪ {e_i}$; $union(s, t)$ end; - - // Optional: Beende Schleife, wenn $|R| = n − 1$. -4. Schritt: Die Ausgabe ist R. - -1. Der Algorithmus von Kruskal in der Implementierung mit Union-Find ist korrekt. -2. Die Rechenzeit des Algorithmus ist $O(m\ log\ n)$, wenn man die Union-Find-Datenstruktur mit Arrays implementiert. -3. Die Rechenzeit des Algorithmus ist $O(m\ log\ n)$, wenn man die Union-Find-Datenstruktur mit mit wurzelgerichteten Bäumen (mit Pfadkompression) implementiert. - -```cpp -Prozedur init(n) // Initialisierung einer Union-Find-Struktur -Erzeuge r, size, next: Arrays der Länge n für int-Einträge -for i from 1 to n do - r[i] = i; - size[i] = 1; - next[i] = 0. -``` -Zeitaufwand: $Θ(n)$. - -```cpp -Prozedur find(i) - return r[i] -``` -Zeitaufwand: $O(1)$ - -```cpp -Prozedur union(s, t) -// Ausgangspunkt: s, t sind verschiedene Repräsentanten -if size[s] > size[t] then vertausche s, t; // nun: size[s] ≤ size[t] - z = s; - r[z] = t; - while next[z] 6 = 0 do // durchlaufe L_s , setzt r-Werte um - z = next[z]; - r[z] = t; - // nun: z enthält letztes Element von L s ; next[z] = 0 - // L s nach dem ersten Eintrag in L t einhängen: -next[z] = next[t]; next[t] = s; -size[t] = size[t] + size[s]. -``` -Aufwand: $O$(Länge der kürzeren der Listen $L_s , L_t$ ) . - -In der Implementierung der Union-Find-Struktur mit Arrays hat jede find-Operation Rechenzeit $O(1), n − 1$ union-Operationen haben Rechenzeit $O(n\ log\ n)$. - -Union-find Prozedur mit Baumimplementierung -```cpp -j = i ; -jj = p[j]; -while jj != j do //verfolge Vorgängerzeiger bis zur Wurzel - j ← jj; - jj ← p[j] ; -return j -``` -Ein $find(i)$ für jedes $i ∈ {1, . . . , n}$ führt zu Gesamtkosten $Θ(n^2)$! - -## 11.6. Pfadkompression -Eine interessante Variante der Union-Find-Datenstruktur, die mit einem wurzelgerichteten Wald implementiert ist, ist der Ansatz der "Pfadkompression“ (oder Pfadverkürzung). Bei einem $find(i)$ muss man den ganzen Weg von Knoten i zu seiner Wurzel $r(i)$ ablaufen; Aufwand $O(depth(i))$. -Ein gutes strategisches Ziel ist also, diese Wege möglichst kurz zu halten. -Idee: Man investiert bei $find(i)$ etwas mehr Arbeit, jedoch immer noch im Rahmen $O(depth(i))$, um dabei einige Wege zu verkürzen und damit spätere finds billiger zu machen. -Jeder Knoten $i = i_0 , i_1 , . . . , i_{d−1}$ auf dem Weg von i zur Wurzel $i_d = r(i)$ wird direkt als Kind an die Wurzel gehängt. Kosten pro Knoten/Ebene: $O(1)$, insgesamt also $O(depth(i))$. - -```cpp -Prozedur find (i) // Pfadkompressions-Version - j = i ; - // verfolge Vorgängerzeiger bis zur Wurzel r(i) : - jj = p[j]; - while jj != j do - j = jj; - jj = p[j] ; - r = j; // r enthält nun Wurzel r(i) - // Erneuter Lauf zur Wurzel, Vorgängerzeiger umhängen: - j = i ; - jj = p[j]; - while jj != j do - p[j] = r; - j = jj; - jj = p[j]; - return r -``` - -# 12. Dynamische Programmierung -Algorithmenparadigma für Optimierungsprobleme. Typische Schritte: -- Definiere (viele) "Teilprobleme" (einer Instanz) -- Identifiziere einfache Basisfälle -- Formuliere eine Version der Eigenschaft: **Substrukturen optimaler Strukturen sind optimal** -- Finde Rekursionsgleichungen für Werte optimaler Lösungen: **Bellmansche Optimalitätsgleichungen** -- Berechne optimale Werte (und Strukturen) iterativ. - -## 12.1. Das All-Pairs-Shortest-Paths-Problem -Das "APSP-Problem" ist zentrales Beispiel für die Strategie "Dynamische Programmierung“. -Kürzeste Wege zwischen allen Paaren von Knoten. - -Der im Folgenden beschriebene Algorithmus von Floyd–Warshall kann auch mit negativen Kantengewichten umgehen. - -Es gibt keine Kreise mit (strikt) negativer Gesamtlänge, d.h. $v=v_0,v_1,...,v_r \Rightarrow \sum_{1\leq s \leq r} c(v_{s-1}, v_s) \leq 0$ -1. Wenn p Kantenzug von v nach w ist, dann existiert auch ein (einfacher) Weg $p_0$ von v nach w mit $c(p_0 ) ≤ c(p)$. -2. Wenn es einen Kantenzug von v nach w gibt, dann auch einen mit minimaler Länge (einen kürzesten Weg“). - -Für Digraphen $G = (V, E, c)$ definieren wir: $S(v, w) :=$ die Länge eines kürzesten Weges von v nach w. - -Bellmansche Optimalitätsgleichungen\ -Knoten k kommt im Inneren von p entweder einmal oder gar nicht vor. -- Falls k in p nicht vorkommt, ist p kürzester $(k − 1)$-Weg von v nach w -- Falls k im Inneren von p vorkommt, zerfällt p in zwei Teile die beide kürzeste $(k − 1)$-Wege sind. -Die Bellmanschen Optimalitätsgleichungen für den Algorithmus von Floyd-Warshall lauten dann: - $S(v,w,k) = min{S(v,w,k-1), S(v,k,k-1)+ S(k,w,k-1)}$, für $1 \leq v, w\leq n, 1 \leq k \leq n$ -```cpp -S[v,v,0] = 0; -S[v,w,0] = c(v, w); -for k from 1 to n do - for v from 1 to n do - for w from 1 to n do - S[v,w,k] = min{ S[v,w,k-1] , S[v,k,k-1] + S[k,w,k-1] } -``` - -Algorithmus Floyd-Warshall(C[ 1 .. n , 1 .. n ]) -Eingabe: C[ 1 .. n , 1 .. n ]: Matrix der Kantenkosten/-längen c(v, w) in R ∪ {+∞} -Ausgabe: S[ 1 .. n , 1 .. n ]: Kosten S(v, w) eines kürzesten v - w -Weges -I[ 1 .. n , 1 .. n ]: minimaler maximaler Knoten auf einem kürzesten v - w -Weg -```cpp -for v from 1 to n do - for w from 1 to n do - if v = w then S[v,v] ← 0 ; I[v,v] ← 0 - else S[v,w] ← C[v,w]; - if S[v,w] < ∞ then I[v,w] ← 0 else I[v,w] ← −1 ; -for k from 1 to n do - for v from 1 to n do - for w from 1 to n do - if S[v,k] + S[k,w] < S[v,w] then - S[v,w] ← S[v,k] + S[k,w]; I[v,w] ← k; -``` -Ausgabe: S[ 1 .. n , 1 .. n ] und I[ 1 .. n , 1 .. n ]. -Der Algorithmus von Floyd-Warshall löst das All-Pairs-Shortest-Paths-Problem in Rechenzeit $O(n^3)$ und Speicherplatz $O(n^2 )$. -Das Ergebnis ist eine Datenstruktur der Größe $O(n^2 )$, mit der sich zum Argument $(v, w)$ mit Algorithmus printPath ein kürzester Weg von v nach w in Zeit $O$(#(Kanten auf dem Weg)) ausgeben lässt. - -## 12.2. Der Bellman–Ford-Algorithmus -Zweck: Kürzeste Wege von einem Startknoten s aus in gewichtetem Digraphen $(V, E, c)$. (SSSP: "Single Source Shortest Paths“). Anders als beim Algorithmus von Dijkstra sind negative Kantenkosten zugelassen. - -Grundoperation, schon aus dem Dijkstra-Algorithmus bekannt: -```cpp -update(u, v) // für (u, v) ∈ E - if dist[u] + c(u, v) < dist[v] then - p[v] ← u; - dist[v] ← dist[u] + c(u, v) ; -``` - -Algorithmus Bellman-Ford( $((V, E, c), s)$ ) -Eingabe: $(V, E, c)$ : Digraph mit Kantengewichten in $R , s ∈ V$: Startknoten -Ausgabe: Wenn G keine Kreise mit negativem Gewicht hat: - - In $dist[ v ]$: Abstand $d(s, v)$; - - In $p[ 1 .. n ]$: Baum von kürzesten Wegen (wie bei Dijkstra); -```cpp -Initialisierung: - for v from 1 to n do - dist[v] ← ∞ ; p[v] ← −1 ; - dist[ s ] ← 0 ; p[ s ] ← −2 ; // wird nie geändert, wenn kein negativer Kreis existiert -Hauptschleife: - for i from 1 to n − 1 do // heißt nur: wiederhole (n − 1) -mal - forall (u, v) ∈ E do update (u, v) ; // beliebige Reihenfolge -Zyklentest: - forall (u, v) ∈ E do - if dist[ u ] + c(u, v) < dist[ v ] then return "negativer Kreis"; -Ergebnis: - return dist[ 1 .. n ], p[ 1 .. n ] -``` - -Der Bellman-Ford-Algorithmus hat folgendes Verhalten: -1. Wenn es keinen von s aus erreichbaren Kreis mit negativer Gesamtlänge gibt ("negativer Kreis"), steht am Ende des Algorithmus in dist[v] die Länge eines kürzesten Weges von s nach v, und die Kanten $(p[w], w)$ (mit p[w] > 0) bilden einen Baum der kürzesten Wege von s aus zu den erreichbaren Knoten. -2. Der Algorithmus gibt "negativer Kreis“ aus genau dann wenn es einen von s aus erreichbaren negativen Kreis gibt. -3. Die Rechenzeit ist $O(nm)$ - -## 12.3. Editierdistanz -Problemstellung: Sei A ein Alphabet. (Bsp.: Lat. Alphabet, ASCII-Alphabet, { A,C,G,T } .) -Wenn $x = a_1 . . . a_m ∈ A$ und $y = b_1 . . . b_n ∈ A$ zwei Zeichenreihen über A sind, möchte man herausfinden, wie ähnlich (oder unähnlich) sie sind. Wie können wir Ähnlichkeit“ messen? -Wir definieren Elementarschritte (Editier-Operationen), die einen String verändern: -- Lösche einen Buchstaben aus einem String: Aus uav wird uv ($u, v ∈ A, a ∈ A$). - Beispiel: Haut → Hut. -- Füge einen Buchstaben in einen String ein: Aus uv wird uav ($u, v ∈ A , a ∈ A$). - Beispiel: Hut → Haut. -- Ersetze einen Buchstaben: Aus uav wird ubv ($u, v ∈ A, a, b ∈ A$). - Beispiel: Haut → Hast. -Der "Abstand" oder die Editierdistanz $d(x, y)$ von x und y ist die minimale Anzahl von Editieroperationen, die benötigt werden, um x in y zu transformieren. - -Man schreibt Strings aus Buchstaben und dem Sonderzeichen - untereinander, wobei die beiden Zeilen jeweils das Wort x bzw. y ergeben, wenn man die -’s ignoriert. Die Kosten einer solchen Anordnung: Die Anzahl der Positionen, an denen die oberen und unteren Einträge nicht übereinstimmen. Die Kosten, die eine solche Anordnung erzeugt, sind gleich der Anzahl der Editierschritte in einer Transformation. - - -Das Problem "Editierdistanz" wird folgendermaßen beschrieben: -Input: Strings $x = a_1 . . . a_m , y = b_1 . . . b_n$ aus A. -Aufgabe: Berechne $d(x, y)$ (und eine Editierfolge, die x in y transformiert). -Ansatz: Dynamische Programmierung -Unser Beispiel: x = Exponentiell und y = Polynomiell. -1. Schritt: Relevante Teilprobleme identifizieren! Betrachte Präfixe $x[1..i] = a_1 . . . a_i$ und $y[1..j] = b_1 . . . b_j$ , und setze $E(i,j):=d(x[1...i],y[1...j])$, für $0\leq i \leq m, 0\leq j \leq n$ - -Die Zahlen E(i, j) berechnen wir iterativ, indem wir sie in eine Matrix $E[0..m,0..n]$ eintragen. Dies liefert den DP-Algorithmus für die Editierdistanz. -Initialisierung: -$$E[i,0] = i, für i = 0, . . . , m$$ -$$E[0,j] = j, für j = 0, . . . , n$$ -Dann füllen wir die Matrix (z. B.) zeilenweise aus, genau nach den Bellmanschen -Optimalitätsgleichungen: -```cpp -for i from 1 to m do - for j from 1 to n do - E[i,j] = min{E[i-1,j-1] + diff(a_i, b_j), E[i-1,j] + 1, E[i,j-1] + 1}; -return E[m,n] -``` -Rechenzeit: $O(m * n)$ - -## 12.4. Optimale Matrizenmultiplikation -Multiplikation von zwei Matrizen über einem Ring R: Gegeben $A_1$ und $A_2$ berechne Product $C:= A_1*A_2$ -Standardmethode benötigt $r_0 r_1 r_2$ R-Multiplikationen, $r_0(r_1 − 1)r_2) R-Additionen. Gesamtrechenzeit: $Θ(r_0 r_1 r_2 )$. - -Die Matrizenmultiplikation ist assoziativ. Gesucht wird eine ("optimale") Klammerung, die bei der Berechnung von $A_1 ·· · ··A_k$ die Gesamtkosten (= Anzahl aller R-Multiplikationen) minimiert. - -Optimale Klammerung für $A_i · · · A_j$ ist $(A_i · · · A_l)(A_{l+1} · · · A_j )$, wobei die Klammerungen in den beiden Teilen optimal sein müssen. "Bellmansche Optimalitätsgleichungen“: -$$c(r_{i-1},...,r_j)= min{c(r_{i-1,...,r_l}) +c(r_l,...,r_j) +r_{i-1}r_l r_j | i \leq l < j }$$ - -MatrixOptimal($(r_0, . . . , r_k )$) -Eingabe: Dimensionsvektor $(r_0, . . . , r_k )$ -Ausgabe: Kosten $c(r_0 , . . . , r_k )$ bei der optimalen Klammerung $l[1 .. k , 1 .. k ]$: Plan zur Ermittlung der optimalen Unterteilung; -Datenstruktur: Matrizen $C[ 1 .. k , 1 .. k ], l[ 1 .. k , 1 .. k ]$ -Ziel: - - $C[ i , j ]$ enthält $c(r_{i−1} , . . . , r_j )$ - - $l[ i , j ]$ enthält Index zur Unterteilung der Multiplikation bei $A_i · · · A_j$ -```cpp -for i from 1 to k - do C[i,i] = 0; -for i from 1 to k−1 - do C[i,i+1] = r_i − 1 * r_i * r_i + 1; -for d from 2 to k−1 do - for i from 1 to k − d do - bestimme das l, i ≤ l < i+d, das C=C[i,l]+ C[l+1,i+d] + r_{i-1}*r_l*r_{i+d} minimiert; - l[i,i+d] = dieses l; - C[i,i+d] = das minimale C; -Ausgabe: C[1..k, 1..k] und l[1..k, 1..k] -``` -Laufzeit: Die Minimumssuche in Zeilen (5)–(6) kostet Zeit $O(k)$; mit den geschachtelten Schleifen (3)–(8) und (4)–(8) ergibt sich eine Rechenzeit von $Θ(k^3)$. - - -# 13. Prüfung -Prüfungsstoff: Vorlesung + Übungsaufgaben. -Prüfungsklausur: 150 Minuten, 150 Punkte. -max. 15 Bonuspunkte über Zwischenklausur (40 Minuten) - -- [1. Vorbereitung](#1-vorbereitung) - - [1.1. O-Notation](#11-o-notation) - - [1.2. Spezifkationstechnik für Datentypen](#12-spezifkationstechnik-für-datentypen) - - [1.3. Implementierungen fundamentaler Datentypen](#13-implementierungen-fundamentaler-datentypen) - - [1.4. Auswahlkriterien für elementare Datenstrukturen kennen und anwenden](#14-auswahlkriterien-für-elementare-datenstrukturen-kennen-und-anwenden) - - [1.5. Kenntnis grundlegender Entwurfsstrategien](#15-kenntnis-grundlegender-entwurfsstrategien) - - [1.6. Kenntnis grundlegender Algorithmen und ihrer Eigenschaften](#16-kenntnis-grundlegender-algorithmen-und-ihrer-eigenschaften) - - [1.7. Auswahlkriterien für Algorithmen, insbesondere Ressourcenverbrauch, kennen und anwenden](#17-auswahlkriterien-für-algorithmen-insbesondere-ressourcenverbrauch-kennen-und-anwenden) - - [1.8. Standard-Analysemethoden für Ressourcenverbrauch (Rechenzeit, Speicherplatz)](#18-standard-analysemethoden-für-ressourcenverbrauch-rechenzeit-speicherplatz) - - [1.9. Korrektheitsbeweise für Algorithmen verstehen und darstellen](#19-korrektheitsbeweise-für-algorithmen-verstehen-und-darstellen) -- [2. Einführung und Grundlagen](#2-einführung-und-grundlagen) - - [2.1. Beispiel: Sortieren](#21-beispiel-sortieren) - - [2.1.1. Ist dieser Algorithmus Korrekt?](#211-ist-dieser-algorithmus-korrekt) - - [2.1.2. Wie lange dauern Berechnungen mit diesem Algorithmus?](#212-wie-lange-dauern-berechnungen-mit-diesem-algorithmus) - - [2.2. Was ist ein Algorithmus](#22-was-ist-ein-algorithmus) - - [2.2.1. Was ist mit nicht abbrechenden Berechnungen?](#221-was-ist-mit-nicht-abbrechenden-berechnungen) - - [2.3. Merkmale eines Algorithmus](#23-merkmale-eines-algorithmus) - - [2.4. Erweiterung des Algorithmusbegriffs](#24-erweiterung-des-algorithmusbegriffs) - - [2.4.0.1. Varianten](#2401-varianten) - - [2.4.0.2. Spezi kation des Sortierproblems](#2402-spezikation-des-sortierproblems) - - [2.4.0.3. Alternative Formulierung des Sortierproblems:](#2403-alternative-formulierung-des-sortierproblems) - - [2.4.0.4. Löst Insertionsort das Sortierproblem?](#2404-löst-insertionsort-das-sortierproblem) - - [2.4.1. Laufzeitanalysen](#241-laufzeitanalysen) - - [2.4.1.1. Kosten Rechenzeiten](#2411-kosten-rechenzeiten) - - [2.4.1.1.1. "Worst Case" Kosten allgemein](#24111-worst-case-kosten-allgemein) - - [2.4.1.1.2. "Best Case" Kosten allgemein](#24112-best-case-kosten-allgemein) - - [2.4.1.1.3. "Average Case" auf Insertionsort](#24113-average-case-auf-insertionsort) - - [2.4.1.1.4. "Average Case" Kosten allgemein](#24114-average-case-kosten-allgemein) - - [2.4.1.2. Analyse von Kosten/Rechenzeit](#2412-analyse-von-kostenrechenzeit) -- [3. Fundamentale Datentypen und Datenstrukturen](#3-fundamentale-datentypen-und-datenstrukturen) - - [3.1. Stacks und dynamische Arrays](#31-stacks-und-dynamische-arrays) - - [3.1.1. Spezi kation des Datentyps "Stack über D"](#311-spezikation-des-datentyps-stack-über-d) - - [3.1.1.1. Spezi kation des Datentyps (ADT) "Stack über D" - Alternative](#3111-spezikation-des-datentyps-adt-stack-über-d---alternative) - - [3.1.1.2. Implementierung von Stacks](#3112-implementierung-von-stacks) - - [3.1.1.2.1. Listenimplementierung von Stacks](#31121-listenimplementierung-von-stacks) - - [3.1.1.2.2. Arrayimplementierung von Stacks](#31122-arrayimplementierung-von-stacks) - - [3.1.1.2.3. Vergleich Listen-/Arrayimplementierung](#31123-vergleich-listen-arrayimplementierung) - - [3.1.1.3. Datentyp "Dynamische Arrays"](#3113-datentyp-dynamische-arrays) - - [3.2. Queues (Warteschlangen, FIFO-Listen)](#32-queues-warteschlangen-fifo-listen) - - [3.2.1. Spezifikation des Datentypes "Queue" über D](#321-spezifikation-des-datentypes-queue-über-d) - - [3.2.2. Implementierung von Queues](#322-implementierung-von-queues) - - [3.2.2.0.1. TODO](#32201-todo) -- [4. Binärbaume](#4-binärbaume) - - [4.1. Grundlagen](#41-grundlagen) - - [4.2. Definition](#42-definition) - - [4.3. Operationen](#43-operationen) - - [4.4. Terminologie](#44-terminologie) - - [4.5. TIPL und TEPL](#45-tipl-und-tepl) - - [4.5.1. Totale innere Weglänge (Total internal path length)](#451-totale-innere-weglänge-total-internal-path-length) - - [4.5.2. Totale äußere Weglänge (Total external path length)](#452-totale-äußere-weglänge-total-external-path-length) - - [4.6. Baumdurchläufe](#46-baumdurchläufe) - - [4.6.1. Inorder Durchlauf](#461-inorder-durchlauf) - - [4.6.2. Präorder Durchlauf](#462-präorder-durchlauf) - - [4.6.3. Postorder Durchlauf](#463-postorder-durchlauf) - - [4.6.4. Kombi Durchlauf](#464-kombi-durchlauf) - - [4.6.5. Zeitanalyse für Baumdurchlauf](#465-zeitanalyse-für-baumdurchlauf) -- [5. Hashverfahren](#5-hashverfahren) - - [5.1. Hashing mit Verketteten Listen](#51-hashing-mit-verketteten-listen) - - [5.1.1. Wir implementieren die Wörterbuchoperationen: Algorithmen](#511-wir-implementieren-die-wörterbuchoperationen-algorithmen) - - [5.1.2. Verdoppelungsstrategie](#512-verdoppelungsstrategie) - - [5.2. Hashfunktionen](#52-hashfunktionen) - - [5.2.1. Einfache Hashfunktionen](#521-einfache-hashfunktionen) - - [5.2.1.1. Fall: Schlüssel sind natürliche Zahlen: $U \subseteq \N$](#5211-fall-schlüssel-sind-natürliche-zahlen-eqmathsemanticsmrowmiumimomomi-mathvariantdouble-strucknmimrowannotation-encodingapplicationx-texu-subseteq-nannotationsemanticsmathuneq) - - [5.2.1.1.1. Divisionsrestmethode](#52111-divisionsrestmethode) - - [5.2.1.1.2. Diskrete Multiplikationsmethode](#52112-diskrete-multiplikationsmethode) - - [5.2.1.2. Fall: Schlüssel sind Strings/Wörter: $U \subseteq Seq(\sum)$](#5212-fall-schlüssel-sind-stringswörter-eqmathsemanticsmrowmiumimomomismimiemimiqmimo-stretchyfalsemomomomo-stretchyfalsemomrowannotation-encodingapplicationx-texu-subseteq-seqsumannotationsemanticsmathuseqeq) - - [5.2.1.2.1. Lineare Funktionen über Körper $\Z_p = [p] = {0,...,p-1}$](#52121-lineare-funktionen-über-körper-eqmathsemanticsmrowmsubmi-mathvariantdouble-struckzmimipmimsubmomomo-stretchyfalsemomipmimo-stretchyfalsemomomomrowmn0mnmo-separatortruemomi-mathvariantnormalmimi-mathvariantnormalmimi-mathvariantnormalmimo-separatortruemomipmimomomn1mnmrowmrowannotation-encodingapplicationx-texz_p--p--0p-1annotationsemanticsmathzpp0p1eq) - - [5.2.2. Anspruchsvolle Hashfunktionen](#522-anspruchsvolle-hashfunktionen) - - [5.3. Geschlossenes Hashing](#53-geschlossenes-hashing) - - [5.3.1. Lineares Sondieren](#531-lineares-sondieren) - - [5.3.2. Quadratisches Sondieren](#532-quadratisches-sondieren) - - [5.3.3. Doppel Hashing](#533-doppel-hashing) - - [5.3.4. Uniformes Sondieren / Ideales Hashing](#534-uniformes-sondieren--ideales-hashing) - - [5.4. Löschen](#54-löschen) - - [5.5. Cuckoo Hashing](#55-cuckoo-hashing) -- [6. Sortierverfahren](#6-sortierverfahren) - - [6.1. Mergesort](#61-mergesort) - - [6.2. Quicksort](#62-quicksort) - - [6.3. Heapsort](#63-heapsort) - - [6.3.1. Heap reparieren](#631-heap-reparieren) - - [6.3.2. Heap sortieren](#632-heap-sortieren) - - [6.3.3. Heap aufbauen](#633-heap-aufbauen) - - [6.3.3.1. HeapSort](#6331-heapsort) - - [6.4. Datentyp: Prioritätswarteschlange (oder Vorrangwarteschlangen)](#64-datentyp-prioritätswarteschlange-oder-vorrangwarteschlangen) - - [6.4.1. Technisches Problem, noch zu klären:](#641-technisches-problem-noch-zu-klären) - - [6.5. Untere Schranke für Sortieren](#65-untere-schranke-für-sortieren) - - [6.6. Sortieren in Linearzeit](#66-sortieren-in-linearzeit) - - [6.6.1. Countingsort – Sortieren durch Zählen](#661-countingsort--sortieren-durch-zählen) - - [6.6.2. Bucketsort – Fachsortieren](#662-bucketsort--fachsortieren) - - [6.6.3. Radixsort – Mehrphasen-Counting-/Bucketsort](#663-radixsort--mehrphasen-counting-bucketsort) -- [7. Graphen, Digraphen und Breitensuche](#7-graphen-digraphen-und-breitensuche) - - [7.1. Datenstrukturen für Digraphen und Graphen](#71-datenstrukturen-für-digraphen-und-graphen) - - [7.2. Breitensuche in Digraphen](#72-breitensuche-in-digraphen) - - [7.2.1. Breitensuche von einem Knoten $v_0$ aus:](#721-breitensuche-von-einem-knoten-eqmathsemanticsmrowmsubmivmimn0mnmsubmrowannotation-encodingapplicationx-texv_0annotationsemanticsmathv0eq-aus) - - [7.2.2. Globale Breitensuche in G](#722-globale-breitensuche-in-g) -- [8. Tiefensuche](#8-tiefensuche) - - [8.1. einfache Tiefensuche in Digraphen](#81-einfache-tiefensuche-in-digraphen) - - [8.2. Volle Tiefensuche in Digraphen](#82-volle-tiefensuche-in-digraphen) - - [8.3. Tiefensuche in ungerichteten Graphen](#83-tiefensuche-in-ungerichteten-graphen) - - [8.4. Kreisfreiheitstest und topologische Sortierung](#84-kreisfreiheitstest-und-topologische-sortierung) - - [8.5. Starke Zusammenhangskomponenten in Digraphen](#85-starke-zusammenhangskomponenten-in-digraphen) -- [9. Divide-and-Conquer-Algorithmen](#9-divide-and-conquer-algorithmen) - - [9.1. Multiplikation ganzer Zahlen](#91-multiplikation-ganzer-zahlen) - - [9.2. Matrixmultiplikation](#92-matrixmultiplikation) - - [9.3. Master Theorem](#93-master-theorem) - - [9.4. Das Selektionsproblem](#94-das-selektionsproblem) -- [10. Greedy-Algorithmen: Prinzipien](#10-greedy-algorithmen-prinzipien) - - [10.1. Beispiel 1: Hörsaalbelegung](#101-beispiel-1-hörsaalbelegung) - - [10.2. Beispiel 2: Fraktionales ("teilbares") Rucksackproblem](#102-beispiel-2-fraktionales-teilbares-rucksackproblem) - - [10.3. Huffman-Codes](#103-huffman-codes) -- [11. Greedy-Algorithmen für Graphprobleme](#11-greedy-algorithmen-für-graphprobleme) - - [11.1. Kürzeste Wege mit einem Startknoten: Der Algorithmus von Dijkstra](#111-kürzeste-wege-mit-einem-startknoten-der-algorithmus-von-dijkstra) - - [11.2. Minimale Spannbäume: Der Algorithmus von Jarnı́k +Prim](#112-minimale-spannbäume-der-algorithmus-von-jarnı́k-prim) - - [11.3. Algorithmus von Jarnı́k/Prim:](#113-algorithmus-von-jarnı́kprim) - - [11.3.1. Schnitteigenschaft](#1131-schnitteigenschaft) - - [11.3.2. Implementierungsdetails im Algorithmus von Jarnı́k/Prim:](#1132-implementierungsdetails-im-algorithmus-von-jarnı́kprim) - - [11.4. Algorithmus von Kruskal](#114-algorithmus-von-kruskal) - - [11.5. Hilfsstruktur: Union-Find](#115-hilfsstruktur-union-find) - - [11.6. Pfadkompression](#116-pfadkompression) -- [12. Dynamische Programmierung](#12-dynamische-programmierung) - - [12.1. Das All-Pairs-Shortest-Paths-Problem](#121-das-all-pairs-shortest-paths-problem) - - [12.2. Der Bellman–Ford-Algorithmus](#122-der-bellmanford-algorithmus) - - [12.3. Editierdistanz](#123-editierdistanz) - - [12.4. Optimale Matrizenmultiplikation](#124-optimale-matrizenmultiplikation) +--- +titel: Algorithmen und Datenstrukturen +date: Sommersemester 2020 +autor: Robert Jeutter +--- +# 1. Vorbereitung +## 1.1. O-Notation + + +## 1.2. Spezifkationstechnik für Datentypen + + +## 1.3. Implementierungen fundamentaler Datentypen +- Wir werden Datentypen spezifizieren und Implementierungen betrachten. Ihnen sollten Stacks, Queues, Arrays und Lineare Listen bekannt sein. Wir benutzen diese als einfache Beispiele und um Techniken einzüben. Wörterbuch ist ein grundlegender Datentyp mit sehr vielen unterschiedlichen Implementierungsmöglichkeiten, insbesondere auf der Basis von Suchbäumen (verschiedene Varianten) und von Hashtabellen. Damit werden wir uns ausgiebig beschäftigen. +- Binäre Heaps sind eine Implementierung des Datentyps "Prioritätswarteschlange". (Man benutzt sie auch bei Heapsort, einem Sortieralgorithmus.) +- Wir werden eine Reihe von Algorithmen für Graphen sehen. Basis hierfür sind geeignete Datenstrukturen für die rechnerinterne Darstellung von Graphen. Die "Union-Find-Datenstruktur" ist ein Beispiel für einen Hilfsdatentyp für Graphalgorithmen. +- Ein fundamentales Thema der Vorlesung ist, dass man für (rechenzeit-)effziente Algorithmen clevere Datenstrukturen braucht und für effziente Datenstrukturen auch manchmal schlaue Algorithmen: Ein Wechselspiel! +- Mergesort und Quicksort sind schon bekannt. Hier werden Details der exakten Analyse nachgetragen. +- Bei Heapsort ist der Korrektheitsbeweis interessant, und die Anwendungen der Datenstruktur "Prioritätswarteschlangen". +- Breitensuche und Tiefensuche sind Methoden zur Exploration von Graphen, sehr großen Graphen, weit jenseits dessen, was man sich anschaulich machen kann. Denken Sie an zig Millionen von Knoten! +- Divide-and-Conquer: ein Algorithmenparadigma, das heißt, eine Entwurfsstrategie. Wir werden mehrere Entwurfsstrategien sehen, mit typischen klassischen Algorithmen, aber auch dem Potenzial, dass man selber Algorithmen nach dieser Methode entwirft. +- Greedy: Ein weiteres Algorithmenparadigma. Man konstruiert eine Lösung Schritt für Schritt, macht in jedem Schritt kurzsichtig "optimale" Entscheidungen, ohne an die Zukunft zu denken (daher "greedy/gierig"), und durch eine eingebaute Magie ergibt sich dann doch eine optimale Lösung. Manchmal, aber manchmal auch nicht. In die Kategorie greedy gehören extrem wichtige Graphalgorithmen, wie kürzeste Wege von einem Startknoten aus oder billigste Teilnetzwerke, die "alles verbinden" ... +- Dynamische Programmierung (DP) (Das hat mit Programmierung im modernen Sinn nichts zu tun.) Hier berechnen wir kürzeste Wege zwischen allen Knotenpaaren in einem Graphen oder die geringste Anzahl von Buchstabenoperationen, um aus einem String (z. B. "FREIZEIT") einen anderen zu machen (z. B. "ARBEIT"). +- Schwierige Probleme (Rucksackproblem oder Traveling Salesperson Problem, beide NPvollständig) können durch DP-Algorithmen etwas schneller als ganz naiv gelöst werden. + + +## 1.4. Auswahlkriterien für elementare Datenstrukturen kennen und anwenden + + +## 1.5. Kenntnis grundlegender Entwurfsstrategien + + +## 1.6. Kenntnis grundlegender Algorithmen und ihrer Eigenschaften +- Sortieren: Mergesort, Quicksort, Heapsort +- Graphdurchläufe: Breitensuche, einfache Tiefensuche +- Volle Tiefensuche, starke Zusammenhangskomponenten +- Divide-and-Conquer: Multiplikation von ganzen Zahlen und von Matrizen, Auswahlproblem, Schnelle Fourier-Transformation (eventuell) +- Greedy-Ansatz: Kürzeste Wege, Human-Codes, Minimale Spannbäume, fraktionales Rucksackproblem +- Dynamische Programmierung: Kürzeste Wege, Editierdistanz, 0-1-Rucksackproblem + +## 1.7. Auswahlkriterien für Algorithmen, insbesondere Ressourcenverbrauch, kennen und anwenden + + +## 1.8. Standard-Analysemethoden für Ressourcenverbrauch (Rechenzeit, Speicherplatz) + + +## 1.9. Korrektheitsbeweise für Algorithmen verstehen und darstellen + + +# 2. Einführung und Grundlagen +## 2.1. Beispiel: Sortieren +Beispiel Sortieren mit Insertion Sort (Sortieren durch Einfügen) +```pseudocode +for i from 2 to n do // Runden i = 2,...,n + x A[i] ; // entnehme A[i] + j i ; + while j > 1 and* x.key < A[j-1].key do + A[j] A[j-1] ; // Einträge größer als A[i] werden einzeln + j j-1 ; // um 1 Position nach rechts verschoben + A[j] x ; // Einfügen + return A[1..n] . // Ausgabe +``` +- Die erste (unnummerierte) Zeile gibt den Namen und den Input an. +- (1)-(7): Eine for-Schleife, die für i = 2,...,n (in i) ausgeführt wird. +- (2), wenn i Wert i enthält: + - Datensatz ai (in A[i]) wird nach x kopiert, ist dort gesichert. + - Speicherstelle A[i] ist jetzt frei verfügbar. +- (3)-(6): Diese Schleife durchläuft j=i, i-1, i-2;... und testet immer, ob der Schlüssel von A[j-1] größer ist als der Schlüssel von x. Falls ja: Verschiebe A[j-1] an Position j im Array. + - "sequenzielles and" bedeutet, dass die zweite Bedingung nur ausgeführt wird, wenn die erste "wahr" ergibt. + - Wenn also j=1 ist, stoppt die Schleife, ohne dass (fehlerhaft) auf A[0] zugegriffen wird. +- Wenn Zeile (7) erreicht wird, gibt j die Stelle an, an die x gespeichert werden muss. +- Ende des Algorithmus, Rückgabe des Arrays als Ausgabe. + +### 2.1.1. Ist dieser Algorithmus Korrekt? +Die Frage nach der Korrektheit eines gegebenen bzw. soeben neu entworfenen Algorithmus wird uns durch die Vorlesung begleiten. +Damit die Frage nach einem Beweis der Korrektheit überhaupt sinnvoll ist, müssen wir zunächst die zu lösende Aufgabe spezifizieren. +Bemerkung: Aus einer vagen Problemstellung eine präzise Spezi kation des zu lösenden Problems zu gewinnen ist ein in der Praxis extrem wichtiger Schritt, dessen Bedeutung oft unterschätzt wird. +Hier: Spezi kationstechniken für grundlegende Algorithmen (und Datenstrukturen, siehe Kap. 2). +Ein Beispiel: Beim Sortieren gibt es das Konzept des "stabilen Sortierverfahrens": Objekte mit demselben Schlüssel ändern ihre relative Reihenfolge nicht. Wenn die Implementierung diese Eigenschaft nicht hat, der Kunde sie aber für seine Anwendung voraussetzt, weil Softwareingenieur/in und Kunde sich nicht präzise verständigt haben oder die Beschreibung des Programms nur sagt, dass es "sortiert", kann dies unangenehme Folgen haben. Auf präziser Spezi kation zu bestehen und sie bereitzustellen liegt in der Verantwortung des +Informatikers/der Informatikerin! Man nennt dies "Stand der Technik" ("state of the art"), der angewendet werden muss. + + +### 2.1.2. Wie lange dauern Berechnungen mit diesem Algorithmus? +Die "Laufzeitanalyse" ist das zweite Grundthema in Richtung Algorithmen. +Erklärung: Ein Berechnungsproblem P besteht aus +1. einer Menge I von möglichen Eingaben ("Inputs","Instanzen") (I kann unendlich sein!) +2. einer Menge O von möglichen Ausgaben +3. einer Funktion $f:I \rightarrow O$ +Ein Algorithmus A "löst P", wenn A genau die Eingaben aus I verarbeitet und zu Eingabe $x\in I$ Ausgabe $A(x) = f(x)$ liefert. +Spezialfall $O = {1,0} \approx {true,false} \approx {Ja,Nein}$ P heißt Entscheidungsproblem. +Bei der Festlegung, was Eingabemengen und Ausgabemengen eines Algorithmus sind, gibt es dieselben Unschärfen wie bei den Algorithmen selbst. Die Darstellungsform für den Input bleibt offen. Selbst wenn man weiß, dass die Schlüsselmenge die Menge N ist, ist nicht klar, ob eine Zahl in Dezimal- oder in Binärdarstellung gegeben ist. +Beispiel: Beim Sortierproblem hat man es mit Objekten zu tun, die ein Attribut "Schlüssel" haben. Es muss eine Funktion geben, ja sogar ein algorithmisches Verfahren, das aus dem Objekt a den Schlüssel *key(a)* ermittelt. Die Details dieser Funktion werden aber nicht festgelegt. +Es ist nicht präzisiert, in welcher Weise die Funktion f beschrieben sein soll. Aus praktischen Gründen will man dies auch nicht. Mathematische Beschreibungen sind in der Regel akzeptabel. Wenn Ein-/Ausgabeformat ignoriert werden und man beliebige mathematische Funktionen f als Beschreibung akzeptiert, kann man eine Problemspezi kation durchaus als ein mathematisches Tripel (I;O; f) schreiben. +Ein Entscheidungsproblem $(I, {true, false}, f)$ entspricht der Menge ${x\in I | f(x) = true}$. + +## 2.2. Was ist ein Algorithmus +Ein Algorithmus A ist eine durch einen endlichen Text gegebene Verarbeitungsvorschrift, die zu jeder gegebenen Eingabe x aus einer Menge I +(der Menge der möglichen Eingaben) eindeutig eine Abfolge von auszuführenden Schritten ("Berechnung") angibt. Wenn diese Berechnung nach endlich vielen Schritten anhält, wird ein Ergebnis A(x) aus einer Menge O (der Menge der möglichen Ausgaben) ausgegeben. +Beschreibungsformen: Umgangssprache, Pseudocode, Programm in Programmiersprache, Programm fur formales Maschinenmodell, Programm in Maschinensprache, Turingmaschinenprogramm, . . . +Es handelt sich nicht um eine formale Def inition. Viele Formalismen können benutzt werden, um das Algorithmenkonzept formal/mathematisch +zu erfassen: Turingmaschinenprogramme, while-Programme, Programme für andere (mathematisch genaue) Maschinenmodelle,... +Man beweist, dass viele unterschiedliche Formalismen zu exakt derselben Klasse von "berechenbaren Funktionen" führt. Erfahrungstatsache: Alle bekannten Algorithmenkonzepte liefern dieselbe Klasse von "berechenbaren Funktionen". Die Church-Turing-These sagt, dass unsere informale, intuitive Beschreibung genau dem entspricht, was man mit diesen mathematischen De finitionen erfasst. + +### 2.2.1. Was ist mit nicht abbrechenden Berechnungen? +Eine grundlegende Tatsache der Berechenbarkeitstheorie, nämlich die Unentscheidbarkeit des Halteproblems hat als unangenehme Konsequenz, dass Folgendes passiert: Wenn man der De nition des Algorithmenbegriffs die Aussage "A hält auf allen Inputs" hinzufügt, dann kann ein Compiler einen vorgelegten Programmtext P nicht mehr automatisch (d.h. mit einem Computerprogramm, d.h. mit einem Algorithmus) darauf überprüfen, ob P einen Algorithmus darstellt oder nicht. Das würde bedeuten, dass der Compiler entweder eigentlich legale Algorithmen zurückweist oder "Nicht-Algorithmen" passieren lässt. +Einen Algorithmenbegriff ohne Entscheidungsverfahren will man nicht haben. (Man möchte Programme aufgrund einer reinen Syntaxüberprüfung in korrekt/fehlerhaft einteilen.) Dies ist der Grund, weshalb Algorithmen mit nicht-stoppenden Berechnungen in Kauf genommen werden. + +## 2.3. Merkmale eines Algorithmus +- Endlicher Text +- Ein Algorithmus für eine große (oft: unendliche!) Menge I von Eingaben x (Beachte: Zeitliche Trennung der Formulierung des Algorithmus bzw. der Programmierung und der Anwendung auf eine Eingabe.) +- Eindeutig vorgeschriebene Abfolge von Schritten, wenn Eingabe x vorliegt (im Rahmen des benutzten Modells) +- Wenn Verarbeitung anhält: Ausgabe $A(x)\in O$ ablesbar +- Nicht verlangt: Terminierung auf allen $x \in I$. + +Algorithmen werden erfunden und in Software umgesetzt. Der Algorithmus, den Sie in Ihrer späteren Tätigkeit entwerfen und implementieren, wird (hoffentlich!) vieltausendfach verkauft und von Kunden eingesetzt, in Umgebungen und für Inputs, an die beim Algorithmenentwurf und bei der Implementierung niemand gedacht hat. Reales Beispiel: Bankensoftware, in den 1960er Jahren in COBOL geschrieben, wurde bis weit ins 21. Jh. eingesetzt, auf Rechnern, die es bei der Erstellung der Programme noch gar nicht gab. Diese Situation ist ein großer Reiz im Informatiker/innen dasein, aber auch eine Riesenverantwortung. Es muss genauestens spezi fiziert sein, was genau ein Stück Software tut, und für welche Inputs es geeignet ist. +Je nach Modell oder Detaillierungsgrad des Algorithmus kann "eindeutig vorgeschriebene Abfolge von Schritten" unterschiedliche Dinge bedeuten. Beispiel: Man kann die Addition von natürlichen Zahlen als Elementaroperation ansehen oder die Details der Addition von Dezimalzahlen (Schulmethode) als Teil des Algorithmus betrachten. Nicht selten werden Algorithmen in einer Form beschrieben, die viele Details offen lässt. (Beispielsweise könnte es in einem Algorithmus ein Hilfsprogramm geben, das eine Folge sortiert. Der Algorithmus gilt oft auch dann als vollständig, wenn die verwendete Sortiermethode gar nicht fixiert ist.) +Noch ein Wort zu Eingabe/Ausgabe: Vor der Verarbeitung durch einen Computer müssen Daten in eine interne Darstellung transformiert werden. Die Ausgabe eines Programms muss wieder in "reale" Daten übersetzt werden. + +## 2.4. Erweiterung des Algorithmusbegriffs +- *Online-Algorithmen*: Die Eingabe wird nicht am Anfang der Berechnung, sondern nach und nach zur Verfügung gestellt, Ausgaben müssen nach Teileingabe erfolgen. Häufi ge Situation bei Datenstrukturen, Standard bei Betriebssystemen, Systemprogrammen, Anwendungsprogrammen mit Benutzerdialog usw. +- *Randomisierung*: Algorithmus führt Zufallsexperimente durch, keine Eindeutigkeit der Berechnung gegeben. +- *Verteilte Algorithmen*: Mehrere Rechner arbeiten zusammen, kommunizieren, zeitliche Abfolge nicht vorhersagbar + + +#### 2.4.0.1. Varianten +Zu einer Eingabe $x\in I$ könnte es mehrere legale Ergebnisse geben. Formal: In 3. haben wir statt einer Funktion f eine Relation $R\subseteq I \times O$ mit $\forall x \in I \exists y \in O: R(x, y)$. A löst P, wenn A genau die Eingaben aus I verarbeitet und $R(x,A(x))$ für jedes $x\in I$ gilt. +Beispiel "nicht-stabiles Sortieren": Beim Sortieren von Objekten/Datensätzen, wobei Schlüssel wiederholt vorkommen dürfen, kann jede sortierte Anordnung der Objekte eine legale Lösung sein. Dann ist die Lösung nicht eindeutig. +- Online-Situation: Eingabe wird "in Raten" geliefert, Zwischenausgaben werden verlangt. + +#### 2.4.0.2. Spezi kation des Sortierproblems +Parameter: Die Grundbereiche (Klassen), aus denen die zu sortierenden Objekte und die Schlüssel stammen: +- $(U,<)$: total geordnete Menge (endlich/unendlich, Elemente heißen "Schlüssel"). +- Beispiele: Zahlenmengen ${1,...,n}, \N, \Z, \Q$ Mengen von Strings. +- D: Menge (Elemente heißen "Datensätze"). +- key : $D \rightarrow U$ gibt zu jedem Datensatz einen "Sortierschlüssel" an. +- $I = O = Seq(D) := D^{<\infty} := U_{n\geq 0} D^n = {(a_1,...,a_n)|n\in \N, a_1,...,a_n \in D}$ (die Menge aller endlichen Folgen von Datensätzen) +Es ist häufi ger der Fall als nicht, dass die zu verwendenden Grundbereiche bei einem Berechnungsproblem (oder einer Datenstruktur) als Parameter angegeben werden, die für eine konkrete Verwendung oder auch für eine konkrete Implementierung noch festgelegt werden müssen. Bei der objektorientierten Programmierung entspricht dies der Verwendung von "generischen Typen" (Java-Terminologie) oder Templates (C++-Terminologie). +Der Schlüssel $key(x)$ könnte ein simples Attribut $x:key$ des Objekts x sein, oder mit einer Methode aus x berechnet werden. In Beispielen lassen wir oft die Datensätze (fast) ganz weg und konzentrieren uns auf die Schlüssel. Dies ist bei realen Anwendungen fast nie so. (Sehr selten will man eine Liste von puren Zahlen sortieren, sondern man will meistens komplexere Datensätze nach ihnen zugeordneten Nummern sortieren.) +$D^n$ ist die Menge aller n-Tupel von Datensätzen. $D^0$ hat nur das Element $()$ (die leere Folge). $D^1$ hat als Elemente die Folgen $(a)$ für $a\in D$. Die Menge $Seq(D)$ erhält man, indem man alle diese Mengen zusammenwirft. Bitte die Notation $Seq(D)$ einprägen! + +#### 2.4.0.3. Alternative Formulierung des Sortierproblems: +Die Ausgabe ist nicht die sortierte Folge, sondern die Permutation $\pi$, die die Eingabefolge in die richtige Reihenfolge bringt, wie oben beschrieben. $O' = {\pi | \pi Permutation einer Menge {1,...,n},n\in \N}$ +Defi nition: $(a_1,...,a_n)$ wird durch $\pi$ sortiert: $\iff key(a_{\pi (1)}) \leq key(a_{\pi (2)}) \leq ... \leq key(a_{\pi (n)})$ +$x = (a1,...,an)\in I$ und $\pi\in O$ stehen in der Relation $R'$, d.h.: $R'(x,\pi )$ gilt$:\iff x$ wird durch $\pi$ sortiert.Dann ist $(I,O',R')$ ebenfalls eine Spezi kation des Sortierproblems. +Wir können nun präzise nach der Korrektheit eines Sortieralgorithmus fragen. Auch ein "Beweis der Korrektheit" eines Algorithmus ergibt nun einen Sinn. Die Korrektheitsbeweise dieser Vorlesung funktionieren alle "mathematisch". Es gibt auch maschinenbasierte Korrektheitsbeweise für Programme. Bei Algorithmen, deren Kern eine Schleife ist, verwendet man oft Beweise, die vollständige Induktion benutzen. Wir machen (vollständige) Induktion über $i= 1,...,n$, das heißt, es werden gar nicht alle natürlichen Zahlen betrachtet. +Den Beweis selbst muss man nicht beim ersten Lesen studieren, aber irgendwann doch. Er stellt an einem sehr einfachen Beispiel dar, wie man präzise über das Verhalten eines Algorithmus argumentieren kann, ohne die Formalismen zu übertreiben. + +#### 2.4.0.4. Löst Insertionsort das Sortierproblem? +Gilt für jede Eingabe $(a_1,...,a_n)$ in $A[1..n]$, dass nach Ausführung von Insertionsort dieselben Elemente im Array stehen, aber nach Schlüsseln aufsteigend sortiert? +**Korrektheitsbeweis an Beispiel**: Durch vollständige Induktion über $i =1,2,...,n$ zeigt man die folgende (Induktions-)Behauptung: +Nach Durchlauf Nummer i (in i) der äußeren Schleife $(1)-(7)$ stehen in $A[1..i]$ dieselben Elemente wie am Anfang, aber aufsteigend sortiert. Nach Durchlauf Nummer n, also am Ende, gilt dann $(IB_n)$. Diese Behauptung sagt gerade, dass die Einträge aus der ursprünglichen Eingabe nun in aufsteigender Reihenfolge in $A[1..n]$ stehen. + +**Korrektheitsbeweis für Insertionsort** +Zunächst erledigen wir zwei (triviale) Randfälle: Wenn n = 0 ist, also das Array leer ist, oder wenn n = 1 ist, es also nur einen Eintrag gibt, dann tut der Algorithmus gar nichts, und die Ausgabe ist korrekt. +Sei nun $n\geq 2$ beliebig, und der Input sei im Array $A[1..n]$ gegeben. Wir beweisen die Induktionsbehauptung $(IB_i)$ durch Induktion über $i=1,2,...,n$. +- I.A.: i = 1: "Nach Durchlauf für i = 1" ist vor Beginn. Anfangs ist das Teilarray $A[1..1]$ (nur ein Eintrag) sortiert, also gilt (IB1). +- I.V.: Wir nehmen an: $1 < i \leq n$ und $(IB_{i-1})$ gilt, d.h. $A[1..i - 1]$ ist sortiert, enthält dieselben Objekte wie am Anfang, und Schleifendurchlauf i beginnt. +- I.-Schritt: Betrachte Schleifendurchlauf i (Zeilen 2-7). + - $x := A[i]$ ist das aktuelle Objekt; es wird in Variable x kopiert. + - Position $A[i]$ kann man sich jetzt als leer vorstellen. + - Sei $m=m_i$ die größte Zahl in ${0,...,i-1}$, so dass $key(A[j]) \leq key(x)$ für $1\leq j \leq m$. + - (Wenn es gar kein $j\leq i - 1$ mit $key(A[j]) \leq key(x)$ gibt, ist $m = 0$. + - Wenn für alle $1\leq j \leq i - 1$ die Ungleichung erfüllt ist, ist $m = i - 1$.) +- Weil nach I.V. $A[1,..,i - 1]$ sortiert ist, gilt: $key(x) < key(A[j])$ für $m + 1 \geq j \geq i - 1$. + Die innere Schleife 4-7 mit der Initialisierung in Zeile 3 testet, durch direkten Vergleich in Zeile 4, die Zahlen $j-1=i-1,i-2,i-3,...,0$ nacheinander darauf, ob $j-1 = m$ ist. Entweder wird dabei $j = 1$ erreicht, dann ist $m = 0 = j - 1$, oder man stellt für ein $j\geq 2$ fest, dass $key(A[j - 1]) \leq key(x)$ gilt. Dann ist offenbar ebenfalls $m = j - 1$. +- Schon während der Suche nach m werden (in Zeile 5) die Einträge $A[i-1],A[i-2],...,A[m+1]$, in dieser Reihenfolge, um eine Position nach rechts verschoben, ohne die Sortierung dieser Elemente zu ändern. Nun stehen $A[1],...,A[m]$ an ihrer ursprünglichen Position, $A[m+ 1],A[m+ 2],...,A[i-1]$ (vorher) stehen jetzt in $A[m + 2..i]$. In Zeile 7 wird x (aus x) an die Stelle $A[m+1]$ geschrieben. Nach den Feststellungen in den Boxen und aus der I.V. ergibt sich, dass nun $A[1..i]$ aufsteigend sortiert ist. Also gilt $(IB_i)$. Nach Durchlaufen der äußeren Schleife Schleife für $i=2,..,n$ gilt die Aussage $(IB_n)$, also ist nach Abschluss des Ablaufs das Array sortiert. + +**Methoden für Korrektheitsbeweise** +- Vollständige Induktion: Damit wird die Korrektheit von Schleifen bewiesen. Meist ist dabei die Formulierung einer geeigneten Induktionsbehauptung zentral, die dann "Schleifeninvariante" genannt wird. +- Verallgemeinerte Induktion (d.h. man schließt von ($IB_j$) für alle $j 1$" wird zwischen 1-mal und i-mal durchgeführt, der Test $x.key < A[j-1].key$ zwischen 1-mal und $(i-1)$-mal, inputabhängig. Kosten für Zeilen $(4)(6)$ bei Schleifendurchlauf für $i: (k_i+1) * O(1) = O(k_i+1)$. +Kosten insgesamt: Summiere über $2\geq i\geq n = O(n+\sum_{2\geq i\geq n} k_i)$ +Typisch für solche Analysen: Nicht jede Operation zählen, sondern Zurückziehen auf das Zählen von "charakteristischen Operationen", die den Rest bis auf einen konstanten Faktor dominieren. + +Definition $F_x = \sum_{2\geq i \geq n} k_i$ +Anzahl der Fehlstände in $x=(a_1,...,a_n)$. Z.B. gibt es in $x=(4,7,5,3)$ vier Fehlstände: (1,4),(2,3),(2,4),(3,4). Gesmtaufwand von Insertionsort auf Eingabe x der Länge n ist $O(n+f_x)$ + +Welchen Wert $F_x$ sollte man für irgendein beliebiges x erwarten? aus $\sum_{0\geq i von $m_0*2^{l-1}$ auf $m_0*2^l$. Bei der l-ten Verdopplung entstehen Kosten $\Theta(m_0*2^{l-1})$. + +k := Anzahl der push-Operationen in $Op_1,..., Op_N \Rightarrow$ Zahl der Einträge ist immer $geq$k, also gilt, wenn die Verdopplung von $m_0*2^{l-1}$ auf $m_0*2^l$ tatsächlich statt ndet: $m_0*2^{l-1} < k$. Sei L maximal mit $m_0*2^{L-1} < k$. Dann sind die Gesamtkosten für alle Verdopplungen zusammen höchstens: +$$\sum_{1\leq i \leq L} O(m_0*2^{l-1})= O(m_0*(1+2+2^2+...+2^{L-1})) = O(m_0*2^L) = O(k)$$ +Die Gesamtkosten für alle Verdopplungen zusammen sind also $N*\Theta(1)+O(k)=\Theta(N)$ + +Wenn ein Stack mit Arrays und der Verdoppelungsstrategie implementiert wird, gilt: +1. Die Gesamtkosten für N Operationen betragen $\Theta(N)$. +2. Der gesamte Platzbedarf ist $\Theta(k)$, wenn k die maximale je erreichte Stackhöhe ist. + +##### 3.1.1.2.3. Vergleich Listen-/Arrayimplementierung +| Arrayimplementierung | Listenimplementierung | +| ---------------------------------------------------------------------------------- | ------------------------------------------------------------- | +| $O(1)$ Kosten pro Operation, "amortisiert" (im Durchschnitt über alle Operationen) | $O(1)$ Kosten pro Operation im schlechtesten Fall | +| Sequentieller, indexbasierter Zugriff im Speicher (cachefreundlich) | (jedoch: relativ hohe Allokationskosten bei push-Operationen) | +| Höchstens 50% des allozierten Speicherplatzes bleibt ungenutzt | Zusätzlicher Platz für Zeiger benötigt. | + +Experimente zeigen, dass die Arrayimplementierung spürbar kleinere Rechenzeiten aufweist. + +Generelle Erkenntnis: Datentypen lassen sich ebenso exakt spezi zieren wie Berechnungsprobleme. + +#### 3.1.1.3. Datentyp "Dynamische Arrays" +Stacks + "wahlfreier Zugriff" + +Neuer Grunddatentyp: Nat - durch $\N = {0,1,2,...}$ interpretiert. + +Operationen, informal beschrieben: +- empty(): liefert leeres Array, Länge 0 +- read(A; i): liefert Eintrag A[i] an Position i, falls $1\leq i \leq n$. +- write(A; i; x): ersetzt Eintrag A[i] an Position i durch x, falls $1 \leq i \leq n$. +- length(A): liefert aktuelle Länge n. +- addLast(A; x): verlängert Array um 1 Position, schreibt x an letzte Stelle (= push). +- removeLast(A): verkürzt Array um eine Position (= pop). + +Wieso gibt es kein "isempty"? Überprüfung durch "length" zeigt ein leeres Array falls keine Einträge vorhanden + +1. Signatur + - Sorten: + - Elements + - Arrays + - Nat + - Operationen + - empty: -> Arrays + - addLast: Array x Elements -> Arrays + - removeLast: Arrays -> Arrays + - read: Arrays x Nat -> Elements + - write: Arrays x Nat x Elements -> Arrays + - length: Arrays -> Nat +2. Mathematisches Modell + - Sorten: + - Elements: (nichtleere) Menge D (Parameter) + - Arrays: Seq(D) + - Nat: $\N$ + - Operationen: + - emtpy():=() + - addLast$((a_1,...,a_n),x):= (a_1,...,a_n,x)$ + - removeLast$((a_1,...,a_n)):= \begin{cases} (a_1,...,a_{n-1}), falls (n\geq 1) \\ undefiniert, falls (n=0) \end{cases}$ + - read$((a_1,...,a_n),i):= \begin{cases} a_i, falls (1\leq i \leq n) \\ undefiniert, sonst \end{cases}$ + - write$((a_1,...,a_n),i,x):= \begin{cases} (a_1,...,a_{i-1},x,a_{i+1},...,a_n), falls (1\leq i \leq n) \\ undefiniert, sonst \end{cases}$ + - length$((a_1,...,a_n)):= n$ + +**Implementierung**: Wir erweitern die Arrayimplementierung von Stacks in der offensichtlichen Weise, gleich mit Verdoppelungsstrategie. + +**Kosten**: +- empty, read, write, length: O(1). +- addLast: k addLast-Operationen kosten Zeit O(k). +- removeLast: Einfache Version (Pegel dekrementieren): O(1). + +## 3.2. Queues (Warteschlangen, FIFO-Listen) +(First-in-First-Out Listen) Stacks und Queues verhalten sich sehr unterschiedlich +- "enqueue": Man fügt ein Element ein, indem man hinten an die Kette anhängt. +- "dequeue": Man entnimmt ein Element am vorderen Ende der Kette. +- "fi rst": Man kann den vordersten Eintrag auch lesen. + +### 3.2.1. Spezifikation des Datentypes "Queue" über D +Die Signatur ist identisch zur Signatur von Stacks (bis auf Umbenennungen). Rein syntaktische Vorschriften! +1. Signaur + - Sorten: + - Elements + - Queues + - Boolean + - Operationen: + - empty: -> Queues + - enqueue: Queues x Elements -> Queues + - dequeue: Queues -> Queues + - first: Queues -> Elements + - isemtpy: Queues -> Boolean +2. Mathematisches Modell + - Sorten: + - Elements: (ncihtleere) Menge D (Parameter) + - Queues: Seq(D) + - Boolean: {true, false} + - Operationen: + - empty():=() + - enqueue$((a_1,...,a_n),x):= (a_1,...,a_n,x)$ + - dequeue$((a_1,...,a_n)):= \begin{cases} (a_2,...,a_n), falls (n\geq 1)\\ undefiniert, falls (n=0) \end{cases}$ + - first$((a_1,...,a_n)):= \begin{cases} a_1, falls (n\geq 1)\\ undefiniert, falls (n=0) \end{cases}$ + - isemtpy$((a_1,...,a_n)):= \begin{cases} false, falls (n\geq 1)\\ true, falls (n=0) \end{cases}$ + + +Die leere Folge () stellt die leere Warteschlange dar. +Das mathematische Modell ist fast identisch zu dem für Stacks. Nur fügt enqueue(x) das Element x hinten an die Folge an, während push(x) das Element x vorne anfügt. + +### 3.2.2. Implementierung von Queues +**Listenimplementierung** +Implementierung mittels einfach verketteter Listen mit Listenendezeiger/-referenz. Bei der Verwendung von Listen ist zu beachten, dass man mittels Zeigern/Referenzen Zugang zu beiden Enden der Liste benötigt: mit einem "head"-Zeiger hat man Zugriff auf den Anfang, mit +einem "tail"-Zeiger Zugriff auf das Ende. + +**Arrayimplementierung** + +##### 3.2.2.0.1. TODO ########################################################################################################################## +!TODO seite 40(394) +##################################################################################################################################### + + + +# 4. Binärbaume +## 4.1. Grundlagen +## 4.2. Definition +Ein Binärbaum T besteht aus einer endlichen Menge V von "inneren" Knoten, einer dazu disjunkten endlichen Menge L von "äußeren" Knoten sowie einer injektiven Funktion + +D sei Menge von (möglichen) Knotenmarkierungen, Z sei Menge von (möglichen) Blattmarkierungen: +1. Wenn $z \in \Z$ dann ist (z) ein (D,Z)-Binärbaum +2. Wenn $T_1, T_2$ (D,Z)-Binärbaume sind und $x \in D$ ist, dann ist auch $(T_1,x,T_2)$ ein (D,Z)-Binärbaum +3. nichts sonst ist (D,Z)-Binärbaum + +## 4.3. Operationen +1. Signatur + - Sorten: + - Elements + - Bintrees + - Boolean + - Operationen + - empty: -> Bintrees + - buildTree: Elements x Bintrees x Bintrees -> Bintrees + - leftSubtree: Bintrees -> Bintrees + - rightSubtree: Bintrees -> Bintrees + - data: Bintrees -> Elements + - isemtpy: Bintrees -> Boolean +2. mathematisches Modell + - Sorten: + - Elements: (nichtleere) Menge D + - Bintrees: {T | T ist (d,{-})-Binärbaum} + - Boolean: {true, false} + - Operationen: + - empty():= {}:= (-) + - $buildTree(x,T_1,T_2) := (T_1,x,T_2)$ + - $leftSubtree(T) := \begin{cases} T_1, falls\ T=(T_1,x,T_2) \\ undefiniert, falls\ T=(-) \end{cases}$ + - $rightSubtree(T) := \begin{cases} T_2, falls\ T=(T_1,x,T_2) \\ undefiniert, falls\ T=(-) \end{cases}$ + - $data(T) := \begin{cases} x, falls\ T=(T_1,x,T_2) \\ undefiniert, falls\ T=(-) \end{cases}$ + - $isempty(T) := \begin{cases} false, falls\ T=(T_1,x,T_2) \\ true, falls\ T=(-) \end{cases}$ + +## 4.4. Terminologie +- Binärbaum T, engl: "binary tree" +- Wurzel, engl "root" +- (innerer) Knoten v, engl: "node" +- (äußerer) Knoten l = Blatt, engl: "leaf" +- Blatteintrag: z= data(l) +- Knoteneintrag: $x = data(v) = data(T_0)$ +- $T_v$: Unterbaum mit Wurzel v +- Vater/Vorgänger, engl: "parent", von v: p(v) + - linkes Kind, engl: "left child", von v: von v: child(v, left) + - rechtes Kind, engl: "right child", von v: von v: child(v, right) + - Vorfahr (Vater von Vater von Vater . . . von u), engl: "ancestor" + - Nachfahr (Kind von Kind von . . . von v), engl: "descendant" +- Weg in T: Knotenfolge oder Kantenfolge, die von v zu einem Nachfahren u führt +- Länge eines Wegs $(v_0,v_1,...,v_s)$: Anzahl s der Kanten auf dem Weg +- Tiefe/Level eines Knotens: Die Länge (das ist die Kantenzahl) des Wegs von der Wurzel zum Knoten heißt die Tiefe oder das Level $d(v)$ von Knoten v. Die Knoten mit Tiefe l bilden das Level l. +- + +## 4.5. TIPL und TEPL +### 4.5.1. Totale innere Weglänge (Total internal path length) +TIPL(T) = Anzahl der Knoten * Tiefe der Knoten + +Mittlere innere Weglänge: $\frac{1}{n}* TIPL(T) > log(n - 2)$ + +### 4.5.2. Totale äußere Weglänge (Total external path length) +TEPL(T) = Anzahl der Blätter * Tiefe der Blätter + +Mittlere äußere Weglänge: $\frac{TEPL(T)}{n+1} \geq log(N)$ + +TEPL(T) = TIPL(T) +2n + +## 4.6. Baumdurchläufe +(D,Z)-Binärbäume kann man systematisch durchlaufen, die Knoten nacheinander besuchen und (anwendungsabhängige) Aktionen an den Knoten ausführen. Abstrakt gefasst: visit-Operation. +Organisiere data-Teil der Knoten als Objekte einer Klasse; visit(T) löst Abarbeitung einer Methode von data(T) aus. + +### 4.6.1. Inorder Durchlauf +>"Erst den linken Unterbaum, dann die Wurzel, dann den rechten Unterbaum" + +Bsp: falls $T=(T_1,x,T_2)$ + - Inorder Durchlauf durch $T_1$ + - i-visit(x) + - Inorder Durchlauf durch $T_2$ + +Man besucht abwechselnd externe und interne Knoten. + +### 4.6.2. Präorder Durchlauf +> "Erst die Wurzel, dann den linken Unterbaum, dann den rechten Unterbaum" + +Bsp: falls $T=(T_1,x,T_2)$ + - i-visit(x) + - Inorder Durchlauf durch $T_1$ + - Inorder Durchlauf durch $T_2$ + +### 4.6.3. Postorder Durchlauf +> "Erst den linken Unterbaum, dann den rechten Unterbaum, zuletzt die Wurzel" +Bsp: falls $T=(T_1,x,T_2)$ + - Inorder Durchlauf durch $T_1$ + - Inorder Durchlauf durch $T_2$ + - i-visit(x) + +### 4.6.4. Kombi Durchlauf +Ermöglicht Datentransport von der Wurzel nach unten in den Baum hinein und wieder zurück. +Bsp: falls $T=(T_1,x,T_2)$ + - preord-i-visit(x) + - Kombi Durchlauf durch $T_1$ + - inord-i-visit(x) + - Kombi Durchlauf durch $T_2$ + - postord-i-visit(x) + +### 4.6.5. Zeitanalyse für Baumdurchlauf +Die Baumdurchläufe können mittels rekursiver Prozeduren implementiert werden. + +Beispiel: Inorder Durchlauf + - Angewendet auf einen Baum T mit n inneren Knoten + - Für jeden inneren und äußeren Knoten wird die Prozedur inorder() einmal aufgerufen, insgesamt $(2n+1)$-mal + - Kosten pro Aufrug $O(1)$ plus Kosten für i-visit/e-visit-Operation + - Insgesamt: $(2n+1)*(O(1)| +C_{visit})$ wobei $C_{visit}$ eine Schranke für die Kosten der visit-Operationen ist + +Behauptung: Baumdurchläufe haben lineare Laufzeit. + +# 5. Hashverfahren +Gegeben: Universum U (auch ohne Ordnung) und Wertebereich R. Hashverfahren (oder Schlüsseltransformationsverfahren) implementieren ein Wörterbuch (alias dynamische Abbildung, assoziatives Array) $f: S \rightarrow R$, mit $S \subseteq U$ endlich. + +Ziel: Zeit $O(1)$ pro Operation "im Durchschnitt" unabhängig vom Umfang der Datenstruktur + +Grundansatz: "x wird in h(x) umgewandelt/transformiert" (Ideal: Speichere Paar (x, f(x)) in Zelle T[h(x)] ) + +Eine Funktion $h: U \rightarrow [m]$ heißt Hashfunktion. Wenn $S \subseteq U$ gegeben ist, verteilt h die Schlüssel in S auf $[m]$. $B_j := {x \in S | h(x) = j}$ heißt Behälter ("bucket"). +$h$ perfekt (ideal) für S falls $h$ zu S injektiv, d.h. gür jedes $j \in [m]$ existiert höchstens ein $x \in S$ mit $h(x) = j$. + +**Uniformitätsannahme** (UF): Werte $h(x_1),...,h(x_n)$ in $[m]$ sind "rein zufällig": Jeder der $m^n$ Vektoren $(j_1,...,j_n)\in [m]^n$ kommt mit derselben Wahrscheinlichkeit $1/m^n$ als $(h(x_1),...,h(x_n))$ vor. UF tritt (näherungsweise) ein, wenn: + - U endlich ist und + - h das Universum in gleich große Teile zerlegt ($|h^{-1}({j}) = \lfloor |U|/m \rfloor$ oder $\lceil |U|/m \rceil$ ) + - $S \subseteq U$ eine rein zufällige Menge der Größe n ist +Pr(keine Kollision)=Pr(injektiv auf S) $< e^{-\frac{n(n-1)}{2m}}$ + +"Geburtsparadoxon": $x_1,...,x_n$ sind Leute und $h(x_1),...,h(x_n) \in [m]$ die Nummern ihrer Geburtstage im Jahr, $m=365$. Wenn z.B. $n=23$ ist, ist Pr(alle Geburtstage verschieden)$< e^{-\frac{23*22}{365*2}} = e^{\frac{-506}{730}} < 0,5$. +Mit Wahrscheinlichkeit >1/2 sind unter 23 Personen mit zufälligen Geburtstagen zwei, die am selben Tag Geburtstag haben. + +Wunsch: Linearer Platzverbrauch, also "Auslastungsfaktor" $\alpha := \frac{n}{m}$ nicht kleiner als eine Konstante $\alpha_0$. Dann: Pr(h injektiv auf S)$\leq e^{-\alpha_0(n-1)/2}$. D.h. falls h nicht auf S abgestimmt ist, kommen Kollisionen praktisch immer vor! $\rightarrow$ Kollisionsbehandlung ist notwendig. + +## 5.1. Hashing mit Verketteten Listen +engl.: chained hashing + +Auch: "offenes Hashing", weil man Platz außerhalb von T benutzt. In $T[0... m-1]$: Zeiger auf die Anfänge von m einfach verketteten linearen Listen $L_0,...,L_{m-1}$. (Oder auch: Zeiger auf "kleine" Arrays/Vektoren mit variabler Länge.) Liste $L_j$ enthält die Einträge mit Schlüsseln x aus Behälter/Bucket: $B_j={x\in S | h(x) = j}$ + +### 5.1.1. Wir implementieren die Wörterbuchoperationen: Algorithmen +- empty(x) + - Erzeugt Array $T[0...m-1]$ mit m NULL-Zeigern/NULL-Referenzen und legt $h:U\rightarrow [m]$ fest. + - Kosten: $\Theta(m)$ + - Beachte: Man wählt h, ohne S zu **kennen** +- lookup(x) + - Berechne $j=h(x)$ suche Schlüssel x durch Durchlaufen der Liste $L_j$ bei $T[j]$; falls Eintrag gefunden: $return R$; sonst: $return "nicht vorhanden"$ + - Kosten/Zeit: O(1+ Zahl der Schlüsselvergleiche "x=y?"); Erfolglose Suche exakt $|B_j|$; Erfolgreiche Suche höchstens $|B_j|$ +- insert(x,r) + - Berechne $J=h(x)$ suche Schlüssel x in Liste $L_j$ bei $T[j]$; falls gefunden ersetze Daten bei x durch r + - Kosten: wie bei lookup +- delete(x) + - Berechne $J=h(x)$, suche Schlüssel x in Liste $L_j$ bei $T[j]$; falls gefunden lösche Eintrag $(x,f(x))$ aus $L_j$ + - Kosten: wie bei lookup + +Ziel: analysiere erwartete Kosten für lookup, insert, delete. Hierfür genügt Analyse erwarteter Anzahl der Schlüsselvergleiche. +- Pr(A): Wahrscheinlichkeit für Ereignis A +- E(X): Erwartungswert der Zufallsvariablen X +- abgeschwächte "Uniformitätsannahme": Für je 2 Schlüssel $x \not = z$ in U gilt: $Pr(h(x)=h(z)\leq \frac{1}{m})$ + +### 5.1.2. Verdoppelungsstrategie +Wenn nach $insert(x, r)$ (mit x neu) der Wert load die Grenze $a_1m$ überschreitet: +- Erzeuge neue Tabelle $T_{neu}$ der Größe $2m$. +- Erzeuge neue Hashfunktion $h_{neu}:U \rightarrow [2m]$. +- Übertrage Einträge aus den alten Listen in neue Listen zu Tabelle $T_{neu}$, gemäß neuer Hashfunktion. Dabei Einfügen am Listenanfang ohne Suchen. (Wissen: Alle Schlüssel sind verschieden!) Kosten: O(m) im schlechtesten Fall. +- Benenne $T_{neu}$ in $T$ und $h_{neu}$ in $h$ um. + +## 5.2. Hashfunktionen +### 5.2.1. Einfache Hashfunktionen +Kriterien für Qualität: +1. Zeit für Auswertung von $h(x)$ (Schnell!) entscheidend: Schlüsselformat +2. Wahrscheinlichkeit für Kollisionen (unter "realistischen Annahmen" über Schlüsselmenge S). (Klein, am besten $\leq c=m$ für c konstant.) + +#### 5.2.1.1. Fall: Schlüssel sind natürliche Zahlen: $U \subseteq \N$ +##### 5.2.1.1.1. Divisionsrestmethode +$h(x)= x\ mod\ x$ Sehr einfach, recht effzient. +Nachteile: +- Unflexibel: Nur eine feste Funktion für eine Tabellengröße. +- Bei strukturierten Schlüsselmengen (z. B. aus Strings übersetzte Schlüssel) deutlich erhöhtes Kollisionsrisiko. + +##### 5.2.1.1.2. Diskrete Multiplikationsmethode +$U=[2^k]$ und $m=2^l$. $h_a(x)=(ax\ mod\ 2^k)div 2^{k-l}$ +mit $a\in[2^k]$ ungerade und z.B. $\frac{a}{2^k} \approx \frac{1}{2}(\sqrt{5} -1 ) = 0,618...$ +Oder: $a\in [2^k]$ ungerade, zufällig. Sehr effziente Auswertung ohne Division. + +#### 5.2.1.2. Fall: Schlüssel sind Strings/Wörter: $U \subseteq Seq(\sum)$ +$\sum$:"Alphabet" (endliche nichtleere Menge). $Seq(\sum)$: Menge aller endlichen Folgen von Elementen von $\sum$:"Wörter über $\sum$". +- Kollisionen $n(x) = n(y)$ nie auflösbar! +- Selbst wenn n injektiv: Ineffziente Auswertung von $h(^x)$. +##### 5.2.1.2.1. Lineare Funktionen über Körper $\Z_p = [p] = {0,...,p-1}$ +$\sum \subseteq [p]$ für p Primzahl, $m = p$. (Beispiel: ISO-8859-1 $b= [256] \subseteq [p] = [1009]$) +Wähle Koeffzienten $a_1, ..., a_r \in [p]$ mit $h(c_1...c_r)=(\sum_{i=1}^r a_i*c_i) mod\ p$ +Vorteile: +- Rechnung nur mit Zahlen $< p_2 = m_2$ (wenn man nach jeder Multiplikation/Addition Rest modulo p bildet); +- sehr effzient; +- theoretisch nachweisbares gutes Verhalten, wenn $a_1,...,a_r$ aus $[p]$ zufällig gewählt werden. + +### 5.2.2. Anspruchsvolle Hashfunktionen +Qualitätskriterien: +1. Zeit für Auswertung von $h(x)$ (klein!) +2. geringe Wahrscheinlichkeit für Kollisionen ohne Annahmen über die Schlüsselmenge S (ähnlich der zufälligen Situation!) +3. Effiientes Generieren einer neuen Hashfunktion (benötigt z.B. bei der Verdoppelungsstrategie) +4. Platzbedarf für die Speicherung von h (Programmtext, Parameter) (gering gegenüber n!) + +Universelles Hashing (Idee): Bei der Festlegung der Hashfunktion h wird (kontrolliert) Zufall eingesetzt ("Randomisierter Algorithmus"). (Bei Programmierung: "Pseudozufallszahlengenerator", in jeder Prog.-Sprache bereitgestellt.) Analyse beruht auf dadurch vom Algorithmus erzwungenen Zufallseigenschaften von h. + +$a_1,...,a_r$ seien (uniform) zufällig gewählt aus $[p]$. Definiere $h(c_1...c_r)=(a_1*c_1+...+a_r*c_r)mod\ p$. Es gilt für $x,z \in U$ mit $x \not = z$: $Pr(h(x)=h(z))?\frac{1}{p}$ + +Wähle a aus ${1, ..., p-1}$ (uniform) zufällig, wobei p Primzahl. Es gilt für $x,z \in U$ mit $x\not = z$: $Pr(h(x)=h(z))\leq \frac{2}{m}$ + +Mit multiplikativem Hashing (wobei $U=[2^k]$, $m=2^l$), mit $h(x)=(a*x\ mod\ 2^k)div\ 2^{k-l}$ als a eine zufällige ungerade Zahl in $[2^k]$ wählt, dann gilt für beliebige $x,z\in U, x\not = z$: $Pr(h(x)=h(z))\leq \frac{2}{2^l}=\frac{2}{m}$ + +**Tabellenhashing** +Universum $U=\sum^r$, mit $\sum={0,..., s-1}$. $m=2^l$ mit $l\leq w$ (w: Wortlänge, z.B. w=32). Wertebereich: [m] entspricht ${0,1}^l$ via Binärdarstellung. Repräsentation der Hashfunktion h: Array $A[1...r, 0... s-1]$ mit Einträgen aus ${0,1}^w$ +- Nachteil: Array $A[1..r,0..s-1]$ benötigt Platz $r*s$ (Wörter). Sinnvoll nur für große Hashtabellen. + - Platzsparend, etwas langsamer: $\sum={0,1}^4={0,1,...,9,A,...,F}$ ("Tetraden" bzw. Hexadezimalziffern.) +- Vorteile von Tabellenhashing: + - Extrem schnelle Auswertung + - Dasselbe A kann für $m=2^4,2^5,2^6,...,2^w$ benutzt werden. Ideal für die Kombination mit der Verdoppelungsstrategie: Verdopple Tabellengröße = erhöhe l um 1; Einträge in A bleiben unverändert. + - Beweisbar gutes Verhalten, wenn Einträge von A zufällig. + +Sei c konstant. Wenn $Pr(h(x) = h(z))\leq \frac{c}{m}$, für beliebige $x,z\in U$, $x \not = z$, und wenn wir Hashing mit verketteten Listen benutzen, dann ist die erwartete Zahl von Schlüsselvergleichen +- höchstens $c*a$ bei der erfolglosen Suche und +- höchstens $1 + c*a$ bei der erfolgreichen Suche. + +## 5.3. Geschlossenes Hashing +> oder "offene Adressierung": Kollisionsbehandlungs-Methode. +Idee: Für jeden Schlüssel $x\in U$ gibt es eine Sondierungsfolge $h(x,0),h(x,1),h(x,2),...$ in [m]. Beim Einfügen von x und Suchen nach x werden die Zellen von T in dieser Reihenfolge untersucht, bis eine leere Zelle oder der Eintrag x gefunden wird. + +### 5.3.1. Lineares Sondieren +$h(x,k)=(h(x)+k)mod\ m, k=0,1,2,...$ + +Ergebnisse für lineares Sondieren: Eine einzelne erfolglose Suche wird z.B. bei zu 90% gefüllter Tabelle durchaus teuer. Bei vielen erfolglosen Suchen in einer nicht veränderlichen Tabelle (anwendungsabhängig!) sind diese Kosten nicht tolerierbar. $a\leq 0,6$ oder $0,7$ liefert jedoch akzeptable Suchkosten. Die (über $x_i\in S$) gemittelte Einfüge-/Suchzeit ist dagegen sogar bei 90% gefüllter Tabelle erträglich. + +### 5.3.2. Quadratisches Sondieren +$h:U\rightarrow [m]$ sei beliebige Hasfunktion. $h(x,k)=(h(x)+\lceil \frac{k}{2} \rceil^2 * (-1)^{k+1})mod\ m$, für $k=0,1,2,...$ +Ist m Primzahl, so dass $m+1$ durch 4 teilbar ist, dann gilt bei der Verwendung von quadratischem Sondieren: ${h(x,k)| 0\leq k < m}=[m]$ +Quadratisches Sondieren verhält sich sehr gut. + +### 5.3.3. Doppel Hashing +Benutze zwei (unabhängig berechnete) Hashfunktionen $h_1:U\rightarrow [m]$ und $h_2:U\rightarrow [m-1]$ und setzte für $k=0,1,...$: $h(x,k):=(h_1(x)+k*(1+h_2(x)))mod\ m$. Wenn m Primzahl ist, dann gilt für Doppel-Hashing ${h(x,k) | 0 \leq k < m}$. Man kann beweisen: Wenn $h_1(x), h_2(x), x \in S$, rein zufällig sind, verhält sich Doppel-Hashing sehr gut, nämlich im Wesentlichen wie "Uniformes Sondieren". + +### 5.3.4. Uniformes Sondieren / Ideales Hashing +Keine Methode, sondern eine Wahrscheinlichkeitsannahme für Verfahren mit offener Adressierung: +$(h(x,0), h(x,1),..., h(x,m-1))$ ist eine rein zufällige Permutation von $[m]$, unabhängig für jedes $x\in U$. + +## 5.4. Löschen +Jede Zelle hat Statusvariable status (voll, leer, gelöscht ). +Löschen: Zelle nicht auf leer, sondern auf gelöscht setzen (engl.:"tombstone"). +Suchen: Immer bis zur ersten leeren Zelle gehen. +Zellen, die gelöscht sind, dürfen mit einem neuen Schlüssel überschrieben werden. + +Überlauf tritt spätestens ein, wenn die letzte leere Zelle beschrieben werden würde. +Sinnvoller: Überlauf tritt ein, wenn die Anzahl der vollen und gelöschten Zellen zusammen eine feste Schranke bound überschreitet. + +Operationen bei offener Adressierung +- empty(m): + - Lege leeres Array $T[0...m-1]$ an. + - Initialisiere alle Zellen $T[j]$ mit $(-,-, leer)$. + - Wähle Hashfunktion $h: U x [m] \rightarrow [m]$. + - Initialisiere inUse mit 0. (Zählt nicht-leere Zellen.) + - Initialisiere load mit 0. (Zählt Einträge.) + - Initialisiere bound (z.B. mit $\alpha_0m$, maximal $m-1$). +- lookup/delete(x) + - Finde erstes l in der Folge $h(x,0),h(x,1),h(x,2),...$ mit + - 1.Fall: $T[l].status = leer$: return "not found" bzw mache nichts + - 2.Fall: $T[l].status = voll$ und $T[l].key=x$: return data bzw lösche key und setzte status auf gelöscht (load--) +- insert(x) + - 1. Fall: $T[l].status = voll$: $T[l].data \leftarrow r$ (Update) + - 2. Fall: $T[l'].status = gelöscht: T[l']\leftarrow (x,r,voll); load++ (überschreibe gelöschtes Feld) + - 3. Fall: $T[l'].status = leer$: $l=l'$, neue Zelle + +## 5.5. Cuckoo Hashing +Implementierung eines dynamisches Wörterbuchs. Zwei Tabellen $T_1, T_2$, jeweils Größe m. Zwei Hashfunktionen $h_1$ und $h_2$, $x\in S$ sitzt in $T_1[h_1(x)]$ oder in $T_2[h_2(x)]$. $\Rightarrow$ Konstante Suchzeit garantiert; auch delete(x) in $O(1)$ Zeit. +$h_1,\ h_2$ passen zu $S$, falls die Schlüssel aus $S$ gemäß der Regel gespeichert werden können, d.h. man kann $S$ in $S_1$ und $S_2$ partitionieren, so dass $h_1$ auf $S_1$ und $h_2$ auf $S_2$ injektiv ist. Das Verfahren heißt "Kuckucks-Hashing" wegen seiner Einfügeprozedur: +Schlüssel $x$, der eingefügt werden soll, kann Schlüssel $y$, der in $T_1[h_1(x)]$ oder $T_2[h_2(x)]$ ("im Nest") sitzt, hinauswerfen (verdrängen). Der verdrängte Schlüssel geht zu seinem alternativen Platz. + +Hashfunktionen verteilen Schlüssel rein zufällig. Wenn man Cuckoo-Hashing mit $n$ Schlüsseln in zwei Tabellen mit je m Plätzen durchführt, wobei $\frac{}{m} \leq 1- \beta$ (essenziell!), dann passen $h_1, h_2$ mit Wahrscheinlichkeit $1-O(\frac{1}{m})$ zur Schlüsselmenge S. +Falls $h_1, h_2$ passen, ist die erwartete Einfügezeit $O(\frac{1}{\beta} )$. +Nachteil: Auslastung der Tabelle unter 50%. + +# 6. Sortierverfahren +Input: Tupel $x =(a_1,..., a_n)$ von Objekten $a_i$ mit Schlüssel- und Datenteil: $a_i.key$ und $a_i.data$. Gegeben als Array $A[1..n]$ oder als lineare Liste. + +Stabil (Bei Vorkommen gleicher Sortierschlüssel) Sortierverfahren heißt stabil, wenn Objekte mit identischen Schlüsseln in der Ausgabe in derselben Reihenfolge stehen wie in der Eingabe. + +Maßzahlen für Sortieralgorithmen (in Abhängigkeit von n): +1. Laufzeit (in O-Notation) +2. Anzahl der Vergleiche ( wesentliche Vergleiche“) + ”$a_i.key < a_j.key$“ bzw. "$a_i.key \leq a_j.key“ +3. Anzahl der Datenverschiebungen oder Kopiervorgänge +4. der neben dem Array (bzw. der linearen Liste) benötigte Speicherplatz; + wenn dieser nur $O(1)$, also von n unabhängig, ist: Algorithmus arbeitet "in situ“ oder "in-place“. + +## 6.1. Mergesort +(engl. merge = vermengen, reißverschlussartig zusammenfügen) +Algorithmenparadigma oder -schema: "Divide-and-Conquer“ (D-a-C, teile und herrsche“). (Kleine Teilarrays werden durch Insertionsort sortiert) +Sortiert stabil. Rechenzeit ist $\Theta(n\ log(n))$ + +Vorgehen auf Instanz $x\in I$: +0. Trivialitätstest: Wenn P für x einfach direkt zu lösen ist, tue dies. – Sonst: +1. Teile: Zerteile x in (zwei oder mehr) Stücke $x_1,..., x_a \in I$. + (Wesentlich für Korrektheit/Terminierung: Jedes der Stücke ist "kleiner“ als x .) +2. Rekursion: Löse P für $x_1,..., x_a$, separat, durch rekursive Verwendung von A. + Teillösungen: $r_1,..., r_a$ . +3. Kombiniere: Baue aus $x$ und $r_1,..., r_a$ und $x_1,..., x_a$ eine Lösung $r$ für $P$ auf $x$ auf. + +```cpp +function Mergesort (a, b) // 1 ≤ a ≤ b ≤ n , sortiert A[ a..b ] + if b − a ≤ n 0 // n 0 ≥ 0 ist vorausgesetzt + then Insertionsort (a, b) + else // Wissen: Länge von A[ a..b ] ist ≥ 2 + m = a + $\lfloor$b(b − a)/2 $\rfloor$; + Mergesort(a, m); + Mergesort( m + 1, b) ; + Merge (a, m , b) // fügt sortierte Teilfolgen zusammen; + +function Merge (a, m, b) // für 1 ≤ a ≤ m < b ≤ n , sortiert A[ a..b ], nimmt an, dass A[ a..m ] und A[ m + 1..b ] sortiert sind. + i = a; // Index in A[ a..m ] + j = m + 1; // Index in A[ m + 1..b ] + k = a; // Index in B[ a..b ] + while i ≤ m and j ≤ b do + if A[i] ≤ A[j] + then B[k] = A[i]; ++i; ++k + else B[k] = A[j]; ++j; ++k // verbleibendes Schlussstück kopieren: + while i ≤ m do B[k] = A[i]; ++i; ++k; + while j ≤ b do B[k] = A[j]; ++j; ++k; + // B[ a..b ] nach A[ a..b ] kopieren: + for k from a to b do A[k] = B[k] +``` + +## 6.2. Quicksort +Folgt ebenso wie Mergesort dem Divide-and-Conquer-Ansatz. +Quicksort ist nicht stabil. +Rechenzeit beträgt $O(n)+O(Gesamtzahl\ aller\ Schlüssel) =: V$ + +Ansatz für qsort(a, b), gleichzeitig Korrektheitsbetrachtung: +0. Trivialitätstest: Wenn $a \leq b$, ist nichts zu tun. (Oder: Wenn b − a < n 0 : Insertionsort(a, b).) +1. Teile: (Hier "partitioniere“) Wähle Pivotelement x ∈ {A[a].key,...,A[b].key}. + Arrangiere die Einträge von A[a..b] so um, dass für ein p mit a ≤ p ≤ b gilt: + A[p].key = x und A[a].key, . . . , A[p − 1].key ≤ x < A[p + 1].key, . . . , A[b].key. +2. Rekursion auf Teilinstanzen x 1 = A[a..p − 1] und x 2 = A[p + 1..b]: + qsort(a, p − 1); r qsort(p + 1, b). + Nach I.V. gilt nun: A[a..p − 1], A[p + 1..b] sortiert. +3. Kombiniere: Es ist nichts zu tun: A[a..b] ist sortiert. + +- "Clever Quicksort“: Das Pivotelement x ist der Median der drei Schlüssel A[a].key, A[b].key, A[a + b(b − a)/2c].key +- "Randomisiertes Quicksort“: Wähle einen der b − a + 1 Einträge in A[a..b] zufällig. +- Allgemein: Wähle ein s mit a ≤ s ≤ b, vertausche A[a] mit A[s]. Das Pivotelement ist danach immer A[a].key. + +```cpp +function qsort(a, b) // Rekursive Prozedur im Quicksort-Algorithmus, 1 ≤ a ≤ n + 1, 0 ≤ b ≤ n. + if a < b then + s = ein Element von {a, . . . , b}; // Es gibt verschiedene Methoden, um s zu wählen; + vertausche A[a] und A[s]; + partition(a, b, p); // p: Ausgabeparameter + qsort(a, p − 1); + qsort(p + 1, b); + +function partition(a, b, p) // Voraussetzung: a < b; Pivotelement: A[a] + x = A[a].key; + i = a + 1; + j = b; + while i ≤ j do // noch nicht fertig; Hauptschleife + while i ≤ j and A[i].key ≤ x do ++i; + while j > i and A[j].key > x do --j; + if i = j then --j; // Wissen: A[i].key > x + if i < j then + vertausche A[i] und A[j]; + ++i; --j; + if a < j then vertausche A[a] und A[j]; + p = j; // Rückgabewert +``` + + +## 6.3. Heapsort +Heap-Ordnung in Binärbäumen + +Min-Heapsort: Ein Binärbaum T mit Knotenbeschriftungen m(v) aus (U, <) heißt min-heapgeordnet (kurz oft: heapgeordnet), wenn für alle Knoten v und w gilt: v Vorgänger von w ⇒ m(v) ≤ m(w). ⇒ in Knoten v steht der minimale Eintrag des Teilbaums $T_v$ mit Wurzel v. +T heißt max-heapgeordnet, wenn für alle v , w gilt: v Vorgänger von w ⇒ m(v) ≥ m(w). + +Ein "linksvollständiger“ Binärbaum: Alle Levels j = 0, 1, . . . voll (jeweils 2 j Knoten) bis auf das tiefste. Das tiefste Level l hat von links her gesehen eine ununterbrochene Folge von Knoten. + +(Unendlicher) vollständiger Binärbaum (mit Kunstwurzel), Kante zu linkem/rechtem Kind mit 0/1 beschriftet, Knoten gemäß Leveldurchlauf-Anordnung nummeriert. Beispiel: $(101110)_2 = 46$. Damit können linksvollständige Binärbaume ohne Zeiger als Arrays dargestellt werden: +Speichere Eintrag zu Knoten Nummer i im Baum in A[i]. +Dennoch können wir leicht zu Kindern und Vorgängern navigieren: +- Knoten 1 ist die Wurzel; +- Knoten 2i ist linkes Kind von i; +- Knoten 2i + 1 ist rechtes Kind von i; +- Knoten i ≥ 2 hat Vorgänger $\lfloor i/2 \rfloor$. + +Min-Heap: $A[\lfloor i/2 \rfloor ].key ≤ A[i].key$, für 1 < i ≤ k (analog Max-Heap) + +### 6.3.1. Heap reparieren +Heaps reparieren nach austausch von Knoten/Werten: +```cpp +function bubbleDown (1, k) // Heap-Reparatur in A[ 1 . . k ]. Vorbedingung: Höchstens A[ 1 ] ist zu groß + j = 1; // aktueller Knoten“ + done = (2 · j > k); + while not done do // (∗) höchstens A[j] ist zu groß, A[j] hat Kind A[ 2 · j] im Baum + m = 2 · j; + if m + 1 ≤ k and A[m+1].key < A[m].key + then m = m + 1 ; // nun gilt: A[m] ist einziges oder "kleineres“ Kind von A[j] + if A[m].key < A[j].key + then vertausche A[j] mit A[m]; + j = m; // neuer aktueller Knoten + done = (2 · j > k) ; // wenn done = false, gilt wieder (∗) + else done = true. // fertig, kein Fehler mehr. +``` + +### 6.3.2. Heap sortieren +Die Idee von Heapsort für ein Array A[1..n] ist nun folgende: +1. (Heapaufbau) Arrangiere A[1..n] so um, dass ein Heap entsteht. +2. (Auswahlphase) Für k von n abwärts bis 2: + Entnimm kleinsten Eintrag A[1] aus dem Heap A[1..k]. Stelle mit den in A[2..k] verbliebenen Einträgen in A[1..k − 1] wieder einen Heap her. + (In A[k] ist dann Platz für den entnommenen Eintrag.) + +```cpp +function HeapSelect(1, n) + for k from n downto 2 do // in A[1] steht das Minimum von A[1..k] + vertausche A[1] mit A[k]; // in A[1..k − 1] ist höchstens A[1] zu groß + bubbleDown(1, k − 1); // Heapreparatur +``` +Die Prozedur HeapSelect(1, n) führt höchstens 2n log n Vergleiche durch und hat Rechenzeit O(n log n). + +### 6.3.3. Heap aufbauen +Idee: Betrachte im linksvollständigen Baum mit n Knoten die Teilbäume $T_l$ mit Wurzel l, und stelle in diesen "von unten nach oben“, also in der Reihenfolge $l = n, n − 1, . . . , 3, 2, 1$, die Heapbedingung her. + +Also löst die folgende Variante von bubbleDown (s.o.) die Aufgabe (mit j=l als Startbedingung). +```cpp +function makeHeap(1, n) // Transformiert Array A[1 . . n] in einen Heap + for ell from $\lfloor$ n/2 $\rfloor$ downto 1 do + bubbleDown(ell, n); +``` +Ein Aufruf makeHeap(1, n) wandelt A[1..n] in einen Heap um. Die Anzahl der Vergleiche ist nicht größer als 2n; die Rechenzeit ist $O(n)$. + +#### 6.3.3.1. HeapSort +Der Aufruf HeapSort(A[1 . . n]) sortiert A[1 . . n] in fallende Reihenfolge. Die gesamte Rechenzeit ist O(n log n), die Gesamtzahl der Vergleiche ist kleiner als 2n(log n + 1). HeapSort arbeitet in situ/in-place (ist aber nicht stabil). +```cpp +function HeapSort(A[1 . . n]) + makeHeap(1, n); + HeapSelect(1, n); +``` + +## 6.4. Datentyp: Prioritätswarteschlange (oder Vorrangwarteschlangen) +In einer Prioritätswarteschlange werden Objekte aufbewahrt, die mit einem Schlüssel aus einem totalgeordneten Universum (U, <) versehen sind. (Oft sind die Schlüssel Zahlen.) Objekte werden eingefügt und entnommen. Einfügungen sind beliebig möglich. Beim Entnehmen wird immer ein Eintrag mit minimalem Schlüssel gewählt. Idee: Schlüssel entsprechen hier "Prioritäten“ – je kleiner der Schlüssel, desto höher die Priorität. Wähle stets einen Eintrag mit höchster Priorität! Der Datentyp Prioritätswarteschlage ist mit Heaps effizient zu realisieren. + +Datentyp: SimplePriorityQueue (Einfache Prioritätswarteschlange) +1. Signatur: + - Sorten: + - Keys + - Data + - PrioQ // "Priority Queues“ + - Boolean + - Operatoren: + - empty : → PrioQ + - isempty : PrioQ → Boolean + - insert : PrioQ × Keys × Data → PrioQ + -extractMin: PrioQ → PrioQ × Keys × Data +2. Mathematisches Modell + - Sorten: + - Keys: (U, <) //totalgeordnetes Universum + - Data: D // Menge von "Datensätzen" + - Boolean: {false, true} + - PrioQ: die Menge aller endlichen Multimengen (Elemente dürfen mehrfach vorkommen) P ⊆ U × D + - Operationen: + - empty ( ) = ∅ // die leere Multimenge + - isemtpy(P) = true, für P = ∅; false, für $P \not= ∅$ + - insert(P, x, d) = P ∪ {(x, d)} (als Multimenge), + - extractMin(P) = undefiniert, wenn P = ∅; (P' , x_0 , d_0 ), wenn P \not= ∅ + +extractMin: Implementierung von extractMin(P): Ein Eintrag mit minimalem Schlüssel steht in der Wurzel, d. h. in Arrayposition 1. +Zeitaufwand: $O(log(n))$, wobei n die aktuelle Größe des Heaps ist. +```cpp +function extractMin() +// Entnehmen eines minimalen Eintrags aus Priority-Queue +// Ausgangspunkt: Pegelstand n (in n), A[1 . . n] ist Heap, n ≥ 1 + if n = 0 + then Fehlerbehandlung“; + x = A[1].key; + d = A[1].data; + A[1] = A[n]; + n--; + if n > 1 then bubbleDown(1, n); + return (x, d); +``` + +Für Fehlerbehandlung z.B. bubbleUp um Heap zu reparieren +```cpp +function bubbleUp(i) // Heapreparatur ab A[i] nach oben + j = i; + h = $\lfloor$ j/2 $\rfloor$ ; + while h ≥ 1 and A[h].key > A[j].key do + vertausche A[j] mit A[h]; + j = h; + h = $\lfloor$ j/2 $\rfloor$. +``` + +Überlaufbehandlung +```cpp +function insert(x, d) // Einfügen eines neuen Eintrags in Priority-Queue +// Ausgangspunkt: Pegel n enthält n, A[1 . . n] ist Heap. + if n = m + then "Überlaufbehandlung"; // z. B. Verdopplung + n++; + A[n] ← (x, d); + bubbleUp(n) +``` + +Allgemeinere Operation: "decreaseKey" ersetzt einen beliebigen Schlüssel im Heap (Position i) durch einen kleineren. Mit bubbleUp(i) wird die Heapeigenschaft wieder hergestellt. +```cpp +function decreaseKey(x, i) +// Erniedrigen des Schlüssels an Arrayposition i auf x + if A[i].key < x + then Fehlerbehandlung + A[i].key = x; + bubbleUp(i) +``` + +Dabei erfordern empty und isempty (und das Ermitteln des kleinsten Eintrags) konstante Zeit, und insert, extractMin und decreaseKey benötigen jeweils Zeit O(log n). Dabei ist n jeweils der aktuelle Pegelstand, also die Anzahl der Einträge in der Prioritätswarteschlange. + + +### 6.4.1. Technisches Problem, noch zu klären: +Wie soll man der Datenstruktur "mitteilen“, welches Objekt gemeint ist, wenn decreaseKey auf einen Eintrag angewendet werden soll? +Erweiterung der Datenstruktur: Objekt (x, d) erhält bei Ausführung von insert (x, d) eine eindeutige und unveränderliche "Identität“ p zugeteilt, über die dieses Objekt angesprochen werden kann. (Damit können sogar verschiedene Kopien ein und desselben Datensatzes unterschieden werden!) + +Datentyp: PriorityQueue (Prioritätswarteschlange) +1. Signatur: + - Sorten: + - Keys + - Data + - Id // "Identitäten“ + - PrioQ + - Boolean + - Operationen: + - empty : → PrioQ + - isempty : PrioQ → Boolean + - insert: PrioQ × Keys × Data → PrioQ × Id + - extractMin: PrioQ → PrioQ × Id × Keys × Data + - decreaseKey : PrioQ × Id × Keys → PrioQ +2. Mathematisches Modell + - Sorten: + - Keys: (U, <) // totalgeordnetes Universum“ + - Data: D // Menge von Datensätzen“ + - Id: N = {0, 1, 2, . . .} // unendliche Menge möglicher Identitäten“ + - Boolean: {false, true} + - PrioQ: die Menge aller Funktionen f : X → U × D, wobei X = Def (f ) ⊆ N endlich ist + - Operationen: + - empty () = ∅ // die leere Funktion + - isempty(f) = true, für f = ∅; false, für f \not = ∅ + - insert(x, d, f ) = (f ∪ {(p, (x, d))}, p), für ein p ∈ N − Def(f ) + - extractMin(f) = undefiniert, für f = ∅; (f 0 , p 0 , x 0 , d 0 ), für f \not= ∅ + - decreaseKey(p,x) = (f − {(p, (y, d))}) ∪ {(p, (x, d))}, falls f (p) = (y, d) mit x ≤ y (sonst Fehler) + +## 6.5. Untere Schranke für Sortieren +Ein Sortieralgorithmus A heißt ein Schlüsselvergleichsverfahren, wenn in A auf Schlüssel x, y aus U nur Operationen: +$x dfs num(w). + +```cpp +function dfs (v) // "volle“ Tiefensuche in v , nur für v neu erlaubt + dfs count++; + dfs num[ v ] ← dfs count; + status[ v ] ← aktiv ; + dfs-visit (v) ; // Aktion an v bei Entdeckung für jeden Nachfolger w von v (Adjazenzliste!) tue: + 1. Fall: status[w] = neu: T ← T ∪ {(v, w )} ; dfs ( w ) ; + 2. Fall: status[w] = aktiv: B ← B ∪ {(v, w )} ; + 3. Fall: status[w] = fertig ∧ dfs num[ v ] < dfs num[w]: F ← F ∪ {(v, w )} ; + 4. Fall: status[w] = fertig ∧ dfs num[ v ] > dfs num[w]: C ← C ∪ {(v, w )} ; + f count++; + f num[ v ] ← f count; + fin-visit (v) ; // Aktion an v bei Abschluss + status[ v ] ← fertig . +``` + +Initialisierung: dfs count ← 0; f count ← 0. +Alle Knoten sind neu ; Mengen T , B, F , C sind leer. +Tiefensuche von $v_0$ aus ("dfs(v 0 )“) entdeckt $R_{v_0}$ . + +Tiefensuche für den ganzen Graphen: DFS(G) wie vorher, nur mit der voll ausgebauten dfs-Prozedur, und der Initialisierung von f count und T , B, F , C. +```cpp +function DFS (G) // Tiefensuche in G = (V, E) , voll ausgebaut + dfs count ← 0 ; + f count ← 0 ; + T ← ∅; B ← ∅; F ← ∅; C ← ∅; + for v from 1 to n do status[v] ← neu ; + for v from 1 to n do + if status[v] = neu then + dfs ( v ) ; // starte (volle) Tiefensuche von v aus +``` + +- Beobachtung 1: Jede Kante (v, w) wird genau einmal betrachtet und daher genau in eine der Mengen T , B, F und C eingeordnet. +- Beobachtung 2: Die dfs-Nummern entsprechen einem Präorder-Durchlauf, die f-Nummern einem Postorder-Durchlauf durch die Bäume des Tiefensuch-Waldes. +- Beobachtung 3: Folgende Aussagen sind äquivalent: + - dfs(w) beginnt nach dfs(v) und endet vor dfs(v) (d.h. dfs (w) wird (direkt oder indirekt) von dfs (v) aus aufgerufen); + - dfs num[v] < dfs num[w] ∧ f num[v] > f num[w]; + - v ist Vorfahr von w im Tiefensuch-Wald. + + +## 8.3. Tiefensuche in ungerichteten Graphen +Einfacher als Tiefensuche in gerichteten Graphen. +Zweck: +- Zusammenhangskomponenten finden +- Spannbaum für jede Zusammenhangskomponente finden +- Kreisfreiheitstest + +```cpp +function udfs(v) // Tiefensuche von v aus, rekursiv; nur für v mit status[v] = neu aufrufen + dfs count++; + dfs num[v] ← dfs count; + dfs-visit(v); // Aktion an v bei Erstbesuch + status[v] ← aktiv ; + für jede neue“ Kante (v, w) (Adjazenzliste!) tue: + setze Gegenkante (w, v) auf gesehen“ ; + 1. Fall: status[w] = neu : T ← T ∪ {(v, w)}; udfs(w); + 2. Fall: status[w] = aktiv: B ← B ∪ {(v, w)}; + f count++; + f num[v] ← f count; + fin-visit(v); // Aktion an v bei letztem Besuch + status[v] ← fertig. + +//Globale Tiefensuche in (ungerichtetem) Graphen G: +function UDFS(G) // Tiefensuche in G = (V, E) + dfs_count ← 0; + f_count ← 0; + for v from 1 to n do status[v] ← neu ; + T ← ∅; B ← ∅; + for v from 1 to n do + if status[v] = neu then + udfs(v); // starte Tiefensuche von v aus +``` + +$udfs(v_0)$ werde aufgerufen. Dann gilt: +- $udfs(v_0)$ entdeckt genau die Knoten in der Zusammenhangskomponente von $v_0$ +- Die Kanten (v, w), für die udfs(w) unmittelbar aus udfs(v) aufgerufen wird, bilden einen gerichteten Baum mit Wurzel v 0 ("Tiefensuchbaum") +- (Satz vom weißen Weg) u ist im DFS-Baum ein Nachfahr von v genau dann wenn zum Zeitpunkt des Aufrufs udfs(v) ein Weg von v nach u existiert, der nur neue (weiße) Knoten enthält. + +$UDFS(G)$ werde aufgerufen. Dann gilt: +- Die T -Kanten bilden eine Reihe von Bäumen (die Tiefensuch-Bäume). Die Knotenmengen dieser Bäume sind die Zusammenhangskomponenten von G. +- Die Wurzeln der Bäume sind die jeweils ersten Knoten einer Zusammenhangskomponente in der Reihenfolge, die in Zeile (2) benutzt wird. + +Gesamtrechenzeit: $O(|V | + |E|)$: linear! + +Kreisfreiheitstest in Graphen und Finden eines Kreises, wenn es einen gibt: +Nach Ausführung von UDFS(G) gilt: $B \not= ∅ ⇔ G$ enthält einen Kreis. + +## 8.4. Kreisfreiheitstest und topologische Sortierung +- Ein Kantenzug $(v_0 , v_1 , . . . , v_k )$ in einem Digraphen G heißt ein Kreis oder Zyklus, wenn k ≥ 1 und $v_0 = v_k$ . +- Ein Kreis $(v_0 , v_1 , . . . , v_{k−1} , v_0 )$ heißt einfach, wenn $v_0 , . . . , v_{k−1}$ verschieden sind. + +- Ein Digraph G heißt kreisfrei oder azyklisch, wenn es in G keinen Kreis gibt, sonst heißt G zyklisch. +- Azyklische gerichtete Graphen: "Directed Acyclic Graphs", daher DAGs. + +## 8.5. Starke Zusammenhangskomponenten in Digraphen +Zwei Knoten v und w in einem Digraphen G heißen äquivalent, wenn $v \rightarrow w$ und $w \rightarrow v$ gilt. – Notation: $v \leftrightarrow w$. + +Die Äquivalenzklassen zur Relation $\leftrightarrow$ heißen starke Zusammenhangskomponenten von G. + +- Trick 1: Führe DFS im "Umkehrgraphen“ $G^R$ durch, der durch Umkehren aller Kanten in G entsteht. + - Beobachtung: G R hat dieselben starken Zusammenhangskomponenten wie G. +- Trick 2: Verwende die f-Nummern einer ersten DFS in G, um zu bestimmen, in welcher Reihenfolge die Knoten in der Hauptschleife der zweiten DFS (in $G^R$ ) betrachtet werden. + +Strong Components(G) (von S. R. Kosaraju, 1978) +- Eingabe: Digraph G = (V, E) +- Ausgabe: Starke Zusammenhangskomponenten von G +- (1) Berechne die f-Nummern mittels DFS(G); +- (2) Bilde "Umkehrgraphen“ $G^R$ durch Umkehren aller Kanten in G; +- (3) Führe $DFS(G^R)$ durch; Knotenreihenfolge: f-Nummern aus (1) absteigend +- (4) Ausgabe: Die Knotenmengen der Tiefensuchbäume aus (3) . + + +# 9. Divide-and-Conquer-Algorithmen +## 9.1. Multiplikation ganzer Zahlen +Algorithmus Karatsuba(x, y)\ +Eingabe: Zwei n-Bit-Zahlen x und y, nichtnegativ +```cpp +if n ≤ n 0 + then return SM(x, y) // Schulmethode +else + k ← dn/2e; + zerlege x = A · 2 k + B und y = C · 2 k + D; + E ← A − B und F ← C − D; // auf dn/2e Bits aufgefüllt + G ← Karatsuba(A, C); // Rekursion + H ← Karatsuba(B, D); // Rekursion + I ← Karatsuba(|E|, |F |); // Rekursion + return G · 2 2k + (G + H − sign(E) · sign(F ) · I) · 2 k + H +``` +## 9.2. Matrixmultiplikation +Eingabe: Zwei $n × n$-Matrizen A und B. +- Falls $n ≤ n_0$ : Berechne $A · B$ mit der direkten Methode. Kosten $n^3_0$ Multiplikationen. +- Falls $n > n_0$ , zerlege A, B in jeweils 4 quadratische $(n\ 2) ×(n\ 2)$-Teilmatrizen +$A=(\frac{C | D}{E | F}); B=(\frac{G | H}{K | L}); A*B=(\frac{C*G+D*K| C*H+D*L}{E*G+F*K| E*H+F*L})$ +$\rightarrow$ Einfache Analyse ergibt: Dies führt zu $n^3$ Multiplikationen in R, kein Gewinn. + +Mit "Straßentrick": 7 Multiplikationen genügen +- $P_1 = C · (H − L) $ +- $P_5 = (C + F ) · (G + L)$ +- $P_2 = (C + D) · L $ +- $P_6 = (D − F ) · (K + L)$ +- $P_3 = (E + F ) · G $ +- $P_7 = (C − E) · (G + H)$ +- $P_4 = F · (K − G)$ +Dann: +$A x B = (\frac{P_5 + P_4 − P_2 + P_6 | P_1 + P_2}{ P_3 + P_4 | P_1 + P_5 − P_3 − P_7})$ + +## 9.3. Master Theorem +"Rekursionsbaum“: Veranschaulicht Kostenaufteilung +Wenn v ein Knoten auf Level i ist, dann gilt: $B(n/b_i ) ≤$ Summe der Einträge im Unterbaum unter v. + +Es gelte $B(n) ≤ \begin{} g, falls n = 1; \ a · B(n/b) + f (n) , sonst, \end{}$ +für ganzzahlige konstante $b > 1$ und $a > 0$. Dann gilt für $n = b^l$: +1. Fall: $f (n) = O(n^α )$ mit $α < log_b a$. Dann: $B(n) = O(n*log_b a )$ +2. Fall: $f (n) = O(n^α )$ mit $α = log_b a$. Dann: $B(n) = O(n*log_b a * log n)$ +3. Fall: $f (n) = Ω(n^α )$ mit $α > log_b a$ und $f(n/b) ≤ \frac{c}{a} * f (n)$, für c < 1 konstant. + Dann gilt $B(n) = O(f (n))$. + +## 9.4. Das Selektionsproblem +Gegeben ist eine Folge $(a_1 , . . . , a_n )$ von n Objekten aus einer totalen Ordnung $(D, <)$ (in Array oder als Liste), sowie eine Zahl $k, 1 ≤ k ≤ n$. +Aufgabe: Finde das Element x der Folge, das Rang k hat, d. h. das Objekt x in der Liste mit $|{i | a_i < x}| < k ≤ |{i | a_i ≤ x}|$. + +```cpp +Prozedur rqSelect(a, b, k) +// Rekursive Prozedur im Quickselect-Algorithmus, 1 ≤ a ≤ b ≤ n , a ≤ k ≤ b . +// Vorbedingung: Alle Einträge vom Rang < a [ > b ] links [rechts] von A[ a..b ] +// Nachbedingung: Eintrag vom Rang k in A[ k ], kleinere links, größere rechts davon. + if a = b (= k) then return; + s ← ein zufälliges Element von {a, . . . , b}; + if (a < s) then vertausche A[a] und A[s]; + partition(a, b, p); // wie bei rqsort + if k = p then return; + if k < p then rqSelect(a, p − 1, k) + else rqSelect(p + 1, b, k). +``` + + +# 10. Greedy-Algorithmen: Prinzipien +Greedy-Algorithmen sind anwendbar bei Konstruktionsaufgaben, deren Ziel es ist, eine optimale Struktur zu finden, die aus mehreren Komponenten besteht. Sie finden eine Lösung, die sie schrittweise aufbauen. +In jedem Schritt wird eine "lokal“ oder aus der aktuellen Sicht optimale Entscheidung getroffen, ohne "an die Zukunft zu denken“. +(Was dies konkret bedeutet, versteht man besser anhand der später betrachteten Beispiele.) +Es werden dabei nicht mehr Teillösungen konstruiert als unbedingt nötig. +Es werden nie Entscheidungen korrigiert oder zurückgesetzt. + +## 10.1. Beispiel 1: Hörsaalbelegung +Gegeben: Veranstaltungsort (Hörsaal), Zeitspanne $[T_0 , T_1 )$ (z. B. 7 Uhr bis 21 Uhr) und eine Menge von n Aktionen (Vorlesungen oder ähnliches), die durch Start- und Endzeit spezifiziert sind: $[s_i , f_i )$ mit $T_0 ≤ s_i < t_i ≤ T_1$ , für $1 ≤ i ≤ n$. + +Gesucht: Belegung des Hörsaals, die möglichst viele Ereignisse mit disjunkten Zeitspannen stattfinden lässt. +$ A ⊆ {1, . . . , n}$ heißt zulässig, wenn alle $[s_i , f_i ), i ∈ A$, disjunkt sind. + +Trick: Bearbeite Ereignisse in der Reihenfolge wachsender Schlusszeiten. O.B.d.A.: Veranstaltungen nach Schlusszeiten aufsteigend sortiert (Zeitaufwand $O(n log n)$ ) , also: $f_1 ≤ f_2 ≤ · · · ≤ f_n$ +Wiederhole: Wähle die wählbare Aktion mit der kleinsten Schlusszeit und füge sie zum Belegungsplan hinzu. Eine Aktion ist wählbar, wenn ihre Startzeit mindestens so groß wie die Schlusszeit der letzten schon geplanten Veranstaltung ist. + +Algorithmus Greedy Scheduling (GS) +Eingabe: Reelle Zahlen $T_0 < T_1$ , Paare $(s_1 , t_1 ), . . . , (s_n , f_n )$, mit $T_0 ≤ s_i < f_i ≤ T_1$ für $1 ≤ i ≤ n$ +Ausgabe: Maximal großes $A ⊆ {1, . . . , n}$ mit $[s_i , f_i ), i ∈ A§, disjunkt +```cpp +Sortiere Paare // gemäß $f_1 , . . . , f_n$ , nummeriere um, so dass $f_1 ≤ · · · ≤ f_n$ ; +A ← {1}; +f_last ← f_1 ; +for i from 2 to n do + if s_i ≥ f_last then // [s i , f i ) wählbar + A ← A ∪ {i}; + f_last ← f_i ; +return A +``` + +## 10.2. Beispiel 2: Fraktionales ("teilbares") Rucksackproblem +Veranschaulichung: Ein Dieb stiehlt Säckchen mit Edelmetallkrümeln (Gold, Silber, Platin) und Edelsteinen. Er hat einen Rucksack mit Volumen b dabei. Durch teilweises Ausleeren der Säckchen kann er beliebige Teilvolumina herstellen. Der Wert pro Volumeneinheit ist unterschiedlich für unterschiedliche Materialien. Was soll er in seinen Rucksack mit Volumen b packen, um den Wert der Beute zu maximieren? + +Dazu: Benenne den Bruchteil $λ_i ∈ [0, 1]$, den er von Säckchen i mitnehmen soll. +Gegeben: ( n Objekte mit:) + - Volumina $a_1 , . . . , a_n > 0$, + - Nutzenwerte $c_1 , . . . , c_n > 0$, + - Volumenschranke b +Gesucht: + - Vektor $(λ_1 , . . . , λ_n ) ∈ [0, 1]^n$ , so dass $λ_1 a_1 + . . . + λ_n a_n ≤ b$ ("zulässig") und $λ_1 c_1 + . . . + λ_n c_n$ maximal. +Kern der Lösungsidee: + - Berechne "Nutzendichten“: $d_i=\frac{c_i}{a_i}, 1 \leq i \leq n$, + - und sortiere die Objekte gemäß $d_i$ fallend. + - Nehme von vorne beginnend möglichst viele ganze Objekte, bis schließlich das letzte Objekt teilweise genommen wird, so dass die Volumenschranke vollständig ausgeschöpft wird. + +```cpp +function Greedy_Fractional_Knapsack() //(GFKS) + for i from 1 to n do + d_i = c_i /a_i ; + λ_i = 0; + Sortiere Objekte gemäß d i fallend; + i = 0; + r = b; // Inhalt r ist das verfügbare Rest-Volumen + while r > 0 do + i++; + if a_i ≤ r + then λ_i = 1; r = r − a_i ; + else λ_i = r/a_i ; + r = 0; +``` +Der Algorithmus GFKS ist korrekt (liefert eine zulässige Lösung mit maximalem Gesamtnutzen) und hat Rechenzeit $O(n log n)$. + +Charakteristika der Greedy-Methode: +1. Der erste Schritt der Greedy-Lösung ist nicht falsch. Es gibt eine optimale Lösung, die als Fortsetzung des ersten Schrittes konstruiert werden kann. +2. "Prinzip der optimalen Substruktur“: Kombiniert man das Ergebnis des ersten "Greedy-Schritts“ mit einer beliebigen optimalen Lösung für die reduzierte Instanz (Wegnehmen des Teils, der durch den ersten Schritt erledigt ist), dann ergibt sich eine optimale Lösung für die Originaleingabe. +3. Der Algorithmus löst das verbleibende Teilproblem rekursiv (oder mit einem zur Rekursion äquivalenten iterativen Verfahren). + +## 10.3. Huffman-Codes +Gegeben: Alphabet A mit $2 ≤ |A| < ∞$ und "Wahrscheinlichkeiten“ oder relativen Häufigkeiten“ $p(a) ∈ [0, 1]$ für jedes $a ∈ A$. +Also: $\sum_{a \in A} p(a) = 1$ + +Gesucht: ein "guter" binärer Präfixcode für (A, p) +Definition Präfixcode: Jedem $a ∈ A$ ist "binärer Code“ $c(a) ∈ {0, 1}^∗$ (Menge aller Binärstrings) zugeordnet, mit Eigenschaft Präfixfreiheit: Für $a, b ∈ A, a \not= b$ ist $c(a)$ kein Präfix von $c(b)$. + + +Kompakte Repräsentation des Codes als Binärbaum. Blätter sind mit Buchstaben markiert; Weg von der Wurzel zum Blatt gibt das +Codewort wieder (links: 0, rechts: 1). + +Decodierung: Laufe Weg im Baum, vom Codewort gesteuert, bis zum Blatt. +Wiederhole mit dem Restwort, bis nichts mehr übrig ist. +Präfixeigenschaft ⇒ keine Zwischenräume nötig. + +1. Idee: Mache alle Codewörter $c(a)$ gleich lang. Am besten ist dann eine Länge von $\lceil log_2 |A| \rceil$ Bits. ⇒ $c(a_1 . . . a_m)$ hat Länge $\lceil log 2 |A| \rceil · m$. +2. Idee: Einsparmöglichkeit: Häufige Buchstaben mit kürzeren Wörtern codieren als seltenere Buchstaben. Ein erster Ansatz zur Datenkompression (platzsparendes Speichern, zeitsparendes Übermitteln)! Hier: verlustfreie Kompression“ – Information ist unverändert vorhanden + +Ein Codierungsbaum für A ist ein Binärbaum T , in dem +- die Kante in einem inneren Knoten zum linken bzw. rechten Kind (implizit) mit 0 bzw. 1 markiert ist +- jedem Buchstaben $a ∈ A$ ein Blatt (externer Knoten) von T exklusiv zugeordnet ist. +- Der Code $c_T (a)$ für a ist die Kanteninschrift auf dem Weg von der Wurzel zum Blatt mit Inschrift a. +- Die Kosten von T unter p sind definiert als: $B(T, p) = \sum_{a \in A} p(a) · d_T (a)$, $a∈A$ wobei $d_T (a) = |c_T (a)|$ die Tiefe des a-Blatts in T ist. +- Ein Codierungsbaum T für A heißt optimal oder redundanzminimal für p, wenn für alle Codierungsbäume $T_0$ für A gilt: $B(T, p) ≤ B(T_0 , p)$. + +Aufgabe: Gegeben (A, p), finde einen optimalen Baum. Methode: "Greedy“ +Es seien $a, a_0$ zwei Buchstaben mit $p(a) ≤ p(a_0 ) ≤ p(b)$ für alle $b ∈ A − {a, a_0 }$. ($a , a_0$ sind zwei "seltenste“ Buchstaben.) Dann gibt es einen optimalen Baum, in dem die Blätter für $a$ und $a_0$ "Geschwister“ sind, also Kinder desselben inneren Knotens. + +Damit ist der erste Schritt zur Realisierung eines Greedy-Ansatzes getan! +Man beginnt den Algorithmus mit "Mache die beiden seltensten Buchstaben zu Geschwistern“. Dann ist sicher, dass dies stets zu einer optimalen Lösung ausgebaut werden kann. Dann werden diese beiden Buchstaben "zusammengeklebt“, so dass man ein Alphabet erhält, das eine um 1 kleinere Größe hat. Konzeptuell wendet man dann Rekursion an. + +Huffman-Algorithmus (rekursiv): +Wir bauen "bottom-up“ einen Baum auf. +- Wenn |A| = 1: Baum hat nur einen (externen) Knoten. (Code für den einen Buchstaben ist das leere Wort. Seltsam, aber als Rekursionsbasis geeignet.) Die Kosten sind 0. (Optimalität ist klar.) +- Wenn |A| > 1, werden zwei "seltenste“ Buchstaben a, a 0 aus A zu benachbarten Blättern gemacht. + +Man könnte nach dem angegebenen Muster eine rekursive Prozedur programmieren. +- PQ: Datenstruktur Prioritätswarteschlange, + - Einträge: Buchstaben und Kunstbuchstaben; + - Schlüssel: die Gewichte p(b), b (Kunst-)Buchstabe. +- Operationen: + - PQ.insert: Einfügen eines neuen Eintrags; + - PQ.extractMin: Entnehmen des Eintrags mit kleinstem Schlüssel. + - Beide Operationen benötigen logarithmische Zeit (s. Kap. 6). + - Anfangs in PQ: Buchstaben a ∈ A mit Gewichten p(a) als Schlüssel. + - Ermitteln und Entfernen der beiden seltensten“ Buchstaben a, a 0 durch zwei Aufrufe ”PQ.extractMin"; + - Einfügen des neuen Kunstbuchstabens b durch PQ.insert(b). +- Resultierende Rechenzeit: $O(n log n)$, für $|A| = n$. + + + +Iterative Implementierung mit ein paar Tricks wird viel effizienter. + +Algorithmus Huffman($p[ 1 .. n ]$) +Input: Gewichts-/Wahrscheinlichkeitsvektor $p[ 1 .. n ]$, sortiert: $p [1] ≤ · · · ≤ p [n]$. +Output: Optimaler Baum T , dargestellt als $pred[1..2n − 2]$ und $mark[1..2n − 2]$ +```cpp +Erweitere den Vektor p[ 1 .. n ] auf Länge 2n − 1 ; +pred[1] ← n + 1; +pred[2] ← n + 1; +mark[1] ← 0; +mark[2] ← 1; +p[n + 1] ← p[1] + p[2] ; +k ← 3 // erster nicht verarbeiteter Knoten in [ 1..n ] +h ← n + 1 // erster nicht verarbeiteter Knoten in [ n + 1..2n − 2 ] +for b from n + 2 to 2n − 1 do // Die folgenden beiden Zeilen finden, in i und j, die Positionen der beiden noch nicht verarbeiteten Buchstaben mit kleinsten Gewichten + if k ≤ n and p[k] ≤ p[h] + then i ← k; + k++ + else + i ← h; + h++; + if k ≤ n and (h = b or p[k] ≤ p[h]) + then j ← k; + k++ + else + j ← h; + h++; + pred[i] ← b; + pred[j] ← b; + mark[i] ← 0 ; + mark[j] ← 1 ; + p[b] ← p[i] + p[j]; +``` +Ausgabe: $pred[ 1 .. 2n − 2 ]$ und $mark[ 1 .. 2n − 2 ]$. + +Aus $pred[1..2n−2]$ und $mark[1..2n−2]$ baut man den optimalen Huffman-Baum wie folgt: +Alloziere ein Array leaf[1..n] mit Blattknoten-Objekten +und ein Array inner[n + 1..2n − 1] mit Objekten für innere Knoten. +```cpp +for i from 1 to n do + leaf[i].letter ← Buchstabe a_i + if mark[i] = 0 + then inner[pred[i]].left ← leaf[i] + else inner[pred[i]].right ← leaf[i] +for i from (n + 1) to (2n − 2) do + if mark[i] = 0 + then inner[pred[i]].left ← inner[i] + else inner[pred[i]].right ← inner[i] +return inner[ 2n − 1 ] // Wurzelknoten +``` +Der Algorithmus Huffman ist korrekt und hat Laufzeit $O(n log n)$, wenn n die Anzahl der Buchstaben des Alphabets A bezeichnet. + +# 11. Greedy-Algorithmen für Graphprobleme +## 11.1. Kürzeste Wege mit einem Startknoten: Der Algorithmus von Dijkstra +1. Ein gewichteter Digraph $G = (V,E, c)$ besteht aus einem Digraphen $(V,E)$ und einer Funktion $c: E \rightarrow \R$, die jeder Kante $(v,w)$ einen Wert $c(v,w)$ zuordnet. +2. Ein gerichteter Kantenzug $p=(v_0, v_1,...,v_k)$ in G hat Kosten/länge/Gewicht $c(p)=\sum_{1\leq i \leq k} c(v_{i-1}, v_i)$ +3. Der (gerichtete) Abstand von $v,w \in V$ ist $d(v,w) :=$ min{c(p) | p Kantenzug von v nach w} + ($=\infty$ , falls kein Kantenzug von v nach w existiert; $=-\infty$, falls es von v nach w Kantenzüge mit beliebig stark negativen Kosten gibt.) + +Hier betrachten wir einen Algorithmus für das Problem "Single-Source-Shortest-Paths (SSSP) (Kürzeste Wege von einem Startknoten aus). +Gegeben: Gewichteter Digraph $G = (V, E, c)$ mit Kantenkosten $c(v, w) ≥ 0$ und $s ∈ V$ . +Gesucht: Für jedes $v ∈ V$ der Abstand $d(s, v)$ und im Fall $d(s, v) < \infty$ ein Weg von s nach v +der Länge $d(s, v)$. +$\rightarrow$ Der Algorithmus von Dijkstra löst dieses Problem. + +Algorithmus Dijkstra-Distanzen(G, s) +Eingabe: gewichteter Digraph $G = (V, E, c)$, Startknoten $s ∈ V$ +Ausgabe: Länge der kürzesten Wege von s zu den Knoten in G +```cpp +S = ∅; +dist[s] = 0; +for w ∈ V − {s} + do dist[w] = ∞; +while ∃u ∈ V − S: dist[u] < ∞ do // "Runde" + u = ein solcher Knoten u mit minimalem dist[u]; + S = S ∪ {u}; + for w mit (u, w) ∈ E und w $\not ∈$ S do // Nachfolger von u, nicht bearbeitet + dist[w] = min{dist[w], dist[u] + c(u, w)}; +Ausgabe: das Array dist[1..n]. +``` +Der Algorithmus Dijkstra-Distanzen gibt in $dist[v]$ für alle $v ∈ V$ den Wert $d(s, v) aus. + +Wir wollen aber eigentlich nicht nur die Distanzen $d(s, v)$, sondern kürzeste Wege berechnen. +Idee: Für jeden Knoten v merken wir uns, über welche Kante $(u, v)$ Knoten $v$ erreicht wurde. + +Algorithmus Dijkstra(G, s) +Eingabe: gewichteter Digraph $G = (V, E, c)$, Startknoten $s ∈ V$ +Ausgabe: Länge $d(s, v)$ der kürzesten Wege, Vorgängerknoten $p(v)$ +```cpp +S = ∅; +dist[s] = 0; +p[s] = −2; +for w ∈ V − {s} + do dist[w] = ∞; p[w] = −1; +while ∃u ∈ V − S: dist[u] < ∞ do + u = ein solcher Knoten u mit minimalem dist[u]; + S = S ∪ {u}; + for (u, w) ∈ E mit w $\not ∈$ S do // Nachfolger von u, nicht bearbeitet: update ( u , w ) + dd = dist[u] + c(u, w); + if dd < dist[w] then + dist[w] = dd; + p[w] = u; +Ausgabe: dist[1..n] und p[1..n]. +``` + +Nach dem Algorithmus ist klar, dass $p[v]\not = −1$ ("undefiniert“) genau dann gilt, wenn $dist[v] < \infty$. +Ein (einfacher) Weg $(s = v_0 , v_1 , . . . , v_t )$ in G heißt ein S-Weg, wenn alle Knoten außer eventuell $v_t$ in S liegen. + +Ergebnis: +Wenn der Algorithmus von Dijkstra anhält, führen die $p[v]$-Verweise von jedem Knoten v aus entlang eines kürzesten Weges (zurück) zu s. Da die $p[v]$-Verweise keinen Kreis bilden können (mit dem Schritt $S ← S ∪ {u}$ wird der Verweis vom neuen S-Knoten u auf den S-Knoten $p[u]$ endgültig fixiert), bilden die Kanten ($p[v], v$) einen Baum, den sogenannten Baum der kürzesten Wege. + +Implementierungsdetails: +Noch zu klären: Wie findet man effizient einen Knoten u mit kleinstem Wert dist[u]? +Verwalte die Knoten $w ∈ V −S$ mit Werten $dist[w] < ∞$ mit den $dist[w]$-Werten als Schlüssel in einer Prioritätswarteschlange PQ. Wenn $dist[w] = ∞$, ist $w$ (noch) nicht in PQ. $extractMin$ liefert den nächsten Knoten u, der zu S hinzugefügt werden soll. + +Dijkstra(G, s) // (Vollversion mit Prioritätswarteschlange) +Eingabe: gewichteter Digraph $G = (V, E, c) , V = {1, . . . , n}$ , Startknoten s ; +Ausgabe: Länge $d(s, v)$ der kürzesten Wege, Vorgängerknoten p(v) +Hilfsdatenstrukturen: PQ: eine (anfangs leere) Prioritäts-WS; inS, p, dist: s.o. +```cpp +for w from 1 to n do + dist[w] = ∞; + inS[w] = false; + p[w] = −1; +dist[s] = 0; +p[s] = −2; +PQ.insert(s); +while not PQ.isempty do + u = PQ.extractMin; + inS[u] = true; // u wird bearbeitet + for Knoten w mit (u, w) ∈ E and not inS[w] do + dd = dist[u] + c(u, w); + if p[w] ≥ 0 and dd < dist[w] then + PQ.decreaseKey(w,dd); + p[w] = u; + dist[w] = dd; + if p[w] = −1 then // w wird soeben entdeckt + dist[w] = dd; + p[w] = u; + PQ.insert(w); +Ausgabe: dist[1..n] und p[1..n]. +``` + +Aufwandsanalyse: +Die Prioritätswarteschlange realisieren wir als (binären) Heap. +Maximale Anzahl von Einträgen: n. +Initialisierung: Zeit $O(1)$ für PQ, $O(n)$ für den Rest. +Es gibt maximal $n$ Durchläufe durch die while-Schleife mit Organisationsaufwand jeweils $O(1)$, zusammen also Kosten $O(n)$ für die Schleifenorganisation. +In Schleifendurchlauf Nummer t, in dem $u_t$ bearbeitet wird: PQ.extractMin kostet Zeit $O(log n)$. +Durchmustern der $deg(u_t )$ Nachbarn von $u_t$: Jedes $PQ.insert$ oder $PQ.decreaseKey$ kostet Zeit $O(log n)$. + +Der Algorithmus von Dijkstra mit Verwendung einer Prioritätswarteschlange, die als Binärheap realisiert ist, ermittelt kürzeste Wege von Startknoten s aus in einem Digraphen $G = (V, E, c)$ in Zeit $O((n + m) log\ n)$. +Wobei $n = |V |$ (Knotenzahl), $m = |E|$ (Kantenzahl). + +Resultierende Rechenzeit für Algorithmus von Dijkstra: $O(m + n\ log\ n)$. +Lineare Rechenzeit für Graphen mit $m = Ω(n log n)$ Kanten. + +## 11.2. Minimale Spannbäume: Der Algorithmus von Jarnı́k +Prim +Ein Graph G heißt ein freier Baum (oder nur Baum), wenn er zusammenhängend und kreisfrei ist. Kreisfreie Graphen heißen auch (freie) Wälder. + +Wenn $G = (V, E)$ ein Graph mit n Knoten und m Kanten ist, dann sind folgende Aussagen äquivalent: +1. G ist ein Baum. +2. G ist kreisfrei und $m ≥ n − 1$. +3. G ist zusammenhängend und $m ≤ n − 1$. +4. Zu jedem Paar u, v von Knoten gibt es genau einen einfachen Weg von u nach v . +4. G ist kreisfrei, aber das Hinzufügen einer beliebigen weiteren Kante erzeugt einen Kreis (G ist maximal "kreisfrei“). +5. G ist zusammenhängend, aber das Entfernen einer beliebigen Kante erzeugt einen nicht zusammenhängenden Restgraphen ( G ist minimal "zusammenhängend“). + +Aus dem Fundamental-Lemma für Bäume folgt, für einen Baum G mit n Knoten: +1. G hat $n − 1$-Kanten. +2. Wenn man zu G eine Kante $(u, w)$ hinzufügt, entsteht genau ein Kreis (aus $(u, w)$ und dem eindeutigen Weg von u nach w in G). +3. Wenn man aus G eine Kante (u, w) streicht, zerfällt der Graph in 2 Komponenten (U und W) + +Es sei $G = (V, E)$ ein zusammenhängender Graph. Eine Menge $T ⊆ E$ von Kanten heißt ein Spannbaum für G, wenn $(V, T )$ ein Baum ist. + +Es sei $G = (V, E, c)$ ein gewichteter Graph, d.h. $c: E → R$ ist eine "Gewichtsfunktion“ oder "Kostenfunktion“. + +Jeder Kantenmenge E ⊆ E wird durch $c(E'):= \sum_{e \in E'} c(e)$ ein Gesamtgewicht zugeordnet. Sei G zusammenhängend. Ein Spannbaum $T ⊆ E$ für G heißt ein minimaler Spannbaum, wenn er minimale Kosten unter allen Spannbäumen hat, d. h. wenn $c(t) = min{c(T') | $ T' Spannbaum für G}. Abkürzung : MST ("Minimum Spanning Tree“). + +## 11.3. Algorithmus von Jarnı́k/Prim: +S: Menge von Knoten. Enthält die bisher "erreichten“ Knoten. +R: Menge von Kanten. Enthält die bisher "gewählten“ Kanten. +1. Wähle einen beliebigen (Start-)Knoten $s ∈ V$ . $S ← {s}; R ← ∅;$ +2. Wiederhole $(n − 1)$-mal: Wähle eine billigste Kante $(v, u)$, die ein $v ∈ S$ mit einem $u ∈ V − S$ verbindet, d.h. finde $v ∈ S$ und $u ∈ V − S$, so dass $c(v, u)$ minimal unter allen Werten $c(v', u'), v' ∈ S, u' ∈ V − S$, ist. + $S ← S ∪ {u};$ + $R ← R ∪ {(v, u)};$ +3. Ausgabe: R. + +### 11.3.1. Schnitteigenschaft +Für den Korrektheitsbeweis des Algorithmus von Jarnı́k/Prim: "Cut property“ – Schnitteigenschaft. Eine Partition $(S, V − S)$ von V mit $∅ = S \not= V$ heißt ein Schnitt. +Eine Menge $R ⊆ E$ heißt erweiterbar (zu einem MST), wenn es einen MST T mit $R ⊆ T$ gibt. + +Sei $R ⊆ E$ erweiterbar und sei $(S, V − S)$ ein Schnitt, so dass es keine R-Kante von S nach V − S gibt, und sei $e = (v, w), v ∈ S, w ∈ V −S$ eine Kante, die den Wert $c((v', w')), v' ∈ S, w'∈ V − S$, minimiert; Dann ist auch $R ∪ {e}$ erweiterbar. + +### 11.3.2. Implementierungsdetails im Algorithmus von Jarnı́k/Prim: +Wir nehmen an, dass $G = (V, E, c)$ mit $V = {1, . . . , n}$ in Adjazenzlistendarstellung gegeben ist. Die Kantengewichte $c(e)$ stehen in den Adjazenzlisten bei den Kanten. Für jeden Knoten $w ∈ V − S$ wollen wir immer wissen: +1. die Länge der billigsten Kante $(v, w) , v ∈ S,$ falls es eine gibt: in $dist[ w ]$ ("Abstand von S“), für Array $dist[ 1..n ]$. +2. den (einen) Knoten $p(w) ∈ S$ mit $c(p(w), w) = dist[ w ]$, falls ein solcher existiert: in $p[ w ]$ ("Vorgänger in S“), für Array $p[ 1..n ]$. + +Solange es von S keine Kante nach w gibt, gilt $dist[ w ] = ∞$ und $p[ w ] = − 1$ . +Verwalte die Knoten $w ∈ V − S$ mit Werten $dist[ w ] < ∞$ mit den $dist[ w ]$-Werten als Schlüssel in einer Prioritätswarteschlange PQ. Wenn $dist[ w ] = ∞$ , ist w (noch) nicht in der PQ. + +Eingabe: gewichteter Graph $G = (V, E, c) , V = {1, . . . , n}$ , Startknoten $s ∈ V$ (ist beliebig); +Ausgabe: Ein MST für G. +Hilfsstrukturen: PQ: eine (anfangs leere) Prioritäts-WS; inS, p: wie oben +```cpp +for w from 1 to n do + dist[w] ← ∞ ; inS[w] ← false; p[w] ← −1 ; +dist[ s ] ← 0 ; p[ s ] ← −2 ; PQ.insert( s ); +while not PQ.isempty do + u ← PQ.extractMin; inS[u] ← true; + for Knoten w mit ( u , w ) ∈ E and not inS[w] do + dd ← c( u , w ) ; // einziger Unterschied zu Dijkstra! + if p[w] ≥ 0 and dd < dist[w] then + PQ.decreaseKey(w,dd); p[w] ← u; dist[w] ← dd; + if p[w] = −1 then // w vorher nicht zu S benachbart + dist[w] ← dd; p[w] ← u; PQ.insert(w); +Ausgabe: T = {(w, p[ w ] ) | inS[ w ] = true , w 6 = s} . // Menge der gewählten Kanten +``` +Der Algorithmus von Jarnı́k/Prim mit Verwendung einer Prioritätswarteschlange, die als Binärheap realisiert ist, ermittelt einen minimalen Spannbaum für $G = (V, E, c)$ in Zeit $O((n + m) log\ n)$. + +## 11.4. Algorithmus von Kruskal +Starte mit $R = ∅$. Dann folgen $n − 1$ Runden. In jeder Runde: +Wähle eine Kante $e ∈ E − R$ von kleinstem Gewicht, die mit $(V, R)$ keinen Kreis schließt, und füge e zu R hinzu. + +Eine offensichtlich korrekte Methode, dies zu organisieren: Durchmustere Kanten in aufsteigender Reihenfolge des Kantengewichts, und nimm eine Kante genau dann in R auf, wenn sie mit R keinen Kreis bildet. + +## 11.5. Hilfsstruktur: Union-Find +Union-Find-Datenstrukturen dienen als Hilfsstruktur für verschiedene Algorithmen, insbesondere für den Algorithmus von Kruskal. Zwischenkonfiguration im Algorithmus von Kruskal: Menge $R i−1 ⊆ E$, die Wald bilden, und Folge $e_i , . . . , e_m$ von noch zu verarbeitenden Kanten. + +Ansatz: Repräsentiere die Knotenmengen, die den Zusammenhangskomponenten von $(V, R)$ entsprechen, in einer Datenstruktur. +Es soll schnell zu ermitteln sein, ob zwei Knoten in derselben Komponente/Menge liegen. Wenn wir einen Schritt des Kruskal-Algorithmus ausführen, bei dem eine Kante akzeptiert, also in R aufgenommen wird, müssen wir zwei der disjunkten Mengen vereinigen. + +Eine Partition (In der Mathematik heißt die gesamte Aufteilung Partition, die Teile Klassen) von ${1, 2, . . . , n}$ ist eine Zerlegung in Mengen (hier: Klassen“) ${1, 2, . . . , n} = S_1 ∪ S_2 ∪ · · · ∪ S_l$, wobei $S_1 , S_2 , . . . , S_l$ disjunkt sind. + +Operationen: +- $init(n)$: Erzeugt zu $n ≥ 1$ die diskrete Partition“ mit den n einelementigen Klassen ${1}, {2}, . . . , {n}$, also $K_i = {i}$. +- $find(i)$: Gibt zu $i ∈ {1, . . . , n}$ den Namen $r(i)$ der Klasse $K_{r(i)}$ aus, in der sich i (gegenwärtig) befindet. +- $union(s, t)$: Die Argumente s und t müssen Repräsentanten verschiedener Klassen $K_s$ bzw. $K_t$ sein. Die Operation ersetzt in der Partition $K_s$ und $K_t$ durch die Vereinigung $K_s ∪ K_t$. Als Repräsentant von $K_s ∪ K_t$ kann ein beliebiges Element verwendet werden. (Meistens: s oder t.) + +Algorithmus von Kruskal mit Union-Find +Input: Gewichteter zusammenhängender Graph $G = (V, E, c)$ mit $V = {1, . . . , n}$. +1. Schritt: Sortiere Kanten $e_1 , . . . , e_m$ nach Gewichten $c_1 = c(e_1), . . . , c_m = c(e_m )$ aufsteigend. Resultat: Kantenliste $(v_1 , w_1 , c_1 ), . . . , (v_m , w_m , c_m ), c_1 ≤ · · · ≤ c_m$. +2. Schritt: Initialisiere Union-Find-Struktur für ${1, . . . , n}$. +3. Schritt: Für $i = 1, 2, . . . , m$ tue folgendes: + - $s = find(v_i )$;$ t ← find(w_i )$; + - $if s \not= t$ then begin $R ← R ∪ {e_i}$; $union(s, t)$ end; + - // Optional: Beende Schleife, wenn $|R| = n − 1$. +4. Schritt: Die Ausgabe ist R. + +1. Der Algorithmus von Kruskal in der Implementierung mit Union-Find ist korrekt. +2. Die Rechenzeit des Algorithmus ist $O(m\ log\ n)$, wenn man die Union-Find-Datenstruktur mit Arrays implementiert. +3. Die Rechenzeit des Algorithmus ist $O(m\ log\ n)$, wenn man die Union-Find-Datenstruktur mit mit wurzelgerichteten Bäumen (mit Pfadkompression) implementiert. + +```cpp +Prozedur init(n) // Initialisierung einer Union-Find-Struktur +Erzeuge r, size, next: Arrays der Länge n für int-Einträge +for i from 1 to n do + r[i] = i; + size[i] = 1; + next[i] = 0. +``` +Zeitaufwand: $Θ(n)$. + +```cpp +Prozedur find(i) + return r[i] +``` +Zeitaufwand: $O(1)$ + +```cpp +Prozedur union(s, t) +// Ausgangspunkt: s, t sind verschiedene Repräsentanten +if size[s] > size[t] then vertausche s, t; // nun: size[s] ≤ size[t] + z = s; + r[z] = t; + while next[z] 6 = 0 do // durchlaufe L_s , setzt r-Werte um + z = next[z]; + r[z] = t; + // nun: z enthält letztes Element von L s ; next[z] = 0 + // L s nach dem ersten Eintrag in L t einhängen: +next[z] = next[t]; next[t] = s; +size[t] = size[t] + size[s]. +``` +Aufwand: $O$(Länge der kürzeren der Listen $L_s , L_t$ ) . + +In der Implementierung der Union-Find-Struktur mit Arrays hat jede find-Operation Rechenzeit $O(1), n − 1$ union-Operationen haben Rechenzeit $O(n\ log\ n)$. + +Union-find Prozedur mit Baumimplementierung +```cpp +j = i ; +jj = p[j]; +while jj != j do //verfolge Vorgängerzeiger bis zur Wurzel + j ← jj; + jj ← p[j] ; +return j +``` +Ein $find(i)$ für jedes $i ∈ {1, . . . , n}$ führt zu Gesamtkosten $Θ(n^2)$! + +## 11.6. Pfadkompression +Eine interessante Variante der Union-Find-Datenstruktur, die mit einem wurzelgerichteten Wald implementiert ist, ist der Ansatz der "Pfadkompression“ (oder Pfadverkürzung). Bei einem $find(i)$ muss man den ganzen Weg von Knoten i zu seiner Wurzel $r(i)$ ablaufen; Aufwand $O(depth(i))$. +Ein gutes strategisches Ziel ist also, diese Wege möglichst kurz zu halten. +Idee: Man investiert bei $find(i)$ etwas mehr Arbeit, jedoch immer noch im Rahmen $O(depth(i))$, um dabei einige Wege zu verkürzen und damit spätere finds billiger zu machen. +Jeder Knoten $i = i_0 , i_1 , . . . , i_{d−1}$ auf dem Weg von i zur Wurzel $i_d = r(i)$ wird direkt als Kind an die Wurzel gehängt. Kosten pro Knoten/Ebene: $O(1)$, insgesamt also $O(depth(i))$. + +```cpp +Prozedur find (i) // Pfadkompressions-Version + j = i ; + // verfolge Vorgängerzeiger bis zur Wurzel r(i) : + jj = p[j]; + while jj != j do + j = jj; + jj = p[j] ; + r = j; // r enthält nun Wurzel r(i) + // Erneuter Lauf zur Wurzel, Vorgängerzeiger umhängen: + j = i ; + jj = p[j]; + while jj != j do + p[j] = r; + j = jj; + jj = p[j]; + return r +``` + +# 12. Dynamische Programmierung +Algorithmenparadigma für Optimierungsprobleme. Typische Schritte: +- Definiere (viele) "Teilprobleme" (einer Instanz) +- Identifiziere einfache Basisfälle +- Formuliere eine Version der Eigenschaft: **Substrukturen optimaler Strukturen sind optimal** +- Finde Rekursionsgleichungen für Werte optimaler Lösungen: **Bellmansche Optimalitätsgleichungen** +- Berechne optimale Werte (und Strukturen) iterativ. + +## 12.1. Das All-Pairs-Shortest-Paths-Problem +Das "APSP-Problem" ist zentrales Beispiel für die Strategie "Dynamische Programmierung“. +Kürzeste Wege zwischen allen Paaren von Knoten. + +Der im Folgenden beschriebene Algorithmus von Floyd–Warshall kann auch mit negativen Kantengewichten umgehen. + +Es gibt keine Kreise mit (strikt) negativer Gesamtlänge, d.h. $v=v_0,v_1,...,v_r \Rightarrow \sum_{1\leq s \leq r} c(v_{s-1}, v_s) \leq 0$ +1. Wenn p Kantenzug von v nach w ist, dann existiert auch ein (einfacher) Weg $p_0$ von v nach w mit $c(p_0 ) ≤ c(p)$. +2. Wenn es einen Kantenzug von v nach w gibt, dann auch einen mit minimaler Länge (einen kürzesten Weg“). + +Für Digraphen $G = (V, E, c)$ definieren wir: $S(v, w) :=$ die Länge eines kürzesten Weges von v nach w. + +Bellmansche Optimalitätsgleichungen\ +Knoten k kommt im Inneren von p entweder einmal oder gar nicht vor. +- Falls k in p nicht vorkommt, ist p kürzester $(k − 1)$-Weg von v nach w +- Falls k im Inneren von p vorkommt, zerfällt p in zwei Teile die beide kürzeste $(k − 1)$-Wege sind. +Die Bellmanschen Optimalitätsgleichungen für den Algorithmus von Floyd-Warshall lauten dann: + $S(v,w,k) = min{S(v,w,k-1), S(v,k,k-1)+ S(k,w,k-1)}$, für $1 \leq v, w\leq n, 1 \leq k \leq n$ +```cpp +S[v,v,0] = 0; +S[v,w,0] = c(v, w); +for k from 1 to n do + for v from 1 to n do + for w from 1 to n do + S[v,w,k] = min{ S[v,w,k-1] , S[v,k,k-1] + S[k,w,k-1] } +``` + +Algorithmus Floyd-Warshall(C[ 1 .. n , 1 .. n ]) +Eingabe: C[ 1 .. n , 1 .. n ]: Matrix der Kantenkosten/-längen c(v, w) in R ∪ {+∞} +Ausgabe: S[ 1 .. n , 1 .. n ]: Kosten S(v, w) eines kürzesten v - w -Weges +I[ 1 .. n , 1 .. n ]: minimaler maximaler Knoten auf einem kürzesten v - w -Weg +```cpp +for v from 1 to n do + for w from 1 to n do + if v = w then S[v,v] ← 0 ; I[v,v] ← 0 + else S[v,w] ← C[v,w]; + if S[v,w] < ∞ then I[v,w] ← 0 else I[v,w] ← −1 ; +for k from 1 to n do + for v from 1 to n do + for w from 1 to n do + if S[v,k] + S[k,w] < S[v,w] then + S[v,w] ← S[v,k] + S[k,w]; I[v,w] ← k; +``` +Ausgabe: S[ 1 .. n , 1 .. n ] und I[ 1 .. n , 1 .. n ]. +Der Algorithmus von Floyd-Warshall löst das All-Pairs-Shortest-Paths-Problem in Rechenzeit $O(n^3)$ und Speicherplatz $O(n^2 )$. +Das Ergebnis ist eine Datenstruktur der Größe $O(n^2 )$, mit der sich zum Argument $(v, w)$ mit Algorithmus printPath ein kürzester Weg von v nach w in Zeit $O$(#(Kanten auf dem Weg)) ausgeben lässt. + +## 12.2. Der Bellman–Ford-Algorithmus +Zweck: Kürzeste Wege von einem Startknoten s aus in gewichtetem Digraphen $(V, E, c)$. (SSSP: "Single Source Shortest Paths“). Anders als beim Algorithmus von Dijkstra sind negative Kantenkosten zugelassen. + +Grundoperation, schon aus dem Dijkstra-Algorithmus bekannt: +```cpp +update(u, v) // für (u, v) ∈ E + if dist[u] + c(u, v) < dist[v] then + p[v] ← u; + dist[v] ← dist[u] + c(u, v) ; +``` + +Algorithmus Bellman-Ford( $((V, E, c), s)$ ) +Eingabe: $(V, E, c)$ : Digraph mit Kantengewichten in $R , s ∈ V$: Startknoten +Ausgabe: Wenn G keine Kreise mit negativem Gewicht hat: + - In $dist[ v ]$: Abstand $d(s, v)$; + - In $p[ 1 .. n ]$: Baum von kürzesten Wegen (wie bei Dijkstra); +```cpp +Initialisierung: + for v from 1 to n do + dist[v] ← ∞ ; p[v] ← −1 ; + dist[ s ] ← 0 ; p[ s ] ← −2 ; // wird nie geändert, wenn kein negativer Kreis existiert +Hauptschleife: + for i from 1 to n − 1 do // heißt nur: wiederhole (n − 1) -mal + forall (u, v) ∈ E do update (u, v) ; // beliebige Reihenfolge +Zyklentest: + forall (u, v) ∈ E do + if dist[ u ] + c(u, v) < dist[ v ] then return "negativer Kreis"; +Ergebnis: + return dist[ 1 .. n ], p[ 1 .. n ] +``` + +Der Bellman-Ford-Algorithmus hat folgendes Verhalten: +1. Wenn es keinen von s aus erreichbaren Kreis mit negativer Gesamtlänge gibt ("negativer Kreis"), steht am Ende des Algorithmus in dist[v] die Länge eines kürzesten Weges von s nach v, und die Kanten $(p[w], w)$ (mit p[w] > 0) bilden einen Baum der kürzesten Wege von s aus zu den erreichbaren Knoten. +2. Der Algorithmus gibt "negativer Kreis“ aus genau dann wenn es einen von s aus erreichbaren negativen Kreis gibt. +3. Die Rechenzeit ist $O(nm)$ + +## 12.3. Editierdistanz +Problemstellung: Sei A ein Alphabet. (Bsp.: Lat. Alphabet, ASCII-Alphabet, { A,C,G,T } .) +Wenn $x = a_1 . . . a_m ∈ A$ und $y = b_1 . . . b_n ∈ A$ zwei Zeichenreihen über A sind, möchte man herausfinden, wie ähnlich (oder unähnlich) sie sind. Wie können wir Ähnlichkeit“ messen? +Wir definieren Elementarschritte (Editier-Operationen), die einen String verändern: +- Lösche einen Buchstaben aus einem String: Aus uav wird uv ($u, v ∈ A, a ∈ A$). + Beispiel: Haut → Hut. +- Füge einen Buchstaben in einen String ein: Aus uv wird uav ($u, v ∈ A , a ∈ A$). + Beispiel: Hut → Haut. +- Ersetze einen Buchstaben: Aus uav wird ubv ($u, v ∈ A, a, b ∈ A$). + Beispiel: Haut → Hast. +Der "Abstand" oder die Editierdistanz $d(x, y)$ von x und y ist die minimale Anzahl von Editieroperationen, die benötigt werden, um x in y zu transformieren. + +Man schreibt Strings aus Buchstaben und dem Sonderzeichen - untereinander, wobei die beiden Zeilen jeweils das Wort x bzw. y ergeben, wenn man die -’s ignoriert. Die Kosten einer solchen Anordnung: Die Anzahl der Positionen, an denen die oberen und unteren Einträge nicht übereinstimmen. Die Kosten, die eine solche Anordnung erzeugt, sind gleich der Anzahl der Editierschritte in einer Transformation. + + +Das Problem "Editierdistanz" wird folgendermaßen beschrieben: +Input: Strings $x = a_1 . . . a_m , y = b_1 . . . b_n$ aus A. +Aufgabe: Berechne $d(x, y)$ (und eine Editierfolge, die x in y transformiert). +Ansatz: Dynamische Programmierung +Unser Beispiel: x = Exponentiell und y = Polynomiell. +1. Schritt: Relevante Teilprobleme identifizieren! Betrachte Präfixe $x[1..i] = a_1 . . . a_i$ und $y[1..j] = b_1 . . . b_j$ , und setze $E(i,j):=d(x[1...i],y[1...j])$, für $0\leq i \leq m, 0\leq j \leq n$ + +Die Zahlen E(i, j) berechnen wir iterativ, indem wir sie in eine Matrix $E[0..m,0..n]$ eintragen. Dies liefert den DP-Algorithmus für die Editierdistanz. +Initialisierung: +$$E[i,0] = i, für i = 0, . . . , m$$ +$$E[0,j] = j, für j = 0, . . . , n$$ +Dann füllen wir die Matrix (z. B.) zeilenweise aus, genau nach den Bellmanschen +Optimalitätsgleichungen: +```cpp +for i from 1 to m do + for j from 1 to n do + E[i,j] = min{E[i-1,j-1] + diff(a_i, b_j), E[i-1,j] + 1, E[i,j-1] + 1}; +return E[m,n] +``` +Rechenzeit: $O(m * n)$ + +## 12.4. Optimale Matrizenmultiplikation +Multiplikation von zwei Matrizen über einem Ring R: Gegeben $A_1$ und $A_2$ berechne Product $C:= A_1*A_2$ +Standardmethode benötigt $r_0 r_1 r_2$ R-Multiplikationen, $r_0(r_1 − 1)r_2) R-Additionen. Gesamtrechenzeit: $Θ(r_0 r_1 r_2 )$. + +Die Matrizenmultiplikation ist assoziativ. Gesucht wird eine ("optimale") Klammerung, die bei der Berechnung von $A_1 ·· · ··A_k$ die Gesamtkosten (= Anzahl aller R-Multiplikationen) minimiert. + +Optimale Klammerung für $A_i · · · A_j$ ist $(A_i · · · A_l)(A_{l+1} · · · A_j )$, wobei die Klammerungen in den beiden Teilen optimal sein müssen. "Bellmansche Optimalitätsgleichungen“: +$$c(r_{i-1},...,r_j)= min{c(r_{i-1,...,r_l}) +c(r_l,...,r_j) +r_{i-1}r_l r_j | i \leq l < j }$$ + +MatrixOptimal($(r_0, . . . , r_k )$) +Eingabe: Dimensionsvektor $(r_0, . . . , r_k )$ +Ausgabe: Kosten $c(r_0 , . . . , r_k )$ bei der optimalen Klammerung $l[1 .. k , 1 .. k ]$: Plan zur Ermittlung der optimalen Unterteilung; +Datenstruktur: Matrizen $C[ 1 .. k , 1 .. k ], l[ 1 .. k , 1 .. k ]$ +Ziel: + - $C[ i , j ]$ enthält $c(r_{i−1} , . . . , r_j )$ + - $l[ i , j ]$ enthält Index zur Unterteilung der Multiplikation bei $A_i · · · A_j$ +```cpp +for i from 1 to k + do C[i,i] = 0; +for i from 1 to k−1 + do C[i,i+1] = r_i − 1 * r_i * r_i + 1; +for d from 2 to k−1 do + for i from 1 to k − d do + bestimme das l, i ≤ l < i+d, das C=C[i,l]+ C[l+1,i+d] + r_{i-1}*r_l*r_{i+d} minimiert; + l[i,i+d] = dieses l; + C[i,i+d] = das minimale C; +Ausgabe: C[1..k, 1..k] und l[1..k, 1..k] +``` +Laufzeit: Die Minimumssuche in Zeilen (5)–(6) kostet Zeit $O(k)$; mit den geschachtelten Schleifen (3)–(8) und (4)–(8) ergibt sich eine Rechenzeit von $Θ(k^3)$. + + +# 13. Prüfung +Prüfungsstoff: Vorlesung + Übungsaufgaben. +Prüfungsklausur: 150 Minuten, 150 Punkte. +max. 15 Bonuspunkte über Zwischenklausur (40 Minuten) + +- [1. Vorbereitung](#1-vorbereitung) + - [1.1. O-Notation](#11-o-notation) + - [1.2. Spezifkationstechnik für Datentypen](#12-spezifkationstechnik-für-datentypen) + - [1.3. Implementierungen fundamentaler Datentypen](#13-implementierungen-fundamentaler-datentypen) + - [1.4. Auswahlkriterien für elementare Datenstrukturen kennen und anwenden](#14-auswahlkriterien-für-elementare-datenstrukturen-kennen-und-anwenden) + - [1.5. Kenntnis grundlegender Entwurfsstrategien](#15-kenntnis-grundlegender-entwurfsstrategien) + - [1.6. Kenntnis grundlegender Algorithmen und ihrer Eigenschaften](#16-kenntnis-grundlegender-algorithmen-und-ihrer-eigenschaften) + - [1.7. Auswahlkriterien für Algorithmen, insbesondere Ressourcenverbrauch, kennen und anwenden](#17-auswahlkriterien-für-algorithmen-insbesondere-ressourcenverbrauch-kennen-und-anwenden) + - [1.8. Standard-Analysemethoden für Ressourcenverbrauch (Rechenzeit, Speicherplatz)](#18-standard-analysemethoden-für-ressourcenverbrauch-rechenzeit-speicherplatz) + - [1.9. Korrektheitsbeweise für Algorithmen verstehen und darstellen](#19-korrektheitsbeweise-für-algorithmen-verstehen-und-darstellen) +- [2. Einführung und Grundlagen](#2-einführung-und-grundlagen) + - [2.1. Beispiel: Sortieren](#21-beispiel-sortieren) + - [2.1.1. Ist dieser Algorithmus Korrekt?](#211-ist-dieser-algorithmus-korrekt) + - [2.1.2. Wie lange dauern Berechnungen mit diesem Algorithmus?](#212-wie-lange-dauern-berechnungen-mit-diesem-algorithmus) + - [2.2. Was ist ein Algorithmus](#22-was-ist-ein-algorithmus) + - [2.2.1. Was ist mit nicht abbrechenden Berechnungen?](#221-was-ist-mit-nicht-abbrechenden-berechnungen) + - [2.3. Merkmale eines Algorithmus](#23-merkmale-eines-algorithmus) + - [2.4. Erweiterung des Algorithmusbegriffs](#24-erweiterung-des-algorithmusbegriffs) + - [2.4.0.1. Varianten](#2401-varianten) + - [2.4.0.2. Spezi kation des Sortierproblems](#2402-spezikation-des-sortierproblems) + - [2.4.0.3. Alternative Formulierung des Sortierproblems:](#2403-alternative-formulierung-des-sortierproblems) + - [2.4.0.4. Löst Insertionsort das Sortierproblem?](#2404-löst-insertionsort-das-sortierproblem) + - [2.4.1. Laufzeitanalysen](#241-laufzeitanalysen) + - [2.4.1.1. Kosten Rechenzeiten](#2411-kosten-rechenzeiten) + - [2.4.1.1.1. "Worst Case" Kosten allgemein](#24111-worst-case-kosten-allgemein) + - [2.4.1.1.2. "Best Case" Kosten allgemein](#24112-best-case-kosten-allgemein) + - [2.4.1.1.3. "Average Case" auf Insertionsort](#24113-average-case-auf-insertionsort) + - [2.4.1.1.4. "Average Case" Kosten allgemein](#24114-average-case-kosten-allgemein) + - [2.4.1.2. Analyse von Kosten/Rechenzeit](#2412-analyse-von-kostenrechenzeit) +- [3. Fundamentale Datentypen und Datenstrukturen](#3-fundamentale-datentypen-und-datenstrukturen) + - [3.1. Stacks und dynamische Arrays](#31-stacks-und-dynamische-arrays) + - [3.1.1. Spezi kation des Datentyps "Stack über D"](#311-spezikation-des-datentyps-stack-über-d) + - [3.1.1.1. Spezi kation des Datentyps (ADT) "Stack über D" - Alternative](#3111-spezikation-des-datentyps-adt-stack-über-d---alternative) + - [3.1.1.2. Implementierung von Stacks](#3112-implementierung-von-stacks) + - [3.1.1.2.1. Listenimplementierung von Stacks](#31121-listenimplementierung-von-stacks) + - [3.1.1.2.2. Arrayimplementierung von Stacks](#31122-arrayimplementierung-von-stacks) + - [3.1.1.2.3. Vergleich Listen-/Arrayimplementierung](#31123-vergleich-listen-arrayimplementierung) + - [3.1.1.3. Datentyp "Dynamische Arrays"](#3113-datentyp-dynamische-arrays) + - [3.2. Queues (Warteschlangen, FIFO-Listen)](#32-queues-warteschlangen-fifo-listen) + - [3.2.1. Spezifikation des Datentypes "Queue" über D](#321-spezifikation-des-datentypes-queue-über-d) + - [3.2.2. Implementierung von Queues](#322-implementierung-von-queues) + - [3.2.2.0.1. TODO](#32201-todo) +- [4. Binärbaume](#4-binärbaume) + - [4.1. Grundlagen](#41-grundlagen) + - [4.2. Definition](#42-definition) + - [4.3. Operationen](#43-operationen) + - [4.4. Terminologie](#44-terminologie) + - [4.5. TIPL und TEPL](#45-tipl-und-tepl) + - [4.5.1. Totale innere Weglänge (Total internal path length)](#451-totale-innere-weglänge-total-internal-path-length) + - [4.5.2. Totale äußere Weglänge (Total external path length)](#452-totale-äußere-weglänge-total-external-path-length) + - [4.6. Baumdurchläufe](#46-baumdurchläufe) + - [4.6.1. Inorder Durchlauf](#461-inorder-durchlauf) + - [4.6.2. Präorder Durchlauf](#462-präorder-durchlauf) + - [4.6.3. Postorder Durchlauf](#463-postorder-durchlauf) + - [4.6.4. Kombi Durchlauf](#464-kombi-durchlauf) + - [4.6.5. Zeitanalyse für Baumdurchlauf](#465-zeitanalyse-für-baumdurchlauf) +- [5. Hashverfahren](#5-hashverfahren) + - [5.1. Hashing mit Verketteten Listen](#51-hashing-mit-verketteten-listen) + - [5.1.1. Wir implementieren die Wörterbuchoperationen: Algorithmen](#511-wir-implementieren-die-wörterbuchoperationen-algorithmen) + - [5.1.2. Verdoppelungsstrategie](#512-verdoppelungsstrategie) + - [5.2. Hashfunktionen](#52-hashfunktionen) + - [5.2.1. Einfache Hashfunktionen](#521-einfache-hashfunktionen) + - [5.2.1.1. Fall: Schlüssel sind natürliche Zahlen: $U \subseteq \N$](#5211-fall-schlüssel-sind-natürliche-zahlen-eqmathsemanticsmrowmiumimomomi-mathvariantdouble-strucknmimrowannotation-encodingapplicationx-texu-subseteq-nannotationsemanticsmathuneq) + - [5.2.1.1.1. Divisionsrestmethode](#52111-divisionsrestmethode) + - [5.2.1.1.2. Diskrete Multiplikationsmethode](#52112-diskrete-multiplikationsmethode) + - [5.2.1.2. Fall: Schlüssel sind Strings/Wörter: $U \subseteq Seq(\sum)$](#5212-fall-schlüssel-sind-stringswörter-eqmathsemanticsmrowmiumimomomismimiemimiqmimo-stretchyfalsemomomomo-stretchyfalsemomrowannotation-encodingapplicationx-texu-subseteq-seqsumannotationsemanticsmathuseqeq) + - [5.2.1.2.1. Lineare Funktionen über Körper $\Z_p = [p] = {0,...,p-1}$](#52121-lineare-funktionen-über-körper-eqmathsemanticsmrowmsubmi-mathvariantdouble-struckzmimipmimsubmomomo-stretchyfalsemomipmimo-stretchyfalsemomomomrowmn0mnmo-separatortruemomi-mathvariantnormalmimi-mathvariantnormalmimi-mathvariantnormalmimo-separatortruemomipmimomomn1mnmrowmrowannotation-encodingapplicationx-texz_p--p--0p-1annotationsemanticsmathzpp0p1eq) + - [5.2.2. Anspruchsvolle Hashfunktionen](#522-anspruchsvolle-hashfunktionen) + - [5.3. Geschlossenes Hashing](#53-geschlossenes-hashing) + - [5.3.1. Lineares Sondieren](#531-lineares-sondieren) + - [5.3.2. Quadratisches Sondieren](#532-quadratisches-sondieren) + - [5.3.3. Doppel Hashing](#533-doppel-hashing) + - [5.3.4. Uniformes Sondieren / Ideales Hashing](#534-uniformes-sondieren--ideales-hashing) + - [5.4. Löschen](#54-löschen) + - [5.5. Cuckoo Hashing](#55-cuckoo-hashing) +- [6. Sortierverfahren](#6-sortierverfahren) + - [6.1. Mergesort](#61-mergesort) + - [6.2. Quicksort](#62-quicksort) + - [6.3. Heapsort](#63-heapsort) + - [6.3.1. Heap reparieren](#631-heap-reparieren) + - [6.3.2. Heap sortieren](#632-heap-sortieren) + - [6.3.3. Heap aufbauen](#633-heap-aufbauen) + - [6.3.3.1. HeapSort](#6331-heapsort) + - [6.4. Datentyp: Prioritätswarteschlange (oder Vorrangwarteschlangen)](#64-datentyp-prioritätswarteschlange-oder-vorrangwarteschlangen) + - [6.4.1. Technisches Problem, noch zu klären:](#641-technisches-problem-noch-zu-klären) + - [6.5. Untere Schranke für Sortieren](#65-untere-schranke-für-sortieren) + - [6.6. Sortieren in Linearzeit](#66-sortieren-in-linearzeit) + - [6.6.1. Countingsort – Sortieren durch Zählen](#661-countingsort--sortieren-durch-zählen) + - [6.6.2. Bucketsort – Fachsortieren](#662-bucketsort--fachsortieren) + - [6.6.3. Radixsort – Mehrphasen-Counting-/Bucketsort](#663-radixsort--mehrphasen-counting-bucketsort) +- [7. Graphen, Digraphen und Breitensuche](#7-graphen-digraphen-und-breitensuche) + - [7.1. Datenstrukturen für Digraphen und Graphen](#71-datenstrukturen-für-digraphen-und-graphen) + - [7.2. Breitensuche in Digraphen](#72-breitensuche-in-digraphen) + - [7.2.1. Breitensuche von einem Knoten $v_0$ aus:](#721-breitensuche-von-einem-knoten-eqmathsemanticsmrowmsubmivmimn0mnmsubmrowannotation-encodingapplicationx-texv_0annotationsemanticsmathv0eq-aus) + - [7.2.2. Globale Breitensuche in G](#722-globale-breitensuche-in-g) +- [8. Tiefensuche](#8-tiefensuche) + - [8.1. einfache Tiefensuche in Digraphen](#81-einfache-tiefensuche-in-digraphen) + - [8.2. Volle Tiefensuche in Digraphen](#82-volle-tiefensuche-in-digraphen) + - [8.3. Tiefensuche in ungerichteten Graphen](#83-tiefensuche-in-ungerichteten-graphen) + - [8.4. Kreisfreiheitstest und topologische Sortierung](#84-kreisfreiheitstest-und-topologische-sortierung) + - [8.5. Starke Zusammenhangskomponenten in Digraphen](#85-starke-zusammenhangskomponenten-in-digraphen) +- [9. Divide-and-Conquer-Algorithmen](#9-divide-and-conquer-algorithmen) + - [9.1. Multiplikation ganzer Zahlen](#91-multiplikation-ganzer-zahlen) + - [9.2. Matrixmultiplikation](#92-matrixmultiplikation) + - [9.3. Master Theorem](#93-master-theorem) + - [9.4. Das Selektionsproblem](#94-das-selektionsproblem) +- [10. Greedy-Algorithmen: Prinzipien](#10-greedy-algorithmen-prinzipien) + - [10.1. Beispiel 1: Hörsaalbelegung](#101-beispiel-1-hörsaalbelegung) + - [10.2. Beispiel 2: Fraktionales ("teilbares") Rucksackproblem](#102-beispiel-2-fraktionales-teilbares-rucksackproblem) + - [10.3. Huffman-Codes](#103-huffman-codes) +- [11. Greedy-Algorithmen für Graphprobleme](#11-greedy-algorithmen-für-graphprobleme) + - [11.1. Kürzeste Wege mit einem Startknoten: Der Algorithmus von Dijkstra](#111-kürzeste-wege-mit-einem-startknoten-der-algorithmus-von-dijkstra) + - [11.2. Minimale Spannbäume: Der Algorithmus von Jarnı́k +Prim](#112-minimale-spannbäume-der-algorithmus-von-jarnı́k-prim) + - [11.3. Algorithmus von Jarnı́k/Prim:](#113-algorithmus-von-jarnı́kprim) + - [11.3.1. Schnitteigenschaft](#1131-schnitteigenschaft) + - [11.3.2. Implementierungsdetails im Algorithmus von Jarnı́k/Prim:](#1132-implementierungsdetails-im-algorithmus-von-jarnı́kprim) + - [11.4. Algorithmus von Kruskal](#114-algorithmus-von-kruskal) + - [11.5. Hilfsstruktur: Union-Find](#115-hilfsstruktur-union-find) + - [11.6. Pfadkompression](#116-pfadkompression) +- [12. Dynamische Programmierung](#12-dynamische-programmierung) + - [12.1. Das All-Pairs-Shortest-Paths-Problem](#121-das-all-pairs-shortest-paths-problem) + - [12.2. Der Bellman–Ford-Algorithmus](#122-der-bellmanford-algorithmus) + - [12.3. Editierdistanz](#123-editierdistanz) + - [12.4. Optimale Matrizenmultiplikation](#124-optimale-matrizenmultiplikation) - [13. Prüfung](#13-prüfung) \ No newline at end of file diff --git a/Assets/Aktionspotential.svg b/Assets/Aktionspotential.svg index f48e11b..c579255 100644 --- a/Assets/Aktionspotential.svg +++ b/Assets/Aktionspotential.svg @@ -1,883 +1,883 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Precordial_Leads_2.svg b/Assets/Precordial_Leads_2.svg index e47906c..ead83d6 100644 --- a/Assets/Precordial_Leads_2.svg +++ b/Assets/Precordial_Leads_2.svg @@ -1,816 +1,816 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - V1 - - - - - V2 - - - - V4 - - - - V5 - - - - V6 - - - - V3 - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + V1 + + + + + V2 + + + + V4 + + + + V5 + + + + V6 + + + + V3 + + + + + + + + + diff --git a/Einführung in die Medizinische Informatik.md b/Einführung in die Medizinische Informatik.md index 4f643ad..9a43b51 100644 --- a/Einführung in die Medizinische Informatik.md +++ b/Einführung in die Medizinische Informatik.md @@ -1,1071 +1,1071 @@ ---- -title: Einführung in die medizinische Informatik -author: Robert Jeutter ---- -# Einleitung ->"Medizinische Informatik ist die Wissenschaft von Informationsverarbeitung und der Gestaltung informationsverarbeitender Systeme in der Medizin." - -Detaillierter: ->"Die Medizinische Informatik ist die Wissenschaft der systematischen Erschließung, Verwaltung, Aufbewahrung, Verarbeitung und Bereitstellung von Daten, Informationen und Wissen in der Medizin und im Gesundheitswesen. Sie ist von dem Streben geleitet, damit zur Gestaltung der bestmöglichen Gesundheitsversorgung beizutragen." (GMDS = Deutsche Gesellschaft für Medizinische Informatik, Biometrie und Epidemiologie) - -Damit die nötigen Daten und Informationen und das benötigte Wissen fachgerecht erfasst, aufbewahrt, abgerufen, verarbeitet und verteilt werden können, entwickeln, betreiben und evaluieren Medizinische Informatiker/innen Infrastrukturen, Informations-und Kommunikationssysteme einschließlich solcher für Medizintechnische Geräte. - -## Die Einsatzfelder medizinischer Informatik nach dem Prozess der Entscheidungsfindung in der Medizin: -- **Physiologische oder phatologische Zustände** => Messen - - Biosignalerfassung - - Bioelektrische und nicht elektrische Signale - - Physiologische Ursache dieser Signale - - Messverfahren, Ableitungen - - Anforderungen an Hard- und Software - - Bildgebung - - Bildgebenden Verfahren (Modalitäten) - - Indikationen zur Anwendung (Was kann womit gut erkannt werden?) -- **Signal/Bild** => Analyse - - Biosignalverarbeitung und Bildverarbeitung - - Vorverarbeitung, Signalkonditionierung - - Ereignisdetektion, Merkmalserkennung - - Klassifikation, Segmentierung - - Parameterextraktion, Kopplungsanalyse -- **Merkmale** => Entscheidung - - Expertendatenbanken - - Therapieplanung und Therapieüberwachung - - Bestrahlungsplanung - - Medikamentendosierung - - Leitlinien -- **Diagnose/Therapie** => Dokumentation - - Datenübertragung, Datenspeicherung, Dokumentation - - Übertragung von Aufträgen (HL7) - - Übertragung von Bildinformationen (DICOM) - - Datenmanagement im Gesundheitswesen - - Elektronische Patientenakte - - Elektronische Gesundheitskarte - - Krankenhausinformationssysteme - - OP-Planungssystem - - Laborinformationssystem - - Radiologie-Inf.-syst. (RIS) - - Patientenverwaltung - - Bettenplanung - - Personalverwaltung - - Telemedizin - - Home-Monitoring - - Tele-Chirugie - - Biostatistik -- **Kommunikation, Archivierung** - -## Motivation - - - 50% Arbeitszeit von Mediziner: Suche, Erfassung und Wiedergabe von Informationen - - 39% der Gesamtaufwendungen eines Krankenhauses für Informationsverarbeitung - - 20% der Arbeitszeit: für Suche nach früheren Informationen - - 10% der Laborergebnisse erreichen nie den Stationsarzt - - 80% der Patienten bei Übergabe (Einweisung, Überweisung) mit unvollständigen wichtigen Informationen - - Noch nicht ausgeschöpftes Potenzial: bis zu 20% Kostenreduktion, bis 300% Erhöhung des Patientendurchsatzes - - - -# (Entstehung und) Erfassung bioelektrischer Signale - -| Bioelektrische Signale | Nichtelektrische Signale | -|:--:|:--:| -| EGK | Blutdruck | -| EEG | Herminutenvolumen | -| EMG | Temparatur | -| ERG, EOG, VEP, ... | Augeninnendruck, ... | - -Merkmale bioelektrischer Signale: -- Unmittelbare Information über Vorgänge an Nerven und Muskeln -- Repräsentation physiologischer und pathologischer Veränderungen => Globale und detaillierte Beurteilung der Organfunktion -- Zumeist nichtinvasiv (Signalableitung an der Körperoberfläche) => Geringe Belastung für den Patienten -- Kostengünstig - -Quellen/Ursprung bioelektrischer Signale: Nerven und Muskeln -| ![Von Quasar Jarosz in der Wikipedia auf Englisch, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=7616130](Assets/640px-Neuron_Hand-tuned.svg.png) | ![Von Action_potential.svg: Original by en:User:Chris 73, updated by en:User:Diberri, converted to SVG by tiZomderivative work: de:Benutzer:Jnns - Action_potential.svg, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=10316004](Assets/Aktionspotential.svg)| -| -- | -- | - -Beide Gewebearten haben spezielle Eigenschaften: -- Erregbarkeit - - elektrisch - - mechanisch - - chemisch -- Erregungsfortleitung: - - innerhalb der Zelle vom erregten Abschnitt zum benachbarten Abschnitt - - von Zelle zu Zelle - -Aktionspotential -- Ursachen: - - Ionenpumpen (insbes. Kalium-Natrium-Pumpe) - - Selektive Permeabilität von Ionenkanälen - - Chemische und elektrische Gradienten (Potentiale) - - Messung des Zellinneren gegen das Zelläußere! -- Ruhepotential - - ist das elektrische Potential (Potentialdifferenz) an einer Membran nach Einstellung des elektrochemischen Gleichgewichts (Betrag des elektrischen Potentials = Betrag des chemischen Potentials). - - Ursache (I): - - Kalium-Natrium-Pumpe(pro ATP: 3 Na+-Ionen nach außen und nur 2 K+-Ionen nach innen) - - Ursache (II): - -Natriumkanäle geschlossen => keine (nur sehr geringe) Diffusion von Na+ nach innen - -Kaliumkanäle offen => Diffusion von K+-Ionen nach außen entlang des chemischen Gradienten und entgegen des elektrischen Gradienten => Einstellung des elektrochemischen Gleichgewichts -- Depolarisation wenn Störung des Ruhepotentials (z.B. durch elektrische Erregung) über das Schwellwertpotential (-55 mV) hinaus, dann - - => Öffnung der spannungsabhängigen Natriumkanäle - - => Einschießen von Na+ ins Zellinnere (schneller Prozess) - - => Umpolarisieren des Membranpotentials bis zur Einstellung des Natrium-Gleichgewichtspotentials -- Repolarisation: - - Schließen der Natriumkanäle - - Öffnen der Kaliumkanäle - - => Austrittvon K+ aus dem Zellinneren (langsamer Prozess) -- Plateau (Herzmuskelzelle) - - zusätzliches Einströmen von $Ca^{2+}$-Ionen ins Zellinnere (langsamer Prozess) - - Verzögerung der Repolarisation - - Ausbildung eines Plateaus (Refraktärzeit der Herzmuskelzelle) - - -### Elektrophysiologische Untersuchung -Elektrophysiologische Untersuchungen werden in drei Teilgebiete unterteilt: -- **Zentralnervensystem** => Elektroenzephalographie (EEG) -- **Herz** => Elektrokardiographie (EKG) -- **Muskulatur** => Elektromyographie (EMG) - -weitere Biosignale: -- Retinale Potentiale: Ableitung elektrischer Potentiale am Auge - - **Elektrookulogramm(EOG)**: Erfassung von Augenbewegungen, Ableitung an den Lidwinkeln - - **Elektroretinogramm(ERG)**: retinaleelektrische Antwort auf Lichtreizung, Ableitung: Cornea => Schläfe -- Evozierte Potentiale: Prüfung einzelner Sinnesfunktionen bzw. deren zentralnervöse Strukturen durch gezielte Stimulation - - somatosensorisch evozierte Potentiale (SEP) - - akustisch evozierte Potentiale (AEP) - - visuell evozierte Potentiale (VEP) - - => Gesichtsfelduntersuchung (Perimetrie) - - -## Elektroenzephalogramm (EEG) -Elektroenzephalogramm (EEG) ist die Ableitung der elektrischen Aktivität (Potentialschwankungen) des Gehirns an der Kopfoberfläche.\ -Elektrokortikogramm (ECoG) ist die Ableitung der elektrischen Aktivität direkt am Kortex(z.B. bei operativen Eingriffen) - -### Signalkomponenten -Die verschiedenen Ryhtmen (Frequenzbänder) können beim EEG immer bestimmten Zuständen zugeordnet werden: -| Bezeichnung | Frequenz | Zustand | Spannung | betreffend | -|:--:|:--:|:--:|:--:|:--:| -| Delta | 1-4Hz | Tiefschlaf | <200 müV | ganzer Cortex | -| Theta | 4-8 Hz | Schläfrigkeit, psychische Störung | <100 müV | parietal | -| Alpha | 8-13 Hz | Ruhe und Entspannung | <50 müV | okzipital | -| Beta | 13-35 Hz | Aktivität, Denken | <50 müV | frontal, parietal | -| Gamma | 35-100 Hz | starke Konzentration, Lernprozess | | | - -![Aufmerksamkeitsbedingte Veränderungen](bilder/516.png) -### Positionen zur EEG Ableitung -| ![Von Brylie Christopher Oxley - https://commons.wikimedia.org/wiki/File:International_10-20_system_for_EEG-MCN.svg, CC0, https://commons.wikimedia.org/w/index.php?curid=86731792](Assets/805px-International_10-20_system_for_EEG-MCN.png) | ![Von Albert Kok in der Wikipedia auf Niederländisch - Übertragen aus nl.wikipedia nach Commons., Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=2213404](Assets/10-20.PNG) | -| :--: | :--: | -| ![Von Der ursprünglich hochladende Benutzer war MBq in der Wikipedia auf Deutsch - Henry Gray (1825–1861). Anatomy of the Human Body. 1918., Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=11794362](Assets/Gray_Surface-head.jpg) | | - -### Diagnostischer Informationsgehalt -Anwendungsgebiete in Diagnostik und Therapie: Epilepsie, Objektive Perimetrie (objektive Vermessung des Gesichtsfeldes), Neurofeedback, Narkosetiefe, Schlafmedizin (Polysomnographie), Kognitionsforschung (Gedächtnisprozesse), Hirntodbestimmung, Schlaganfall, Tumore, Hirnreifung, Psychiatrische Erkrankungen - - -## Elektrokardiogramm (EKG) -Elektrokardiogramm ist der zeitliche Verlauf der an der Körperoberfläche abgeleiteten Potentialschwankungen des Herzens -- nichtinvasive Ableitung -- relativ geringer zeitlicher und personeller Aufwand -- am häufigsten abgeleitetes Biosignal -- außerdem: - - Ösophagus-EKG => EKG-Ableitung in der Speiseröhre - - Intrakardiales EKG => EKG-Ableitung am offenen Herzen - -|![Von Tvanbr - Eigenes Werk, Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=11616158](Assets/1117px-Anatomy_Heart_Latin_Tiesworks.jpg) | ![Von Kalumet - selbst erstellt = Eigenes Werk, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=438152](Assets/ECG_Principle_fast.gif) | -| -- | -- | -| Anatomie des Herzens | EKG-Komponenten einer Herzperiode | - - -### Physiologie/Signalkomponenten einer Herzperiode -| EKG Komponente | Physiologie | charakterist. Merkmale | -| -- | -- | -- | -| P-Welle | Erregung der Vorhöfe | kleine positive Welle | -| PQ-Strecke | Zeit vom Beginn der Vorhoferregung bis zum Beginn der Kammererregung, sog. Erregungsüberleitungszeit| verläuft auf der isoelektrischen Linie; PQ-Dauer ist abhängig von der Herzfrequenz | -| QRS-Komplex | Kammererregung, besteht aus Q-Zacke, R-Zacke und S-Zacke | Form des QRS-Kompl. ist bei den Extremitätenableitungen abhängig von der Herzachse | -| ST-Welle | Zeit, in der die gesamte Kammermuskulatur erregt ist | verläuft normalerweise auf der isoelektrischen Linie | -| T-Welle | Rückbildung der Kammererregung | breiter und flacher als der QRSKomplex, da die Rückbildung nicht über feste Bahnen verläuft | -| U-Welle | Nachschwankung der Kammererregungsrückbildung | sehr klein und nicht immer registrierbar | - -### Widerspieglung des Errregungsablaufs (Herzzyklus) im EKG -- Elementarvektor = Vektor, der die Erregung einer einzigen Muskelfaser widerspiegelt -- Summationsvektor = Resultat mehrerer Vektoren nach dem Kräfteparallelogramm -- elektrische Herzachse = Gesamtsummationsvektor bei Erregung der Herzkammern -- Modellierung als Dipol = Summe elementarer Dipole einzelner Herzmuskelzellen extrazellulär, d.h. + =: unerregt; - =: erregt - -### EKG Ableitungen -#### Extremitätenableitung nach Einthoven -- bipolare Ableitung -- Ableitungsbezeichnungen: I, II und III -- Ableitorte: rechter Arm (rot), linker Arm (gelb), linker Fuß (grün) - -#### Extremitätenableitung nach Goldberger -- unipolare Ableitung -- Ableitungsbezeichnungen: aVR, aVL, aVF -- Projektion der Frontalebene (um 30 Grad gegenüber Einthoven-Ableitung gedreht) - -#### Thorax-Ableitung nach Wilson -- unipolare Ableitung -- Ableitungen: V1 ... V6 (Standard) -- Projektion der Horizontalebene -- Referenzelektrode: Herzmitte => hochohmige Zusammenschaltung der Extremitätenableitung - -nach Wilson: ![Von Jmarchn - modified from Precordial_Leads.svg and Rib_Cage (Jeroen Hut), CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=9426668](Assets/Precordial_Leads_2.svg) - - -#### Altersabhängigkeit der Herzachse -- elektrische Herzachse = Gesamtsummationsvektor bei Erregung der Herzkammern -- Rechtstyp (RT): Säuglings- und Kindesalter -- Steiltyp (ST): jugendliches Alter -- Mitteltyp (IT): jüngeres Erwachsenenalter -- Linkstyp (LT): Erwachsenenalter und ältere Menschen -- Überdrehte Rechts- u. Linkstypen (ÜRT, ÜLT) sind pathologisch - -### Diagnostischer Informationsgehalt -Morphologische Untersuchung und Herzfrequenz Analyse -- Herzinfarkt - - Verengung oder Verschluß eines koronaren Herzkranzgefäßes - - deutliche Hebung der ST-Strecke - - Verschmelzung mit folgender T-Welle ("monophasische Deformierung") -- Extra-Systolen - - frühzeitig auftretender Extraschlag aus dem Kammerbereich - - Einsetzen eines verbreiterten und deformierten QRS-Komplexes - - kompensatorische Pause, weil Sinusrhythmus in Takt ist -- AV-Block - - Störung der Erregungsleitung zwischen Vorhof und Kammer - - Grad 1: PQ-Verlängerung - - Grad 2: gelegentlicher (Typ Wenkebach) oder regelmäßiger (Typ Mobitz) Ausfall eines Kammerschlages - - Grad 3: Keine Kopplung zw. Vorhof- u. Kammererregung => Schrittmacher - -### Digitale EKG Signalanalyse -EKG-Signaleigenschaften -- R-Zacke = zentraler Punkt im QRS-Komplex - - hat in der Regel die größte Amplitude und den größten Anstieg bzw. Abfall - - -> hebt sich somit meist als Peak hervor (Polarität kann verschieden sein) -- Amplitudenbereich : 0,5 - 4 mV (ortsabhängig) -- Frequenzbereich EKG : 0,2 - 150 Hz -- Frequenzbereich QRS-Komplex : 5 - 30 Hz -- Dauer eines QRS-Komplexes : 60 - 100 ms -- zu wählende Abtastfrequenz ist abhängig vom Zweck der Untersuchung - - z.B. Spektralanalyse des QRS-Komplexes zur Analyse von Spätpotentialen -> hochauflösendes EKG : 1 - 2 kHz - - zur Herzrhythmusanalyse : 200 - 500 Hz ausreichend - - -Grundprinzip QRS-Detektion: Roh-EKG -> Vorverarbeitung -> QRS-Detektion (inkl Signal Transformation) - -- maximaler, mittlerer und minimaler RR-Abstand: $RR_{min}, RR_{max}, \overline{RR}$ -- Standardabweichung der RR-Abstände: $S_{RR}= \sqrt{\frac{1}{n-1} * \sum_{i=1^n}(RR_i - \overline{RR}^2)}$ -- Variationskoeffizient: Quotient aus Standardabweichung und mittlerem RR-Abstand $VK=\frac{S_{RR}}{\overline{RR}}$ -- RMSSD (root mean squared successive difference) = Kenngröße zur Quantifizierung der Variationen aufeinanderfolgender RR-Abstände $RMSSD = \sqrt{\frac{\sum_{i=1}^{n-1} (RR_{i+1}-RR_i)^2}{n}}$ -- BB50 (pNN50): relativer Anteil [%] von aufeinanderfolgenden RR-Abständen, mit Differenz größer als 50 ms -- MCR: Betrag des mittleren Summenvektors aller event-Vektoren auf dem Atemperioden-Einheitskreis -- E/I-Quotient: mittlerer Quotient aus längstem RR-Abstand während forcierter Expiration und kürzestem RR-Abstand während forcierter Inspiration; spez. Kenngröße der Respirationsphase -- 30/15-Quotient: Quotient aus dem längsten RR-Abstand etwa um den 30. Herzschlag und dem kürzesten RR-Abstand etwa um den 15. Herzschlag nach Aufstehen; Kenngröße zur Charakterisierung der Orthostasereaktion -- Herzfrequenvariabilität (HRV) - - VLF $<= 0.04$ Hz: Thermoreg. Einflüsse - - LF $0.04- 0.15$ Hz: Barorezeptorische Einflüsse - - HF $0.15 - 0.4$ Hz: Resp. Sinusarrhythmie (RSA) -- Intervall-Tachogramm: Problem: keine äquidistante Impulsfolge -> kontinuierliches Herzfrequenzsignal notwendig - - -## Elektromyogramm (EMG) -elektrische Aktivität hervorgerufen durch Muskelaktivität. Gemessen über Oberfläche oder mit Nadel -### Motorische Einheit -- := einzelnes Motoneuron (Nervenzelle + Nervenfaser) inkl. seiner innervierten Muskelfasern -- Das Feuern eines Motoneurons bewirkt die Kontraktion mehrerer Muskelfasern -- Die Kraft der Muskelkontraktion wird gesteuert durch: - - die Anzahl der erregten Axone (Rekrutierung) - - die Frequenz der Aktionspotentiale auf jedem Axon (Frequenzierung) -- MUAP: Aktionspotential motorischer Einheiten - -### Grobmotorik vs. Feinmotorik -- **Grob**: Wenige ME mit vielen Muskelfasern pro ME z.B. Oberschenkelmuskel (bis zu 2000 Muskelfasern) -- **Fein**: Viele ME mit wenigen Muskelfasern pro ME z.B. äußere Augenmuskeln (4–40 Muskelfasern) - -### Übersicht - -- Oberflächen EMG - - Ableitung des Summenaktionspotentials eines Muskels oder Muskelanteils über Einzelelektronen -- Nadel EMG - - Fine-Wire-Elektroden: - - Nadel mit Elektrodenfäden einführen - - Nadel entfernen, Elektroden verbleiben unter Haut - - Fäden mit Federn verbinden (bzw elektronischem Schaltkreis) - - -### Signalanalyse -- Spektralanalyse -> Abfall der mittleren Frequenz als Ermüdungsindex -- Amplitudenzeitverlauf -> gleitende Fensterung - - -# EKG-Verstärker -Welcher Besonderheiten sind bei der Hardwareentwicklung zu beachten? - -Zur Erinnerung: -- Amplitude: 0,5 – 4mV -- Frequenzbereich: 0,2 -150Hz -- Auflösung: 2ksps - -Störeinflüsse: -- **Kapazitive Kopplung** Netzinstallation, Leuchtstofflampen -- **Induktive Kopplung** Patientenkabel -- **Galvanische Kopplung** Reeller ohmscher Widerstand (Isolationswiderstand), Masseleitung der Messgeräte (Masseschleife) -- **Elektromagnetische Störungen** Multimediainstallationen (Mobilfunk, Netzwerktechnik,...) - -Gegenmaßnahmen: -- Maximal möglicher Abstand -- Maximale Erhöhung der Erdisolation des analogen Front-End -- Software implementierter Notchfilter (50 Hz / 60 Hz) -> besser als Hardware, wegen Übertragungsfkt. -- Primäre Spezifikation ist das Eingangsrauschen (input referred noise: 30mü VRMS bei einer Bandbreite von 150 Hz) -- Schirmung mit Hilfe eines Faraday'schen Käfig -- Anwendung der Guarding-Technologie -- Sternförmiger Massepunkt als Verbindung zwischen analoger und digitaler Masse -- Schirmende Masseflächen zwischen Signalleitungen - -## Systemkonzept -Komponenten:\ -Medizinisches Messobjekt --> Verstärker --> Filter --> ADC (analog to digital) - -Signalpegelanpassung -- Wandler und ADC lassen sich meist nicht direkt verbinden -> Anpassung durch Verstärker -- Anpassung des Ausgangsspannungsbereich von Transducer an Eingangsspannungsbereich ADC -- Oft Veränderung des DC-Levels bis das Signal optimal in den Eingangsspannungsbereich des ADC passt - -## Low vs High Resolution -### Low-­Resolution (< 16‑bit) ADCs -- Einsatz rauscharmer Verstärker (mehrstufig) -> erste Stufe bestimmt im Wesentlichen das Rauschen des gesamten Verstärkers -- hohe Signalverstärkung (~500) -- Verstärkerrauschen darf das System nicht dominieren -- Dynamik des Signal muss in Verstärkerkette bereits berücksichtigt werden -- Problematisch: DC-Anteil (oft Filterung, besser ohne) - -### High-­Resolution (24‑bit) ADCs -- niedrige Signalverstärkung (~5) -- schwaches Signals wird durch Wandlung mit hochauflösenden ADC kompensiert -- gutes Handling vom DC-Anteil möglich -- weniger Hardwarekomponenten nötig -> Kostenersparnis und 'state of the art' - -## Funktionen beim EKG -- Erkennung schlechter Elektrodenkontakt (Lead-off detection ) -- Gleichanteil entfernen (DC removal) -- Multi band-pass Filterung -- ECG leads formation -- QRS-Detektion -- Visualisierung des EKGs auf einem Display -- Kommunikationsports: UART, SPI, I2C, External memory interface (EMIF) -- Detektion und Entfernen des Schrittmacherimpuls - -## Lead off Detektion -- Überwachung des Elektrodenkontaktes (außer dem rechtem Bein - Bezug) -- Die EKG-Elektroden sind an einem hochohmigen Pullupwiderstand (> 10 M) angeschlossen -- Abriss der Verbindung = Anstieg Spannung auf VCC -- Komperator mit Schwellspannung -- Überschreitung = Interrupt am Mikrocontroller - -![Von Ernstl - Eigenes Werk, CC BY-SA 2.5, https://commons.wikimedia.org/w/index.php?curid=625305](Assets/960px-Defibrillator_Monitor_Closeup.jpg) - -# Pulsoximetrie -- Die Versorgung der Organe mit Sauerstoff ist für den Organismus von entscheidender Bedeutung. -- Medizinisches Interesse besteht an der Überwachung der Oxigenierung des Blutes -- -> Pulsoximetrie - - Nicht-invasives Messverfahren - - Kontinuierliche Erfassung der Sauerstoffversorgung des arteriellen Blutes - - Prozentuale Angabe des oxygenierten Hämoglobin am Gesamthämoglobin - -## Definition Sauerstoffsättigung -- Funktionelle Sauerstoffsättigung $SO_2 = \frac{HbO_2}{Hb + HbO_2}$ - - Verhältnis vom sauerstoffbehaftetem zum gesamten Hämoglobin - - Beim gesunden Menschen 94-98 % - - Je nach Sauerstoffsättigung -> Änderung der opt. Eigenschaften -- Fraktionelle Sauerstoffsättigung $SO_2 = \frac{HbO_2}{Hb + HbO_2 + COHb + MetHb}$ (liefert die 'richtigere' Messung da mehr berücksichtigt) - -(Hb = Hämoglobin; $O_2$ = Sauerstoff) - -## Lambert Beer Gesetz -Lichtquelle (einfallende Lichtintensität $I_0$) Durchstrahlt Medium (Weglänge des Lichts $d$). Photodiode auf anderer Seite des Mediums misst übriges Licht (Lichtintensität $I$). -- $\epsilon(\lambda)$ Extinktionskoeffizient in L $mmol^{-1}cm^{-1}$; -- $c$ Konzentration in $mmol^{-1}$ -- $I = I_0 * e^{-\epsilon(\lambda)cd}$ -- in Medium: $I(x)=I_0e^{-\epsilon(\lambda)c(x-a)}$ -- Transmission $T= \frac{1}{I_0} = e^{-\epsilon(\lambda)cd}$ -- Absorption $A = -ln(T) = \epsilon(\lambda)cd$ -- Mehrfachabsorption $A_{tot}=\epsilon_1 (\lambda) c_1 d_1 + \epsilon_2 (\lambda) c_2 d_2 +...+ \epsilon_n (\lambda) c_n d_n$ - -(Hinweis für die Klausur: Lernt die Funktionsbezeichnenden Bilder!) - -## Normierung -Um Rotes und Infrarotlicht zu normieren und vergleichbar zu machen, benötigt man folgende Formel: -$I_n=\frac{1}{I_H}= e^{-[\epsilon_{Hb} (\lambda)c_{Hb} + \epsilon_{HbO_2} (\lambda)c_{HbO_2}] \Delta d}$ - -## Sensorik -### Lichtquelle & Empfänger -Für nichtinvasive Messung werden Körperstellen gewählt, bei denen arterielle Blutgefäße zugänglich sind, z.B. Finger, Zeh, Ohrläppchen. -- Laser - - Vorteil: hohe Lichtausbeute und nahezu monochromatisches Licht - - Nachteil: preisintensiv und schwer zu regeln - - -> eher ungeeignet -- LED - - Vorteil: guter Wirkungsgrad, relativ schmales Spektrum, kleine Bauform - - Nachteil: Temperaturabhängigkeit der mittleren Wellenlänge - - -> geeignet - -#### LED Prinzip -- physikalisch: - - emittierte Licht entsteht bei der Rekombination von Elektron-Loch-Paaren und ist dabei materialspezifisch - - größere Wellenlängen besonders wichtig für Medizin -> größere Eindringtiefe in Gewebe (rot, infrarot) - - Abstrahlcharakteristik: Wiedergabe der Winkelabhängigkeit in normierter Form (bezogen auf die maximale Strahlstärke) -- Temperaturabhängigkeit: - - Abnahme des Wertes der Energielücke bei zunehmender Temperatur -> Verschiebung des Emissionsmaximums zu höheren - - Wellenlängen $E=h*f$ und $c=\lambda * f \rightarrow E=h/\lambda$ (h=plansches Wirkungsquantum; ) - - Zunahme der mittleren kinetische Energie der Elektronen bzw. Löcher mit zunehmender Temperatur, d.h. die Elektronen und Löcher halten sich weniger an den Bandkanten auf - -#### Photodiode -- Photodioden sind Halbleiter aus Silizium, welche für Photonen und hoch-energetische Partikel sensitiv sind -- Absorption der Energie unter Umwandlung in elektrische Ladung -- Sensitivitätsbereich: 1pW/cm2 bis 100mW/cm2 -- Vielseitiger Einsatz: Spektroskopie, Fotosensoren, optische Positionssensoren, Oberflächencharakterisierung, optische Datenübertragung, Medizinische Bildgebung, Dosimetrie, … -- Unterscheidung der Wellenlängen nur durch Filter möglich! Nicht durch Diode selbst - -### Verstärkerschaltung -Ausführungen einer Photosensorschaltung: -- Elementbetrieb (für Pulsoximeter zu langsam) -- Vorgespannter Betrieb (pin-Photodiode, Schottky-Photodiode, Avanlanch-Photodiode) - -Photodioden werden meist elektrisch Vorgespannt, indem sie an eine Negative Spannungsversorgung angeschlossen werden. -1. Transimpedanzverstärker -2. Invertierender Spannungsverstärker -Für Hochgeschwindigkeitsanwendungen -- Besonders große Vorspannung -> begrenzt durch Sperrspannungsfestigkeit der Diode -- Großer Lichtstrom benötigt - -# Grundlagen der Biosignalverarbeitung -## Analog-Digital-Wandlung -- Abtastung und Quantifizierung - - Auflösung: N Bit - - Referenzspannung: $U_{Ref}$ - - Quantisierungsintervall: $q=A_{LSB} = \frac{U_{Ref}}{2^N}$ - - Wertebereich: $0... (2^N -1)*U_{LSB}$ -- Komponenten -- Wandlungsprinzipien - - direktvergleichende ADC - - Wägeverfahren: Sukzessive Approximationswandler - - Abtastung durch Sample & Hold-Schaltung - - Sukzessive Annäherung einer mittels DAC erzeugten Spannung an die zu messende Spannung (von $U_{MSB}\rightarrow U_{LSB}$ ) - - DAC-Eingangswert entspricht Messwert - - parallele Verfahren: Parallelwandler - - Komparatoren: $(2^N-1)$ - - Widerstände: $(2^N-2)*R$ - - $R_{Ges}=2^N*R$ - - Komparatoren vor D-Flip-Flops -> "Digitales Abtast-/Halteglied" - - Zählverfahren - - u/t-Umsetzer: Dual-Slope-Wandler/ Multi-Slope-Wandler - - $u_2= -\frac{1}{RC} \int u_1(t) dt$ und $u_x=u_{Ref}*\frac{T_x}{T_{int}}$ - - u/f-Umsetzer: Sigma-Delta-Wandler - - $U_{Int}(t) = \int (U_{IN}-U_x) dt$ -- Auswahlkriterien von AD-Wandlern - - relevantere Parameter - - Auflösung und Abtastrate (Wandlungsprinzip) - - Genauigkeit (DC Accuracy) - - Dynamische Eigenschaften (AC Accuracy) - - Stromaufnahme, Verlustleistung - - Dateneingänge (Eingangspegel, Anzahl ADC je Chip, Speisung) - - Datenausgabe (seriell, parallel, Ausgangspegel, Codierung) - - Spezielle Eigenschaften (z.B. Isolation) - - Sonstiges (Arbeitstemperatur, Gehäuse, Größe, Preis, ...) - - Externe Beschaltung und Ansteuerung - - Anzahl der Analogeingänge - - Single-, Dual-, Quad-, Octal-ADC,..., 128 Channels - -## Grundlagen digitaler Filter -LTI -(Lineare zeitinvariante diskrete)- Systeme - - Zeitdiskrete Filter sind Realisierungen von linearen zeitinvarianten (LTI) diskreten Systemen - - Zeitdiskretes System: zeitdiskretes Eingangssignal x[n] -> zeitdiskretes Ausgangssignal y[n] - - Linearität & Zeitinvarianz ($x[n-i]\rightarrow y[n-i]$) - - Ein LTI-System kann mittels seiner Impulsantwort g[n] charakterisiert werden - - Eingangssignal: Einheitspuls δ[n] - - Beachte: Die Impulsantwort wird in der Literatur auch oft mit h[n] symbolisiert. - - Ein LTI-System ist kausal, wenn gilt: $g[n] = 0$ für $n < 0$ - - Sprungantwort: $h[n]=\sum_{m=-\infty}^n g[m]$ - - Das Ausgangssignals eines Filters ergibt sich aus der Faltung des Eingangssignals mit der Impulsantwort des Filters. - -FIR -(Zeitdiskrete)- Filter -- Lineare Differenzgleichung - - $$y[n] = -\sum_{i=1}^M a_i*y[n-1] + \sum_{i=0}^N b_i*x[n-i]$$ - - Rekursiver Teil (Rückkopplung) + Nicht-Rekursiver-Teil -- im Blockdiagramm - - Multiplikation: $y[n]=b*x[n]$ - - Zeitverzögerungsglied: $y[n]=x[n-1]$ - - Addition: $y[n]=x_1[n]+x_2[n]$ -- Merkmale eines FIR-Filters - - Impulsantwort besitzt endliche Länge (Finite Impulse Response) - - Keine Rückkopplung (keine Rekursion)* - - Impulsantwort = Filterkoeffizienten - - Immer stabil (Pole liegen immer im Ursprung) - - Linearer Phasengang im Falle symmetrischer / antisymmetrischer Filterkoeffizienten - - Hohe Flankensteilheiten sind im Vergleich zu IIR-Filtern nur mit hohem Rechenaufwand (große Filterordnung) realisierbar - -IIR -(Zeitdiskrete)- Filter -- Merkmale eines IIR-Filters - - Impulsantwort besitzt unendliche Länge (Infinite Impulse Response). - - Besitzt Rückkopplungszweig (d.h. rekursive Berechnung) - - Können instabil sein (wenn nicht alle Pole innerhalb des Einheitskreises liegen) - - Meist nichtlinearer Phasengang - - Hohe Flankensteilheiten sind mit weniger Rechenaufwand realisierbar als mittels FIR-Filter -- Frequenzgang -> Filter-Grundtypen - - Hoch/Tiefpass - - Bandpass/sperre -- Grundlagen der Filtertheorie - - Übertragungsfunktion: $G(j\omega) = \frac{U_2(j\omega)}{U_1(j\omega)} = |G(j\omega)|*e^{j\omega \phi}$ - - Amplitudenfrequenzgang: $|G(j\omega)|= \sqrt{Re{G(j\omega)}^2 + Im{G(j\omega )}^2 }$ - - Phasenfrequenzgang: $\phi(\omega) = arctan \frac{Im{G(j\omega)}} - - Grenzfrequenz: $\omega = \frac{1}{RC}$ -- Sinn: das Eingangssignal erscheint am Ausgang eines Tschebysheff-Filters wegen nichtkonstanter Gruppenlaufzeit verzerrt - - Die Form der Biosignale ist diagnostisch relevant, Formverzerrungen können zur falschen Diagnose führen - -# Bildgebende Systeme in der Medizin -- radiologische BS - - Röntgenstrahlung - - Gammastrahlung -- nichtradiologische BS - - Licht (Foto, Endoskop, Mikroskop) - - Infrarot: Thermographie - - HF: MRT - - Ultraschall: US-BS -- Ziel - - Visualisierung (dem menschlichen Auge sichtbar machen), - - Quantifizierung (diagnostisch relevanter Parameter von Bau und Funktion) des menschlichen Körpers, meist des unsichtbaren Körperinneren. - - in möglichst allen Dimensionen (u, v, w, t) - - in möglichst allen Größenordnungen (makroskopisch, mikroskopisch) - - möglichst nichtinvasiv - -## Röntgen -Begriffe/Technik einer Röntgendiagnostikeinrichtung (DIN6814): -- Anwendungsgerät - - Röntgenstrahler - - Röntgenröhre - - Röntgenröhrenschutzgehäuse - - Bildwandler (auf präpariertes Papier/Kasette/digitaler Empfänger) -- Zubehör - - Zusatzfilter - - Tiefenblende - - Lichtvisier -- Röntgengenerator - - Hochspannungserzeuger - - Schalttisch - -Röntgendiagnostischer Prozess -| Prozess | Ziel | Nutzen | -| -- | -- | -- | -| Erzeugung | des latenten Strahlenbilds | Abbildungsfunktion, Objektkontrast, Bewegungsunschärfe, Streustrahlung, Fokusunschärfe | -| Wandlung | in ein sichtbares Bild | Übertragungsverhalten Wandler | -| Betrachtung | des sichtbaren Bildes mit dem Auge | Betrachtungsbedingungen, Übertragungsverhalten Auge | -| Auswertung | des Röntgenbildes | Erfahrungen des Befundes, weitere Befunde | - -### Röntgenstrahlenquelle -In Vakuumgefäß wird eine Glühkatode (Wolframwendel) durch elektrische Leistung erhitzt. Daraus emmitierende Elektronen treffen auf Anode (Kupfer + Wolfram) und werden in bestimmten Winkel abgelenkt. Anforderungen sind punktförmiger Fokis (Zentralprojektion) und kurze Schaltzeiten (Bewegungsunschärfe). -Drehanodenröntgenröhren besitzen als Anode einen Anodenteller der durch einen Motor gedreht wird. Schnelle Speicherung großer Wärmemengen, hohe Tellertemperaturen und Wärmeabgabe über Wärmestrahlung (Strahlungskühlung) an Keramikkörper. - - -# Bildverarbeitung -## Anwendungsfelder digitaler Bildverarbeitung -- Medizinische Diagnostik und Therapie - - Röntgen, CT, DSA, PET, SPECT, Ultraschall, MRI, fMRI, OCT -- Biolog. Bildgebung - - Histologie, Mikroskopie, Zählung, Klassifikation u. Morphologie von Zellen, Bewegungsanalyse, Wachstum -- Forensik / Rechtsmedizin - - Fingerabdruck, Gesichtserkennung -- Mensch-Maschine-Kommunikation / Robotik - - Gestenerkennung, Zeichensprache, Orientierung im Raum -- Dokumentenverarbeitung - - Automatische Texterkennung (OCR), Scannen, Archivieren, Fotografie -- Industrie / Materialforschung - - Qualitätssicherung, automatisches Zählen, Komponentenerkennung -- Remote Sensing - - Ernte, Wetter, Vermessung, Militär, Astronomie - -## Eigenschaften -- Große Komplexität / Variabilität der Objekte -- Große Bedeutung feinster Strukturen -- Multimodal, individuelle Unterschiede -- Dreidimensionale / dynamische Bilddaten -- Vergleichbarkeit mit Standardfällen -- Hohe Robustheit notwendig - -## Ziele -- Diagnose -- Screening -- Operieren -- Bestrahlungsplanung -- Ausbildung - -## Modellgestützte Interpretation -- Bildinformationen - - Modell- bzw. anwendungsspezifische Interpretation des Bildes - - Bild nur unter Erwartungshaltung bzw. mit Hilfe eines Modells interpretierbar - - Können verfälscht oder widersprüchlich sein - -## Bildverarbeitungsprozess -Aufnahme -> Vorverarbeitung -> Segmentierung -> Merkmals-Extraktion -> Klassifikation -> Objekterkennung - -| Prozess | Beschreibung | -| -- | -- | -| Bildrestauration | Beseitigen von Störungen / Verzerrungen, die bei der Bildaufnahme entstanden sind | -| Bildverbesserung | Verbesserung des subjektiven Wahrnehmung; Anhebung der (diagnostisch) relevanten Bildinformation | -| Bildregistrierung | Anpassung (Transformation) von Zielbildern auf ein Referenzbild (z.B. mit Ziel der Bildfusion) | -| Bildsegmentierung | Unterteilung des Bildes hinsichtlich der Struktur in einzelne Bildabschnitte (Segmente: Histogramm-/Regionen-/Kanten-/Modellbasiert) | -| Merkmalsextraktion | Erfassung von Merkmalen (Eigenschaften) zusammenhängender Bildobjekte (Segmente: Region-/Formbasiert) | -| Klassifikation | Zuordnung von Bildobjekten (Neuronale Netzwerke) | - -### Bildrestauration -- Geometrische Verzerrung - - Affine Verzerrung: Drehung um Koordinatensystem (in zwei Ebenen) - - Projektive Verzerrung: Dimensionale verzerrung in dritter ebene - - Linsenförmige Verzerrung (oval gestaucht/gestreckt) - - Unschärfe durch Bewegung (Verzerrungen) - - Unschärfe durch Defokussierung - -### Bildverbesserung -- Rauschunterdrückung durch lineare Tiefpass-Filter (z.B. Gauss) -- Rauschunterdrückung - nichtlineare Filter - - Salz&Pfeffer-Rauschen -> Median-Filter - - Medianfilter: Analyse der Umgebung eines Pixels -> Median Bilden und ersetzten -- Hervorheben von Kanten durch lineare Hochpass-Filter -- Kontrasterhöhung (Grauwertspreizung/Clipping/Gammakorrektur) - -### Bildregistrierung -Aufnahme-Bild und Referenzbild sollen deckungsgleich im gleichen Koordinaten eingebracht werden -- Passpunktbasiert (Punkte an Festen Bildpunkten verankert geben Triangulation) -- Passpunktunabhängig durch normierte Kreuzkorrelation - -### Bildsegmentierung -- Pixelbasierte Segmentierung (Schwellwertsegmentierung) -- Regionenbasierte Segmentierung (z.B. Tumorgewebe) -- Kantenbasierte Segmentierung -- Modellbasierte Segmentierung (Erkennung von Kreisen mittels Hough-Transformation) - -### Merkmalsextraktion -Klassifikation durch Merkmale/Ähnlichkeiten in einem Merkmalsraum - -### Morphologische Operatoren -Einsatzgebiet zwischen Bild-Segmentierung und Merkmalsextraktion -- z.B. Löcher schließen -> $\oplus$ **Dilatation** mittels Masken über Pixelbereich werden Pixel hinzugefügt -- Fehlstrukturen entfernen -> $\ominus$ **Erosion** mittels Masken über Pixelbereich werden Pixel entfernt -- oft Kombination aus beidem für optimal nutzbares Ergebnis - - Entfernen von Segmentierungsfehlern: 'Opening'/'Closing' - - Berechnung des Randes durch Erosion der äußeren Pixel und abzug des Ergebnisses vom Original -- Bestimmung von Formmerkmalen - - Hit-or-Miss Operator - - Hit Operator: betrachtetes Pixel wird gesetzt wenn Maske übereinstimmt, Rest gelöscht - - Miss-Operator: betrachtetes Pixel wird gelöscht wenn Maske übereinstimmt, Rest bleibt - -# Informationssysteme in der Medizin und im Gesundheitswesen -## Medizinische Dokumentation -Medizinische Dokumentation ist das -- Erfassen, -- Ordnen, -- Speichern und -- Bereitstellen -von medizinischen Informationen und medizinischem Wissen, zum Zweck, diese(s) später -- berechtigten Personen, -- vollständig, -- zur richtigen Zeit, -- am richtigen Ort, -- in der richtigen Form, -zur Verfügung zustellen. -Die Dokumentationspflicht (insbes. in Form einer Patientenakte) ist u.a. ableitbar aus -- §1 u. 2 des Grundgesetzes -- §10 der Musterberufsordnung für Ärzte (MBO-Ä) - -### Ziele -- Krankenversorgung - - Unterstützung der individuellen Krankenbehandlung - - Gedächtnisstütze für Arzt und medizinisches Personal (Anamnese-Erfassung) Entscheidungsunterstützung, Kommunikationsmedium -- Rechtlicher Beleg - - Haftungsrecht; Verordnungen und Gesetze, die die medizinische Dokumentation für andere Zwecke regeln - - Standesrechtliche Dokumentationspflicht -- Administration (Abrechnung, Verwaltung, Management) -- Qualitätssicherung -- Forschung -- Ausbildung - -### Unterteilung -- Patientenspezifische medizinische Dokumente - - Patientenakte beim niedergelassenen Arzt/ im Krankenhaus - - Befunde - - Therapieplanung / Therapiedokumentation - - Verlaufsdokumentation - - Pflegedokumentation - - Krankenkassenkarte / Elektronische - - Gesundheitskarte -- Patientenunabhängige medizinische Dokumente - - Wissens- u. Fachdatenbanken (Arzneimittel, Diagn. Regeln (Leitlinien)) - - Gesundheitsberichterstattung - - Studien - - Fachliteratur - - Techn. Dokumente -- Klinische Verwaltungs-Dokumente - - Bettenplanung - - Dienstpläne des med. Personals - - Materiallisten - - OP-Pläne - - Leistungsabrechnung (DRG) - - Qualitätssicherung - -### Patientenakte -- Aufzeichnung über ambulante und stationäre Versorgung = wichtigste Form der patientenbezogenen Dokumentation -- Aufbau - - Einzeldokumente der Krankengeschichte - - chronologisch geordnet oder quellenorientiert (z.B. Labor, Bildgebung, etc.) - - Personenbezogen - - Konventionell: in Papierform (Papiersammlung, Ordner, Karteikarten) - - in Krankenhausinformationssystemen: Elektronische Patientenakte (EPA) -- Bestandteile - - Patientenstammdaten: Patientenidentifikation, Name, Geburtsname, Geburtsdatum, Adresse - - Administrative Daten: Fallidentifikation, Krankenkasse, Krankenversicherung - - Anamnese: Symptome, Beschwerden, Untersuchungs- und Behandlungsanlass - - Befunde: Laborwerte, Messdaten (Blutdruck, EKG), Bilder - - Diagnosen: Problembeschreibung, Hauptdiagnose, weitere Diagnosen - - Therapien: Medikationen, Operationen, Verordnungen - - Verlauf: zeitliche Entwicklung von Befunden, diagnostische Änderungen, Therapieplan, Therapieerfolg, Prognose - - Epikrise: zusammenfassender Rückblick und Interpretation des Krankengeschehens, oft in Form von Entlassungsdokumenten (Überweisung, Arztbrief etc.) -- Elektronische Patientenakte (EPA) - - deckt im Idealfall alle Ziele der patientenbezogenen klinischen Dokumentation ab - - Voraussetzung: - - integraler Bestand der KIS - - zentrale Patientenverwaltung (PID) - - leistungsfähige Kommunikation - - Vorteile: - - zeitgleich an mehreren Orten verfügbar - - kann nicht verloren gehen (Archivproblem) - - Daten werden multipel genutzt - - Daten können nach unterschiedlichen Kriterien präsentiert werden - - Patienten- oder krankheitsbezogene Auswertung (Arztbrief, Statistik) - -### Klinische Basisdokumentation -Krankenhäuser sind verpflichtet den Kostenträgern u.a. folgende Angaben zu übermitteln: -- Einweisungsdiagnose, Aufnahmediagnose, nachfolgende Diagnosen -- Entlassungsdiagnose -- Angaben über durchgeführte Maßnahmen, Vorschläge für die weitere Behandlung - -Motivation - Benötigt werden: -- einheitliche Klassifikationen / Nomenklaturen für die gesamte Medizin -- international anerkannt -- sprachunabhängig -- Grundlage für die Entwicklung spezieller Kataloge - -## ICD -- := Internationale Klassifikation der Krankheiten, Verletzungen und Todesursachen (ICD := International statistical Classification of diseases, injuries and causes of death (... related health problems)) -- Zweck: wichtigste weltweit anerkannte Klassifikation für Diagnosen -- Unterteilung in: Kapitel, Krankheitsgruppen, 3-stellige Krankheitsklassen, 4-stellige Krankheitsklassen -- Anwendung - - Vergütung medizinischer Leistungen - - ambulant (EBM) - - stationäre nach SGB V (DRG) - - Gesundheitsberichterstattung - - Todesursachen – Statistik - - Krankenhausdiagnosestatistik - - Morbi-RSA (Risikostrukturausgleich für Krankenkassen) - - Interne Aufgaben - - Qualitätssicherung - - Controlling - - Weitere: Arbeitsunfähigkeitsbescheinigung,... -- Aktuell ICD10, 10. Auflage der WHO - -## ICPM -- ICPM = Internationale Klassifikation der Prozeduren und Methoden in der Medizin (International classification of procedures in medicine) -- Ziel: - - bessere Kosten- und Leistungstransparenz - - erste Ansätze – operative und apparativ aufwendige Maßnahmen - - später für alle therapeutischen Eingriffe - -## OPS 301 -- := Operationsschlüssel nach § 301 SVG V -- amtliche Klassifikation zum Verschlüsseln von Operationen, Prozeduren und allgemein medizinischen Maßnahmen im stationären Bereich und beim ambulanten Operieren in Deutschland -- seit 1994 von DIMDI herausgegeben, gepflegt, jährlich aktualisiert -- verbindlich für alle Krankenhäuser zur Klassifizierung von Leistungen -- Verhandlungsgrundlage nach Bundespflegesatzverordnung (Pflegesätze, Fallpauschalen etc.) -- Anwendung - - G-DRG-System - - Fallpauschalen in der stationären Versorgung - - EBM - - Vergütungssystem in der ambulanten Versorgung - - Qualitätssicherung - - Qualitätsberichte der Krankenhäuser (ICD- und OPS-kodiert) -- Unterteilung in: Bereichsüberschriften, Kategorien, 4-/5-stellige Subkategorien - -## Krankenhausinformationssysteme -> Unter einem KIS versteht man das Teilsystem eines Krankenhauses, welches alle informationsverarbeitenden Prozesse und die an ihnen beteiligten menschlichen und maschinellen Handlungsträger in ihrer informationsverarbeitenden Rolle umfasst. Dazu gehören Hardware, Software, Personen und nicht-EDV-basierte Informationsverarbeitung -- Informationen über Patienten -- Unterstützung von Prozessen -- Wissen über Krankheiten und Wechselwirkungen -- Informationen über Qualität der Versorgung -- Informationen über Leistung und Kosten -- Unterstützung der Ausbildung und Forschung - -### KIS als Informationsmittelpunkt -- Medizin - - Diagnostik beschleunigen - - Therapie verbessern -- Pflege - - Pflege optimieren - - Personal entlasen -- Technik/Versorgung - - Zuverlässigkeit der Technik verbessern - - Versorgungsengpässe vermeiden -- Verwaltung - - Effizienz der Verwaltung erhöhen - - Qualität sichern - -- Verbundlösungen - - Krankenhaus nutzt EDV eines Serviceanbieters als Dienstleistung - - IT-Anbieter: kommunale oder firmeneigene Rechenzentren -> verschiedene Automatisierungsgrade - - Bedeutung allgemein abnehmend -- Autonome Lösung - - integriertes System mit Krhs.-eigenem Rechenzentrum - - aufgrund verfügbarer Hardware heute Standard -> verschiedene Systemarchitekturen - -Autonome Lösungen: -- Zentralrechnersysteme - - ein Zentralserver für gesamte Verarbeitung - - ansonsten nur Terminals -- Insellösungen - - separate Systeme für jeweilige Applikation - - keine Kommunikation zwischen den Einzelsystemen -- Verbundsysteme - - dedizierte, modulare Systeme - - Zentralserver zur Administration der Modulserver - - standardisierte Kommunikation zwischen den Komponenten - -### Was ist ein KIS nun in der Realität? -- Ein Krankenhausinformationssystem (KIS) ist heute eine Ansammlung von Programmen (Sub-Informationssystemen) zur Bearbeitung medizinischer und administrativer Daten im Krankenhaus. -- Ziel: Integration (Patientendaten-orientierte Abbildung aller Behandlungs- und Geschäftsprozesse im Krankenhaus im KIS) -- Praxis: - - Die Komplexität der Informationsverarbeitung im Krankenhaus und mit externen Einrichtungen ist so hoch, dass es praktisch kein monolithisches KIS gibt, dass alle Funktionsbereiche adäquat bzw. für die jeweilige Einrichtung bestmöglich abdeckt. - - Deshalb zumeist: heterogen verteilte Systeme („Best-of-Breed“) - -### Elektronische Patientenakte -- Inhalt / Funktion: - - alle Daten, die während stationärer Aufenthalte bei der Erfüllung der ärztlichen Aufgabenstellung erhoben bzw. erzeugt wurden bzw. im Wege der Übermittlung durch den Patienten gewonnen wurden, z.B. Arztbriefe, Operationsberichte, Befundunterlagen, Röntgenbilder, EKG, EEG usw. in elektronischer Form -- Merkmale: - - Selektiver Datenzugriff, virtuelle Sichten - - Elektron. Patientenakte / Krankenakte (EPA) - - Einrichtungsübergreifende EPA (eEPA) - - Elektron. Gesundkeitsakte (EGA) -- Informations-Lieferanten: - - Station / Ambulanz - - Klinik / Diagn. Informationssysteme -- Informations-Nutzer: - - Alle befugten Abteilungen - - Zentralarchiv - -- EPA – Elektronische Patientenakte - - ist eine Sammlung medizinischer und medizinisch relevanter Informationen zu einem Patienten in einer Institution, die auf digitalen Datenträgern gespeichert sind. -- eEPA – einrichtungsübergreifende EPA - - ist eine Sammlung medizinischer und medizinisch relevanter Informationen zu einem Patienten, die institutionsübergreifend auf digitalen Datenträgern gespeichert sind und im Sinne von „Shared Care“ allen an der Behandlung Beteiligten zur Verfügung gestellt werden; Arztmoderiert - - Synonym: Virtuell, Sektorenübergreifend -- eGA – elektronische GesundheitsAkte: - - Ermöglicht Eingabe von Inhalten durch Patienten selbst (Wellness, Ernährung, Home Care); Patientenmoderiert - - Synonym: PHR – Personal Health Record - -### Radiologie-Informationssystem (RIS / PACS) -- Inhalt / Funktion: - - RIS = IS zur Unterstützung des Workflows in der Radiologie -- Merkmale: - - Terminplanung - - Unterstützung radiologischer Untersuchungen (Röntgen, CT, MRT, ...) und ihrer Befundung - - Schnittstelle zu den bildgebenden Geräten und zum PACS (DICOM, DICOM MPPS) - - Dokumentation der Daten nach RöV - - Dokumentation durchgeführter Leistungen -- Informations-Lieferanten: - - Radiologe -- Informations-Nutzer: - - EPA - - Stationsarzt - - Leistungsabrechnung - -### Bildarchivierung (PACS) -- Inhalt / Funktion: - - PACS = Picture Archiving and Communication System - - Zentralarchiv für Bild- und Signaldaten -- Merkmale: - - Anbindung an RIS, aber auch CIS, Strahlentherapie, Neurologie u.a. - - Medizinische Monitore (Schnittstelle zur Befundung durch Arzt) -- Informations-Lieferanten: - - RIS -- Informations-Nutzer: - - Alle befugten Abteilungen - -### Kardiologie-Informationssystem (CIS) -- Inhalt / Funktion: - - IS zur Unterstützung des Workflows in der kardiolog. Klinik -- Merkmale: - - Terminplanung - - Unterstützung kardiologischer Untersuchungen (z.B.: Herzkatheter, EKG, ...) und ihrer Befundung - - Schnittstelle zu den Kardiologie-Geräten - - Dokumentation der Daten - - Dokumentation durchgeführter Leistungen -- Informations-Lieferanten: - - Kardiologe -- Informations-Nutzer: - - EPA - - Stationsarzt - - Leistungsabrechnung - -### Labor-Informationssystem (LIS) -- Inhalt / Funktion: - - IS zur Unterstützung der automatisierten Laboranalytik / Mikrobiologie im Krankenhaus -- Merkmale: - - Online-Auftragserfassung (HL7), Auftragsverwaltung - - Kopplung onlinefähiger Analysegeräte - - Verifizieren der Messergebnisse, Normalwerttabelle, Expertensystem - - Daten zur internen Qualitätssicherung, Statistiken, Plausibilitätsprüfungen - - Etikettendruck, Protokolldruck, Barcode - - Leistungsabrechnung -- Informations-Lieferanten: - - Labor -- Informations-Nutzer: - - EPA - - Stationsarzt - - Leistungsabrechnung - -### OP-Management -- Inhalt / Funktion: - - Planung und Dokumentation des Operationsgeschehens in den OP-Sälen - - OP-Planung: Erfassung der wichtigsten Informationen im Vorfeld, Terminierung, Personal- und Ressourcenzuordnung - - OP-Dokumentation: Dokumentation aller Daten direkt im Operationssaal (OP-Bericht) -- Merkmale: - - Anästhesieplanung - - Plausibilitätsprüfung - - Zugriff auf aktuelle OPS-Ziffern - - Effiziente OP-Auslastung (Kosten !) -- Informations-Lieferanten: - - Operateure, OP-Schwestern -- Informations-Nutzer: - - EPA, Leistungsabrechnung - - Klin. Basisdokumentation - - Labor, Matrialwirtschaft - -## Kommunikationsstandards -### DICOM -- DICOM := Digital Imaging and Communications in Medicine -- = Standard für den elektronischen Datenaustausch von medizinischen Bildern. -- Ziele: - - Offen und herstellerunabhängig - - Interoperabilität von medizinischen Geräten (Unterstützung des Datenaustausches) - - Heute auch Unterstützung anderer Dienste (Anzeige, Drucken, Speichern, Sicherheit) -- Inhalt/Definition von: - - Datenstrukturen med. Bilddaten u. zugehöriger Informationen - - Netzwerkorientierte Dienste - - Formate für den Datenträgeraustausch - - Konformitätsanforderungen an Geräte und Programme -- Inhaltliche Strukturierung - - Festlegung von Konformitätsbedingungen - - Definition von Informationsobjekten (IOD = Information Object Definition) als Abstraktion real existierender digitaler medizinischer Bilder - - Zweck des Informationsobjektes und zugehörende Attribute - - Beispiele: Computed Tomography Image IOD, Magnetic Resonance Image IOD usw. - - Definition von Serviceklassen = definierte Zusammenstellung von Befehlen (Services), die auf Informationsobjekte angewendet werden - - Datenstrukturen und Kodierung - - Nachrichtenaustausch / Netzwerkunterstützung - - Dateiformate - - Graustufen-Anzeigefunktionen - -### HL7 -= High Level 7 -- Kommunikationsstandard im Krankenhaus zum Austausch von patientenbezogenen Nachrichten, z.B.: - - Patientenregistrierungsdaten - - Untersuchungsplanung - - Befunde - - Bestellinformationen - - Abrechnungsdaten -- offene, herstellerunabhängige Kommunikationsschnittstelle -- definiert ein Protokoll auf Ebene 7 des OSI-Modells -- Ziel: Interoperabilität zwischen verschiedenen Informationssystemen im Gesundheitswesen - -ISO/OSI - Referenzmodell/Grundprinzip: -- Schicht n auf System A kommuniziert mit Schicht n auf System B -- die Sprache dieser Kommunikation ist das Protokoll -- die Kommunikation ist virtuell, d.h. der Datenaustausch findet über die darunter liegenden Schichten statt -- die Schnittstelle spezifiziert die Kommunikation zwischen den Schichten -- allen Schichten liegt das physische Medium zugrunde - -Abstract Message Definition / Encoding Rules -- Nachricht - kleinste auszutauschende Einheit zwischen zwei Systemen -- Nachrichten setzt sich aus Segmenten zusammen -- Segmente enthalten Felder getrennt durch definiertes Trennzeichen: | -- Felder enthalten Komponenten (im Falle mehrerer Komponenten getrennt durch Komponententrennzeichen: ^ -- HL7 = reiner ASCII-Text -- Jedes Segment beginnt mit 3-stelliger Zeichenfolge und wird mit beendet. -- Jede Nachricht beginnt mit dem Message Header Segment (MSH). -- Segmente können zwingend (z.B. MSH) oder optional definiert sein (je nach Nachrichtentyp). -- Zu jedem Segmenttyp ist die Reihenfolge der Felder (und somit auch die entsprechenden Datentypen) festgelegt -- Trennsymbole (Delimiter) werden am Anfang jeder Nachricht im MHS definiert - -RIM – Reference Information Model -- Objektorientiertes Datenmodell zur konsistenten Darstellung der Daten & deren Beziehung untereinander -- Sicherstellung, dass Daten in Nachrichten beim Datenaustausch von allen beteiligten Applikationen gelesen werden können - -CDA – Clinical Document Architecture -- Dokument zur Dokumentation klinischer Beobachtungen und Maßnahmen während des Behandlungsprozesses -- Ziel: standardisierte, strukturierte Übertragung klinischer Dokumente zwischen verschiedenen Informationssystemen -- Grundlage für elektronische Patientenakte, elektronische Archive usw. -- XML-basiert (Text); kann zusätzlich auch Bilder und multimediale Daten enthalten -- Eigenschaften: - - Persistenz: Unveränderlichkeit des klinischen Dokumentes über seine gesamte Lebenszeit (Verjährungsfristen) - - Zuständigkeit: nur eine am Behandlungsprozess beteiligte Person/ Organisation, erstellt und pflegt das Dokument - - Justitiabilität: Urheberschaft und Integrität sind sicher gestellt - - Gesamtheit: Die Justitiabilität bezieht sich auf gesamtes Dokument - - Lesbarkeit: Maschinen- und menschenlesbar - - Vorteile: Möglichkeit der Herausfilterung gewünschter Informationen - -### Elektronische Gesundheitskarte -- Ziele: - - Beschleunigte und kostenreduzierte Datenübermittlung zwischen medizinischen Leistungserbringern, Krankenkassen, Apotheken und Patienten - - Verbesserung der Qualität der medizinischen Versorgung, insbes. Arzneimittelsicherheit - - Stärkungen der Eigenverantwortung, Mitwirkungsbereitschaft und initiative der Patienten - - Steigerung der Wirtschaftlichkeit und Leistungstransparenz im Gesundheitswesen -- Das ist neu: - - Konzept: eGK + HBA + Telematikinfrastruktur - - eGK = Smartcard (Mikroprozessorchip) - - 32 kB Speicher - - Administrativer Pflichtteil und freiwilliger medizinischer Teil -- Welche Daten enthält die Karte? - - Versichertenstammdaten - - Ausstellende Krankenkasse inkl. Kennzeichen für die zum Wohnsitz des Versicherten - - zugehörige Kassenärztliche Vereinigung - - Familienname, Vorname - - Geburtsdatum - - Geschlecht - - Anschrift - - Krankenversichertennummer - - Versichertenstatus - - Zuzahlungsstatus - - Ablaufdatum der Gültigkeit der Karte - - Die eGK enthält Schlüssel und Zertifikate - - für eine elektronische Signatur (optional) - - für Authentisierungszwecke - - für Verschlüsselung und Aufbau sicherer versichertenbezogener Kommunikationskanäle -- Pflichtanwendungen der eGK - - Versichertenstammdaten - - EHIC – European Health Insurance Card - - Elektronisches Rezept -- Freiwillige Anwendungen - - Daten für die Notfallversorgung - - Elektronischer Arztbrief - - Arzneimitteltherapiesicherheit - - Elektronische Patientenakte - - Dokumentation des Versicherten (Patientenfach) - - Patientenquittung - - Organspenderausweis - - weitere ... - -### Weitere Karten: -Heilberufsausweis (HBA)\ -Der Heilberufsausweis HBA (Engl.: Health Professional Card - HPC) enthält Schlüssel und Zertifikate -- für eine qualifizierte elektronische Signatur -- für Authentisierungszwecke -- für Verschlüsselung und Aufbau sicherer Kommunikationskanäle bezogen auf eine Person aus dem Bereich Gesundheit (Arzt, Apotheker, etc.) - - Apotheker - - Ärzte - - Zahnärzte - -Security Modul Card\ -Die SMC (Security Module Card) enthält Schlüssel und Zertifikate -- für eine elektronische Signatur -- für Authentisierungszwecke +--- +title: Einführung in die medizinische Informatik +author: Robert Jeutter +--- +# Einleitung +>"Medizinische Informatik ist die Wissenschaft von Informationsverarbeitung und der Gestaltung informationsverarbeitender Systeme in der Medizin." + +Detaillierter: +>"Die Medizinische Informatik ist die Wissenschaft der systematischen Erschließung, Verwaltung, Aufbewahrung, Verarbeitung und Bereitstellung von Daten, Informationen und Wissen in der Medizin und im Gesundheitswesen. Sie ist von dem Streben geleitet, damit zur Gestaltung der bestmöglichen Gesundheitsversorgung beizutragen." (GMDS = Deutsche Gesellschaft für Medizinische Informatik, Biometrie und Epidemiologie) + +Damit die nötigen Daten und Informationen und das benötigte Wissen fachgerecht erfasst, aufbewahrt, abgerufen, verarbeitet und verteilt werden können, entwickeln, betreiben und evaluieren Medizinische Informatiker/innen Infrastrukturen, Informations-und Kommunikationssysteme einschließlich solcher für Medizintechnische Geräte. + +## Die Einsatzfelder medizinischer Informatik nach dem Prozess der Entscheidungsfindung in der Medizin: +- **Physiologische oder phatologische Zustände** => Messen + - Biosignalerfassung + - Bioelektrische und nicht elektrische Signale + - Physiologische Ursache dieser Signale + - Messverfahren, Ableitungen + - Anforderungen an Hard- und Software + - Bildgebung + - Bildgebenden Verfahren (Modalitäten) + - Indikationen zur Anwendung (Was kann womit gut erkannt werden?) +- **Signal/Bild** => Analyse + - Biosignalverarbeitung und Bildverarbeitung + - Vorverarbeitung, Signalkonditionierung + - Ereignisdetektion, Merkmalserkennung + - Klassifikation, Segmentierung + - Parameterextraktion, Kopplungsanalyse +- **Merkmale** => Entscheidung + - Expertendatenbanken + - Therapieplanung und Therapieüberwachung + - Bestrahlungsplanung + - Medikamentendosierung + - Leitlinien +- **Diagnose/Therapie** => Dokumentation + - Datenübertragung, Datenspeicherung, Dokumentation + - Übertragung von Aufträgen (HL7) + - Übertragung von Bildinformationen (DICOM) + - Datenmanagement im Gesundheitswesen + - Elektronische Patientenakte + - Elektronische Gesundheitskarte + - Krankenhausinformationssysteme + - OP-Planungssystem + - Laborinformationssystem + - Radiologie-Inf.-syst. (RIS) + - Patientenverwaltung + - Bettenplanung + - Personalverwaltung + - Telemedizin + - Home-Monitoring + - Tele-Chirugie + - Biostatistik +- **Kommunikation, Archivierung** + +## Motivation + + - 50% Arbeitszeit von Mediziner: Suche, Erfassung und Wiedergabe von Informationen + - 39% der Gesamtaufwendungen eines Krankenhauses für Informationsverarbeitung + - 20% der Arbeitszeit: für Suche nach früheren Informationen + - 10% der Laborergebnisse erreichen nie den Stationsarzt + - 80% der Patienten bei Übergabe (Einweisung, Überweisung) mit unvollständigen wichtigen Informationen + - Noch nicht ausgeschöpftes Potenzial: bis zu 20% Kostenreduktion, bis 300% Erhöhung des Patientendurchsatzes + + + +# (Entstehung und) Erfassung bioelektrischer Signale + +| Bioelektrische Signale | Nichtelektrische Signale | +|:--:|:--:| +| EGK | Blutdruck | +| EEG | Herminutenvolumen | +| EMG | Temparatur | +| ERG, EOG, VEP, ... | Augeninnendruck, ... | + +Merkmale bioelektrischer Signale: +- Unmittelbare Information über Vorgänge an Nerven und Muskeln +- Repräsentation physiologischer und pathologischer Veränderungen => Globale und detaillierte Beurteilung der Organfunktion +- Zumeist nichtinvasiv (Signalableitung an der Körperoberfläche) => Geringe Belastung für den Patienten +- Kostengünstig + +Quellen/Ursprung bioelektrischer Signale: Nerven und Muskeln +| ![Von Quasar Jarosz in der Wikipedia auf Englisch, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=7616130](Assets/640px-Neuron_Hand-tuned.svg.png) | ![Von Action_potential.svg: Original by en:User:Chris 73, updated by en:User:Diberri, converted to SVG by tiZomderivative work: de:Benutzer:Jnns - Action_potential.svg, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=10316004](Assets/Aktionspotential.svg)| +| -- | -- | + +Beide Gewebearten haben spezielle Eigenschaften: +- Erregbarkeit + - elektrisch + - mechanisch + - chemisch +- Erregungsfortleitung: + - innerhalb der Zelle vom erregten Abschnitt zum benachbarten Abschnitt + - von Zelle zu Zelle + +Aktionspotential +- Ursachen: + - Ionenpumpen (insbes. Kalium-Natrium-Pumpe) + - Selektive Permeabilität von Ionenkanälen + - Chemische und elektrische Gradienten (Potentiale) + - Messung des Zellinneren gegen das Zelläußere! +- Ruhepotential + - ist das elektrische Potential (Potentialdifferenz) an einer Membran nach Einstellung des elektrochemischen Gleichgewichts (Betrag des elektrischen Potentials = Betrag des chemischen Potentials). + - Ursache (I): + - Kalium-Natrium-Pumpe(pro ATP: 3 Na+-Ionen nach außen und nur 2 K+-Ionen nach innen) + - Ursache (II): + -Natriumkanäle geschlossen => keine (nur sehr geringe) Diffusion von Na+ nach innen + -Kaliumkanäle offen => Diffusion von K+-Ionen nach außen entlang des chemischen Gradienten und entgegen des elektrischen Gradienten => Einstellung des elektrochemischen Gleichgewichts +- Depolarisation wenn Störung des Ruhepotentials (z.B. durch elektrische Erregung) über das Schwellwertpotential (-55 mV) hinaus, dann + - => Öffnung der spannungsabhängigen Natriumkanäle + - => Einschießen von Na+ ins Zellinnere (schneller Prozess) + - => Umpolarisieren des Membranpotentials bis zur Einstellung des Natrium-Gleichgewichtspotentials +- Repolarisation: + - Schließen der Natriumkanäle + - Öffnen der Kaliumkanäle + - => Austrittvon K+ aus dem Zellinneren (langsamer Prozess) +- Plateau (Herzmuskelzelle) + - zusätzliches Einströmen von $Ca^{2+}$-Ionen ins Zellinnere (langsamer Prozess) + - Verzögerung der Repolarisation + - Ausbildung eines Plateaus (Refraktärzeit der Herzmuskelzelle) + + +### Elektrophysiologische Untersuchung +Elektrophysiologische Untersuchungen werden in drei Teilgebiete unterteilt: +- **Zentralnervensystem** => Elektroenzephalographie (EEG) +- **Herz** => Elektrokardiographie (EKG) +- **Muskulatur** => Elektromyographie (EMG) + +weitere Biosignale: +- Retinale Potentiale: Ableitung elektrischer Potentiale am Auge + - **Elektrookulogramm(EOG)**: Erfassung von Augenbewegungen, Ableitung an den Lidwinkeln + - **Elektroretinogramm(ERG)**: retinaleelektrische Antwort auf Lichtreizung, Ableitung: Cornea => Schläfe +- Evozierte Potentiale: Prüfung einzelner Sinnesfunktionen bzw. deren zentralnervöse Strukturen durch gezielte Stimulation + - somatosensorisch evozierte Potentiale (SEP) + - akustisch evozierte Potentiale (AEP) + - visuell evozierte Potentiale (VEP) + - => Gesichtsfelduntersuchung (Perimetrie) + + +## Elektroenzephalogramm (EEG) +Elektroenzephalogramm (EEG) ist die Ableitung der elektrischen Aktivität (Potentialschwankungen) des Gehirns an der Kopfoberfläche.\ +Elektrokortikogramm (ECoG) ist die Ableitung der elektrischen Aktivität direkt am Kortex(z.B. bei operativen Eingriffen) + +### Signalkomponenten +Die verschiedenen Ryhtmen (Frequenzbänder) können beim EEG immer bestimmten Zuständen zugeordnet werden: +| Bezeichnung | Frequenz | Zustand | Spannung | betreffend | +|:--:|:--:|:--:|:--:|:--:| +| Delta | 1-4Hz | Tiefschlaf | <200 müV | ganzer Cortex | +| Theta | 4-8 Hz | Schläfrigkeit, psychische Störung | <100 müV | parietal | +| Alpha | 8-13 Hz | Ruhe und Entspannung | <50 müV | okzipital | +| Beta | 13-35 Hz | Aktivität, Denken | <50 müV | frontal, parietal | +| Gamma | 35-100 Hz | starke Konzentration, Lernprozess | | | + +![Aufmerksamkeitsbedingte Veränderungen](bilder/516.png) +### Positionen zur EEG Ableitung +| ![Von Brylie Christopher Oxley - https://commons.wikimedia.org/wiki/File:International_10-20_system_for_EEG-MCN.svg, CC0, https://commons.wikimedia.org/w/index.php?curid=86731792](Assets/805px-International_10-20_system_for_EEG-MCN.png) | ![Von Albert Kok in der Wikipedia auf Niederländisch - Übertragen aus nl.wikipedia nach Commons., Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=2213404](Assets/10-20.PNG) | +| :--: | :--: | +| ![Von Der ursprünglich hochladende Benutzer war MBq in der Wikipedia auf Deutsch - Henry Gray (1825–1861). Anatomy of the Human Body. 1918., Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=11794362](Assets/Gray_Surface-head.jpg) | | + +### Diagnostischer Informationsgehalt +Anwendungsgebiete in Diagnostik und Therapie: Epilepsie, Objektive Perimetrie (objektive Vermessung des Gesichtsfeldes), Neurofeedback, Narkosetiefe, Schlafmedizin (Polysomnographie), Kognitionsforschung (Gedächtnisprozesse), Hirntodbestimmung, Schlaganfall, Tumore, Hirnreifung, Psychiatrische Erkrankungen + + +## Elektrokardiogramm (EKG) +Elektrokardiogramm ist der zeitliche Verlauf der an der Körperoberfläche abgeleiteten Potentialschwankungen des Herzens +- nichtinvasive Ableitung +- relativ geringer zeitlicher und personeller Aufwand +- am häufigsten abgeleitetes Biosignal +- außerdem: + - Ösophagus-EKG => EKG-Ableitung in der Speiseröhre + - Intrakardiales EKG => EKG-Ableitung am offenen Herzen + +|![Von Tvanbr - Eigenes Werk, Gemeinfrei, https://commons.wikimedia.org/w/index.php?curid=11616158](Assets/1117px-Anatomy_Heart_Latin_Tiesworks.jpg) | ![Von Kalumet - selbst erstellt = Eigenes Werk, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=438152](Assets/ECG_Principle_fast.gif) | +| -- | -- | +| Anatomie des Herzens | EKG-Komponenten einer Herzperiode | + + +### Physiologie/Signalkomponenten einer Herzperiode +| EKG Komponente | Physiologie | charakterist. Merkmale | +| -- | -- | -- | +| P-Welle | Erregung der Vorhöfe | kleine positive Welle | +| PQ-Strecke | Zeit vom Beginn der Vorhoferregung bis zum Beginn der Kammererregung, sog. Erregungsüberleitungszeit| verläuft auf der isoelektrischen Linie; PQ-Dauer ist abhängig von der Herzfrequenz | +| QRS-Komplex | Kammererregung, besteht aus Q-Zacke, R-Zacke und S-Zacke | Form des QRS-Kompl. ist bei den Extremitätenableitungen abhängig von der Herzachse | +| ST-Welle | Zeit, in der die gesamte Kammermuskulatur erregt ist | verläuft normalerweise auf der isoelektrischen Linie | +| T-Welle | Rückbildung der Kammererregung | breiter und flacher als der QRSKomplex, da die Rückbildung nicht über feste Bahnen verläuft | +| U-Welle | Nachschwankung der Kammererregungsrückbildung | sehr klein und nicht immer registrierbar | + +### Widerspieglung des Errregungsablaufs (Herzzyklus) im EKG +- Elementarvektor = Vektor, der die Erregung einer einzigen Muskelfaser widerspiegelt +- Summationsvektor = Resultat mehrerer Vektoren nach dem Kräfteparallelogramm +- elektrische Herzachse = Gesamtsummationsvektor bei Erregung der Herzkammern +- Modellierung als Dipol = Summe elementarer Dipole einzelner Herzmuskelzellen extrazellulär, d.h. + =: unerregt; - =: erregt + +### EKG Ableitungen +#### Extremitätenableitung nach Einthoven +- bipolare Ableitung +- Ableitungsbezeichnungen: I, II und III +- Ableitorte: rechter Arm (rot), linker Arm (gelb), linker Fuß (grün) + +#### Extremitätenableitung nach Goldberger +- unipolare Ableitung +- Ableitungsbezeichnungen: aVR, aVL, aVF +- Projektion der Frontalebene (um 30 Grad gegenüber Einthoven-Ableitung gedreht) + +#### Thorax-Ableitung nach Wilson +- unipolare Ableitung +- Ableitungen: V1 ... V6 (Standard) +- Projektion der Horizontalebene +- Referenzelektrode: Herzmitte => hochohmige Zusammenschaltung der Extremitätenableitung + +nach Wilson: ![Von Jmarchn - modified from Precordial_Leads.svg and Rib_Cage (Jeroen Hut), CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=9426668](Assets/Precordial_Leads_2.svg) + + +#### Altersabhängigkeit der Herzachse +- elektrische Herzachse = Gesamtsummationsvektor bei Erregung der Herzkammern +- Rechtstyp (RT): Säuglings- und Kindesalter +- Steiltyp (ST): jugendliches Alter +- Mitteltyp (IT): jüngeres Erwachsenenalter +- Linkstyp (LT): Erwachsenenalter und ältere Menschen +- Überdrehte Rechts- u. Linkstypen (ÜRT, ÜLT) sind pathologisch + +### Diagnostischer Informationsgehalt +Morphologische Untersuchung und Herzfrequenz Analyse +- Herzinfarkt + - Verengung oder Verschluß eines koronaren Herzkranzgefäßes + - deutliche Hebung der ST-Strecke + - Verschmelzung mit folgender T-Welle ("monophasische Deformierung") +- Extra-Systolen + - frühzeitig auftretender Extraschlag aus dem Kammerbereich + - Einsetzen eines verbreiterten und deformierten QRS-Komplexes + - kompensatorische Pause, weil Sinusrhythmus in Takt ist +- AV-Block + - Störung der Erregungsleitung zwischen Vorhof und Kammer + - Grad 1: PQ-Verlängerung + - Grad 2: gelegentlicher (Typ Wenkebach) oder regelmäßiger (Typ Mobitz) Ausfall eines Kammerschlages + - Grad 3: Keine Kopplung zw. Vorhof- u. Kammererregung => Schrittmacher + +### Digitale EKG Signalanalyse +EKG-Signaleigenschaften +- R-Zacke = zentraler Punkt im QRS-Komplex + - hat in der Regel die größte Amplitude und den größten Anstieg bzw. Abfall + - -> hebt sich somit meist als Peak hervor (Polarität kann verschieden sein) +- Amplitudenbereich : 0,5 - 4 mV (ortsabhängig) +- Frequenzbereich EKG : 0,2 - 150 Hz +- Frequenzbereich QRS-Komplex : 5 - 30 Hz +- Dauer eines QRS-Komplexes : 60 - 100 ms +- zu wählende Abtastfrequenz ist abhängig vom Zweck der Untersuchung + - z.B. Spektralanalyse des QRS-Komplexes zur Analyse von Spätpotentialen -> hochauflösendes EKG : 1 - 2 kHz + - zur Herzrhythmusanalyse : 200 - 500 Hz ausreichend + + +Grundprinzip QRS-Detektion: Roh-EKG -> Vorverarbeitung -> QRS-Detektion (inkl Signal Transformation) + +- maximaler, mittlerer und minimaler RR-Abstand: $RR_{min}, RR_{max}, \overline{RR}$ +- Standardabweichung der RR-Abstände: $S_{RR}= \sqrt{\frac{1}{n-1} * \sum_{i=1^n}(RR_i - \overline{RR}^2)}$ +- Variationskoeffizient: Quotient aus Standardabweichung und mittlerem RR-Abstand $VK=\frac{S_{RR}}{\overline{RR}}$ +- RMSSD (root mean squared successive difference) = Kenngröße zur Quantifizierung der Variationen aufeinanderfolgender RR-Abstände $RMSSD = \sqrt{\frac{\sum_{i=1}^{n-1} (RR_{i+1}-RR_i)^2}{n}}$ +- BB50 (pNN50): relativer Anteil [%] von aufeinanderfolgenden RR-Abständen, mit Differenz größer als 50 ms +- MCR: Betrag des mittleren Summenvektors aller event-Vektoren auf dem Atemperioden-Einheitskreis +- E/I-Quotient: mittlerer Quotient aus längstem RR-Abstand während forcierter Expiration und kürzestem RR-Abstand während forcierter Inspiration; spez. Kenngröße der Respirationsphase +- 30/15-Quotient: Quotient aus dem längsten RR-Abstand etwa um den 30. Herzschlag und dem kürzesten RR-Abstand etwa um den 15. Herzschlag nach Aufstehen; Kenngröße zur Charakterisierung der Orthostasereaktion +- Herzfrequenvariabilität (HRV) + - VLF $<= 0.04$ Hz: Thermoreg. Einflüsse + - LF $0.04- 0.15$ Hz: Barorezeptorische Einflüsse + - HF $0.15 - 0.4$ Hz: Resp. Sinusarrhythmie (RSA) +- Intervall-Tachogramm: Problem: keine äquidistante Impulsfolge -> kontinuierliches Herzfrequenzsignal notwendig + + +## Elektromyogramm (EMG) +elektrische Aktivität hervorgerufen durch Muskelaktivität. Gemessen über Oberfläche oder mit Nadel +### Motorische Einheit +- := einzelnes Motoneuron (Nervenzelle + Nervenfaser) inkl. seiner innervierten Muskelfasern +- Das Feuern eines Motoneurons bewirkt die Kontraktion mehrerer Muskelfasern +- Die Kraft der Muskelkontraktion wird gesteuert durch: + - die Anzahl der erregten Axone (Rekrutierung) + - die Frequenz der Aktionspotentiale auf jedem Axon (Frequenzierung) +- MUAP: Aktionspotential motorischer Einheiten + +### Grobmotorik vs. Feinmotorik +- **Grob**: Wenige ME mit vielen Muskelfasern pro ME z.B. Oberschenkelmuskel (bis zu 2000 Muskelfasern) +- **Fein**: Viele ME mit wenigen Muskelfasern pro ME z.B. äußere Augenmuskeln (4–40 Muskelfasern) + +### Übersicht + +- Oberflächen EMG + - Ableitung des Summenaktionspotentials eines Muskels oder Muskelanteils über Einzelelektronen +- Nadel EMG + - Fine-Wire-Elektroden: + - Nadel mit Elektrodenfäden einführen + - Nadel entfernen, Elektroden verbleiben unter Haut + - Fäden mit Federn verbinden (bzw elektronischem Schaltkreis) + + +### Signalanalyse +- Spektralanalyse -> Abfall der mittleren Frequenz als Ermüdungsindex +- Amplitudenzeitverlauf -> gleitende Fensterung + + +# EKG-Verstärker +Welcher Besonderheiten sind bei der Hardwareentwicklung zu beachten? + +Zur Erinnerung: +- Amplitude: 0,5 – 4mV +- Frequenzbereich: 0,2 -150Hz +- Auflösung: 2ksps + +Störeinflüsse: +- **Kapazitive Kopplung** Netzinstallation, Leuchtstofflampen +- **Induktive Kopplung** Patientenkabel +- **Galvanische Kopplung** Reeller ohmscher Widerstand (Isolationswiderstand), Masseleitung der Messgeräte (Masseschleife) +- **Elektromagnetische Störungen** Multimediainstallationen (Mobilfunk, Netzwerktechnik,...) + +Gegenmaßnahmen: +- Maximal möglicher Abstand +- Maximale Erhöhung der Erdisolation des analogen Front-End +- Software implementierter Notchfilter (50 Hz / 60 Hz) -> besser als Hardware, wegen Übertragungsfkt. +- Primäre Spezifikation ist das Eingangsrauschen (input referred noise: 30mü VRMS bei einer Bandbreite von 150 Hz) +- Schirmung mit Hilfe eines Faraday'schen Käfig +- Anwendung der Guarding-Technologie +- Sternförmiger Massepunkt als Verbindung zwischen analoger und digitaler Masse +- Schirmende Masseflächen zwischen Signalleitungen + +## Systemkonzept +Komponenten:\ +Medizinisches Messobjekt --> Verstärker --> Filter --> ADC (analog to digital) + +Signalpegelanpassung +- Wandler und ADC lassen sich meist nicht direkt verbinden -> Anpassung durch Verstärker +- Anpassung des Ausgangsspannungsbereich von Transducer an Eingangsspannungsbereich ADC +- Oft Veränderung des DC-Levels bis das Signal optimal in den Eingangsspannungsbereich des ADC passt + +## Low vs High Resolution +### Low-­Resolution (< 16‑bit) ADCs +- Einsatz rauscharmer Verstärker (mehrstufig) -> erste Stufe bestimmt im Wesentlichen das Rauschen des gesamten Verstärkers +- hohe Signalverstärkung (~500) +- Verstärkerrauschen darf das System nicht dominieren +- Dynamik des Signal muss in Verstärkerkette bereits berücksichtigt werden +- Problematisch: DC-Anteil (oft Filterung, besser ohne) + +### High-­Resolution (24‑bit) ADCs +- niedrige Signalverstärkung (~5) +- schwaches Signals wird durch Wandlung mit hochauflösenden ADC kompensiert +- gutes Handling vom DC-Anteil möglich +- weniger Hardwarekomponenten nötig -> Kostenersparnis und 'state of the art' + +## Funktionen beim EKG +- Erkennung schlechter Elektrodenkontakt (Lead-off detection ) +- Gleichanteil entfernen (DC removal) +- Multi band-pass Filterung +- ECG leads formation +- QRS-Detektion +- Visualisierung des EKGs auf einem Display +- Kommunikationsports: UART, SPI, I2C, External memory interface (EMIF) +- Detektion und Entfernen des Schrittmacherimpuls + +## Lead off Detektion +- Überwachung des Elektrodenkontaktes (außer dem rechtem Bein - Bezug) +- Die EKG-Elektroden sind an einem hochohmigen Pullupwiderstand (> 10 M) angeschlossen +- Abriss der Verbindung = Anstieg Spannung auf VCC +- Komperator mit Schwellspannung +- Überschreitung = Interrupt am Mikrocontroller + +![Von Ernstl - Eigenes Werk, CC BY-SA 2.5, https://commons.wikimedia.org/w/index.php?curid=625305](Assets/960px-Defibrillator_Monitor_Closeup.jpg) + +# Pulsoximetrie +- Die Versorgung der Organe mit Sauerstoff ist für den Organismus von entscheidender Bedeutung. +- Medizinisches Interesse besteht an der Überwachung der Oxigenierung des Blutes +- -> Pulsoximetrie + - Nicht-invasives Messverfahren + - Kontinuierliche Erfassung der Sauerstoffversorgung des arteriellen Blutes + - Prozentuale Angabe des oxygenierten Hämoglobin am Gesamthämoglobin + +## Definition Sauerstoffsättigung +- Funktionelle Sauerstoffsättigung $SO_2 = \frac{HbO_2}{Hb + HbO_2}$ + - Verhältnis vom sauerstoffbehaftetem zum gesamten Hämoglobin + - Beim gesunden Menschen 94-98 % + - Je nach Sauerstoffsättigung -> Änderung der opt. Eigenschaften +- Fraktionelle Sauerstoffsättigung $SO_2 = \frac{HbO_2}{Hb + HbO_2 + COHb + MetHb}$ (liefert die 'richtigere' Messung da mehr berücksichtigt) + +(Hb = Hämoglobin; $O_2$ = Sauerstoff) + +## Lambert Beer Gesetz +Lichtquelle (einfallende Lichtintensität $I_0$) Durchstrahlt Medium (Weglänge des Lichts $d$). Photodiode auf anderer Seite des Mediums misst übriges Licht (Lichtintensität $I$). +- $\epsilon(\lambda)$ Extinktionskoeffizient in L $mmol^{-1}cm^{-1}$; +- $c$ Konzentration in $mmol^{-1}$ +- $I = I_0 * e^{-\epsilon(\lambda)cd}$ +- in Medium: $I(x)=I_0e^{-\epsilon(\lambda)c(x-a)}$ +- Transmission $T= \frac{1}{I_0} = e^{-\epsilon(\lambda)cd}$ +- Absorption $A = -ln(T) = \epsilon(\lambda)cd$ +- Mehrfachabsorption $A_{tot}=\epsilon_1 (\lambda) c_1 d_1 + \epsilon_2 (\lambda) c_2 d_2 +...+ \epsilon_n (\lambda) c_n d_n$ + +(Hinweis für die Klausur: Lernt die Funktionsbezeichnenden Bilder!) + +## Normierung +Um Rotes und Infrarotlicht zu normieren und vergleichbar zu machen, benötigt man folgende Formel: +$I_n=\frac{1}{I_H}= e^{-[\epsilon_{Hb} (\lambda)c_{Hb} + \epsilon_{HbO_2} (\lambda)c_{HbO_2}] \Delta d}$ + +## Sensorik +### Lichtquelle & Empfänger +Für nichtinvasive Messung werden Körperstellen gewählt, bei denen arterielle Blutgefäße zugänglich sind, z.B. Finger, Zeh, Ohrläppchen. +- Laser + - Vorteil: hohe Lichtausbeute und nahezu monochromatisches Licht + - Nachteil: preisintensiv und schwer zu regeln + - -> eher ungeeignet +- LED + - Vorteil: guter Wirkungsgrad, relativ schmales Spektrum, kleine Bauform + - Nachteil: Temperaturabhängigkeit der mittleren Wellenlänge + - -> geeignet + +#### LED Prinzip +- physikalisch: + - emittierte Licht entsteht bei der Rekombination von Elektron-Loch-Paaren und ist dabei materialspezifisch + - größere Wellenlängen besonders wichtig für Medizin -> größere Eindringtiefe in Gewebe (rot, infrarot) + - Abstrahlcharakteristik: Wiedergabe der Winkelabhängigkeit in normierter Form (bezogen auf die maximale Strahlstärke) +- Temperaturabhängigkeit: + - Abnahme des Wertes der Energielücke bei zunehmender Temperatur -> Verschiebung des Emissionsmaximums zu höheren + - Wellenlängen $E=h*f$ und $c=\lambda * f \rightarrow E=h/\lambda$ (h=plansches Wirkungsquantum; ) + - Zunahme der mittleren kinetische Energie der Elektronen bzw. Löcher mit zunehmender Temperatur, d.h. die Elektronen und Löcher halten sich weniger an den Bandkanten auf + +#### Photodiode +- Photodioden sind Halbleiter aus Silizium, welche für Photonen und hoch-energetische Partikel sensitiv sind +- Absorption der Energie unter Umwandlung in elektrische Ladung +- Sensitivitätsbereich: 1pW/cm2 bis 100mW/cm2 +- Vielseitiger Einsatz: Spektroskopie, Fotosensoren, optische Positionssensoren, Oberflächencharakterisierung, optische Datenübertragung, Medizinische Bildgebung, Dosimetrie, … +- Unterscheidung der Wellenlängen nur durch Filter möglich! Nicht durch Diode selbst + +### Verstärkerschaltung +Ausführungen einer Photosensorschaltung: +- Elementbetrieb (für Pulsoximeter zu langsam) +- Vorgespannter Betrieb (pin-Photodiode, Schottky-Photodiode, Avanlanch-Photodiode) + +Photodioden werden meist elektrisch Vorgespannt, indem sie an eine Negative Spannungsversorgung angeschlossen werden. +1. Transimpedanzverstärker +2. Invertierender Spannungsverstärker +Für Hochgeschwindigkeitsanwendungen +- Besonders große Vorspannung -> begrenzt durch Sperrspannungsfestigkeit der Diode +- Großer Lichtstrom benötigt + +# Grundlagen der Biosignalverarbeitung +## Analog-Digital-Wandlung +- Abtastung und Quantifizierung + - Auflösung: N Bit + - Referenzspannung: $U_{Ref}$ + - Quantisierungsintervall: $q=A_{LSB} = \frac{U_{Ref}}{2^N}$ + - Wertebereich: $0... (2^N -1)*U_{LSB}$ +- Komponenten +- Wandlungsprinzipien + - direktvergleichende ADC + - Wägeverfahren: Sukzessive Approximationswandler + - Abtastung durch Sample & Hold-Schaltung + - Sukzessive Annäherung einer mittels DAC erzeugten Spannung an die zu messende Spannung (von $U_{MSB}\rightarrow U_{LSB}$ ) + - DAC-Eingangswert entspricht Messwert + - parallele Verfahren: Parallelwandler + - Komparatoren: $(2^N-1)$ + - Widerstände: $(2^N-2)*R$ + - $R_{Ges}=2^N*R$ + - Komparatoren vor D-Flip-Flops -> "Digitales Abtast-/Halteglied" + - Zählverfahren + - u/t-Umsetzer: Dual-Slope-Wandler/ Multi-Slope-Wandler + - $u_2= -\frac{1}{RC} \int u_1(t) dt$ und $u_x=u_{Ref}*\frac{T_x}{T_{int}}$ + - u/f-Umsetzer: Sigma-Delta-Wandler + - $U_{Int}(t) = \int (U_{IN}-U_x) dt$ +- Auswahlkriterien von AD-Wandlern + - relevantere Parameter + - Auflösung und Abtastrate (Wandlungsprinzip) + - Genauigkeit (DC Accuracy) + - Dynamische Eigenschaften (AC Accuracy) + - Stromaufnahme, Verlustleistung + - Dateneingänge (Eingangspegel, Anzahl ADC je Chip, Speisung) + - Datenausgabe (seriell, parallel, Ausgangspegel, Codierung) + - Spezielle Eigenschaften (z.B. Isolation) + - Sonstiges (Arbeitstemperatur, Gehäuse, Größe, Preis, ...) + - Externe Beschaltung und Ansteuerung + - Anzahl der Analogeingänge + - Single-, Dual-, Quad-, Octal-ADC,..., 128 Channels + +## Grundlagen digitaler Filter +LTI -(Lineare zeitinvariante diskrete)- Systeme + - Zeitdiskrete Filter sind Realisierungen von linearen zeitinvarianten (LTI) diskreten Systemen + - Zeitdiskretes System: zeitdiskretes Eingangssignal x[n] -> zeitdiskretes Ausgangssignal y[n] + - Linearität & Zeitinvarianz ($x[n-i]\rightarrow y[n-i]$) + - Ein LTI-System kann mittels seiner Impulsantwort g[n] charakterisiert werden + - Eingangssignal: Einheitspuls δ[n] + - Beachte: Die Impulsantwort wird in der Literatur auch oft mit h[n] symbolisiert. + - Ein LTI-System ist kausal, wenn gilt: $g[n] = 0$ für $n < 0$ + - Sprungantwort: $h[n]=\sum_{m=-\infty}^n g[m]$ + - Das Ausgangssignals eines Filters ergibt sich aus der Faltung des Eingangssignals mit der Impulsantwort des Filters. + +FIR -(Zeitdiskrete)- Filter +- Lineare Differenzgleichung + - $$y[n] = -\sum_{i=1}^M a_i*y[n-1] + \sum_{i=0}^N b_i*x[n-i]$$ + - Rekursiver Teil (Rückkopplung) + Nicht-Rekursiver-Teil +- im Blockdiagramm + - Multiplikation: $y[n]=b*x[n]$ + - Zeitverzögerungsglied: $y[n]=x[n-1]$ + - Addition: $y[n]=x_1[n]+x_2[n]$ +- Merkmale eines FIR-Filters + - Impulsantwort besitzt endliche Länge (Finite Impulse Response) + - Keine Rückkopplung (keine Rekursion)* + - Impulsantwort = Filterkoeffizienten + - Immer stabil (Pole liegen immer im Ursprung) + - Linearer Phasengang im Falle symmetrischer / antisymmetrischer Filterkoeffizienten + - Hohe Flankensteilheiten sind im Vergleich zu IIR-Filtern nur mit hohem Rechenaufwand (große Filterordnung) realisierbar + +IIR -(Zeitdiskrete)- Filter +- Merkmale eines IIR-Filters + - Impulsantwort besitzt unendliche Länge (Infinite Impulse Response). + - Besitzt Rückkopplungszweig (d.h. rekursive Berechnung) + - Können instabil sein (wenn nicht alle Pole innerhalb des Einheitskreises liegen) + - Meist nichtlinearer Phasengang + - Hohe Flankensteilheiten sind mit weniger Rechenaufwand realisierbar als mittels FIR-Filter +- Frequenzgang -> Filter-Grundtypen + - Hoch/Tiefpass + - Bandpass/sperre +- Grundlagen der Filtertheorie + - Übertragungsfunktion: $G(j\omega) = \frac{U_2(j\omega)}{U_1(j\omega)} = |G(j\omega)|*e^{j\omega \phi}$ + - Amplitudenfrequenzgang: $|G(j\omega)|= \sqrt{Re{G(j\omega)}^2 + Im{G(j\omega )}^2 }$ + - Phasenfrequenzgang: $\phi(\omega) = arctan \frac{Im{G(j\omega)}} + - Grenzfrequenz: $\omega = \frac{1}{RC}$ +- Sinn: das Eingangssignal erscheint am Ausgang eines Tschebysheff-Filters wegen nichtkonstanter Gruppenlaufzeit verzerrt + - Die Form der Biosignale ist diagnostisch relevant, Formverzerrungen können zur falschen Diagnose führen + +# Bildgebende Systeme in der Medizin +- radiologische BS + - Röntgenstrahlung + - Gammastrahlung +- nichtradiologische BS + - Licht (Foto, Endoskop, Mikroskop) + - Infrarot: Thermographie + - HF: MRT + - Ultraschall: US-BS +- Ziel + - Visualisierung (dem menschlichen Auge sichtbar machen), + - Quantifizierung (diagnostisch relevanter Parameter von Bau und Funktion) des menschlichen Körpers, meist des unsichtbaren Körperinneren. + - in möglichst allen Dimensionen (u, v, w, t) + - in möglichst allen Größenordnungen (makroskopisch, mikroskopisch) + - möglichst nichtinvasiv + +## Röntgen +Begriffe/Technik einer Röntgendiagnostikeinrichtung (DIN6814): +- Anwendungsgerät + - Röntgenstrahler + - Röntgenröhre + - Röntgenröhrenschutzgehäuse + - Bildwandler (auf präpariertes Papier/Kasette/digitaler Empfänger) +- Zubehör + - Zusatzfilter + - Tiefenblende + - Lichtvisier +- Röntgengenerator + - Hochspannungserzeuger + - Schalttisch + +Röntgendiagnostischer Prozess +| Prozess | Ziel | Nutzen | +| -- | -- | -- | +| Erzeugung | des latenten Strahlenbilds | Abbildungsfunktion, Objektkontrast, Bewegungsunschärfe, Streustrahlung, Fokusunschärfe | +| Wandlung | in ein sichtbares Bild | Übertragungsverhalten Wandler | +| Betrachtung | des sichtbaren Bildes mit dem Auge | Betrachtungsbedingungen, Übertragungsverhalten Auge | +| Auswertung | des Röntgenbildes | Erfahrungen des Befundes, weitere Befunde | + +### Röntgenstrahlenquelle +In Vakuumgefäß wird eine Glühkatode (Wolframwendel) durch elektrische Leistung erhitzt. Daraus emmitierende Elektronen treffen auf Anode (Kupfer + Wolfram) und werden in bestimmten Winkel abgelenkt. Anforderungen sind punktförmiger Fokis (Zentralprojektion) und kurze Schaltzeiten (Bewegungsunschärfe). +Drehanodenröntgenröhren besitzen als Anode einen Anodenteller der durch einen Motor gedreht wird. Schnelle Speicherung großer Wärmemengen, hohe Tellertemperaturen und Wärmeabgabe über Wärmestrahlung (Strahlungskühlung) an Keramikkörper. + + +# Bildverarbeitung +## Anwendungsfelder digitaler Bildverarbeitung +- Medizinische Diagnostik und Therapie + - Röntgen, CT, DSA, PET, SPECT, Ultraschall, MRI, fMRI, OCT +- Biolog. Bildgebung + - Histologie, Mikroskopie, Zählung, Klassifikation u. Morphologie von Zellen, Bewegungsanalyse, Wachstum +- Forensik / Rechtsmedizin + - Fingerabdruck, Gesichtserkennung +- Mensch-Maschine-Kommunikation / Robotik + - Gestenerkennung, Zeichensprache, Orientierung im Raum +- Dokumentenverarbeitung + - Automatische Texterkennung (OCR), Scannen, Archivieren, Fotografie +- Industrie / Materialforschung + - Qualitätssicherung, automatisches Zählen, Komponentenerkennung +- Remote Sensing + - Ernte, Wetter, Vermessung, Militär, Astronomie + +## Eigenschaften +- Große Komplexität / Variabilität der Objekte +- Große Bedeutung feinster Strukturen +- Multimodal, individuelle Unterschiede +- Dreidimensionale / dynamische Bilddaten +- Vergleichbarkeit mit Standardfällen +- Hohe Robustheit notwendig + +## Ziele +- Diagnose +- Screening +- Operieren +- Bestrahlungsplanung +- Ausbildung + +## Modellgestützte Interpretation +- Bildinformationen + - Modell- bzw. anwendungsspezifische Interpretation des Bildes + - Bild nur unter Erwartungshaltung bzw. mit Hilfe eines Modells interpretierbar + - Können verfälscht oder widersprüchlich sein + +## Bildverarbeitungsprozess +Aufnahme -> Vorverarbeitung -> Segmentierung -> Merkmals-Extraktion -> Klassifikation -> Objekterkennung + +| Prozess | Beschreibung | +| -- | -- | +| Bildrestauration | Beseitigen von Störungen / Verzerrungen, die bei der Bildaufnahme entstanden sind | +| Bildverbesserung | Verbesserung des subjektiven Wahrnehmung; Anhebung der (diagnostisch) relevanten Bildinformation | +| Bildregistrierung | Anpassung (Transformation) von Zielbildern auf ein Referenzbild (z.B. mit Ziel der Bildfusion) | +| Bildsegmentierung | Unterteilung des Bildes hinsichtlich der Struktur in einzelne Bildabschnitte (Segmente: Histogramm-/Regionen-/Kanten-/Modellbasiert) | +| Merkmalsextraktion | Erfassung von Merkmalen (Eigenschaften) zusammenhängender Bildobjekte (Segmente: Region-/Formbasiert) | +| Klassifikation | Zuordnung von Bildobjekten (Neuronale Netzwerke) | + +### Bildrestauration +- Geometrische Verzerrung + - Affine Verzerrung: Drehung um Koordinatensystem (in zwei Ebenen) + - Projektive Verzerrung: Dimensionale verzerrung in dritter ebene + - Linsenförmige Verzerrung (oval gestaucht/gestreckt) + - Unschärfe durch Bewegung (Verzerrungen) + - Unschärfe durch Defokussierung + +### Bildverbesserung +- Rauschunterdrückung durch lineare Tiefpass-Filter (z.B. Gauss) +- Rauschunterdrückung - nichtlineare Filter + - Salz&Pfeffer-Rauschen -> Median-Filter + - Medianfilter: Analyse der Umgebung eines Pixels -> Median Bilden und ersetzten +- Hervorheben von Kanten durch lineare Hochpass-Filter +- Kontrasterhöhung (Grauwertspreizung/Clipping/Gammakorrektur) + +### Bildregistrierung +Aufnahme-Bild und Referenzbild sollen deckungsgleich im gleichen Koordinaten eingebracht werden +- Passpunktbasiert (Punkte an Festen Bildpunkten verankert geben Triangulation) +- Passpunktunabhängig durch normierte Kreuzkorrelation + +### Bildsegmentierung +- Pixelbasierte Segmentierung (Schwellwertsegmentierung) +- Regionenbasierte Segmentierung (z.B. Tumorgewebe) +- Kantenbasierte Segmentierung +- Modellbasierte Segmentierung (Erkennung von Kreisen mittels Hough-Transformation) + +### Merkmalsextraktion +Klassifikation durch Merkmale/Ähnlichkeiten in einem Merkmalsraum + +### Morphologische Operatoren +Einsatzgebiet zwischen Bild-Segmentierung und Merkmalsextraktion +- z.B. Löcher schließen -> $\oplus$ **Dilatation** mittels Masken über Pixelbereich werden Pixel hinzugefügt +- Fehlstrukturen entfernen -> $\ominus$ **Erosion** mittels Masken über Pixelbereich werden Pixel entfernt +- oft Kombination aus beidem für optimal nutzbares Ergebnis + - Entfernen von Segmentierungsfehlern: 'Opening'/'Closing' + - Berechnung des Randes durch Erosion der äußeren Pixel und abzug des Ergebnisses vom Original +- Bestimmung von Formmerkmalen + - Hit-or-Miss Operator + - Hit Operator: betrachtetes Pixel wird gesetzt wenn Maske übereinstimmt, Rest gelöscht + - Miss-Operator: betrachtetes Pixel wird gelöscht wenn Maske übereinstimmt, Rest bleibt + +# Informationssysteme in der Medizin und im Gesundheitswesen +## Medizinische Dokumentation +Medizinische Dokumentation ist das +- Erfassen, +- Ordnen, +- Speichern und +- Bereitstellen +von medizinischen Informationen und medizinischem Wissen, zum Zweck, diese(s) später +- berechtigten Personen, +- vollständig, +- zur richtigen Zeit, +- am richtigen Ort, +- in der richtigen Form, +zur Verfügung zustellen. +Die Dokumentationspflicht (insbes. in Form einer Patientenakte) ist u.a. ableitbar aus +- §1 u. 2 des Grundgesetzes +- §10 der Musterberufsordnung für Ärzte (MBO-Ä) + +### Ziele +- Krankenversorgung + - Unterstützung der individuellen Krankenbehandlung + - Gedächtnisstütze für Arzt und medizinisches Personal (Anamnese-Erfassung) Entscheidungsunterstützung, Kommunikationsmedium +- Rechtlicher Beleg + - Haftungsrecht; Verordnungen und Gesetze, die die medizinische Dokumentation für andere Zwecke regeln + - Standesrechtliche Dokumentationspflicht +- Administration (Abrechnung, Verwaltung, Management) +- Qualitätssicherung +- Forschung +- Ausbildung + +### Unterteilung +- Patientenspezifische medizinische Dokumente + - Patientenakte beim niedergelassenen Arzt/ im Krankenhaus + - Befunde + - Therapieplanung / Therapiedokumentation + - Verlaufsdokumentation + - Pflegedokumentation + - Krankenkassenkarte / Elektronische + - Gesundheitskarte +- Patientenunabhängige medizinische Dokumente + - Wissens- u. Fachdatenbanken (Arzneimittel, Diagn. Regeln (Leitlinien)) + - Gesundheitsberichterstattung + - Studien + - Fachliteratur + - Techn. Dokumente +- Klinische Verwaltungs-Dokumente + - Bettenplanung + - Dienstpläne des med. Personals + - Materiallisten + - OP-Pläne + - Leistungsabrechnung (DRG) + - Qualitätssicherung + +### Patientenakte +- Aufzeichnung über ambulante und stationäre Versorgung = wichtigste Form der patientenbezogenen Dokumentation +- Aufbau + - Einzeldokumente der Krankengeschichte + - chronologisch geordnet oder quellenorientiert (z.B. Labor, Bildgebung, etc.) + - Personenbezogen + - Konventionell: in Papierform (Papiersammlung, Ordner, Karteikarten) + - in Krankenhausinformationssystemen: Elektronische Patientenakte (EPA) +- Bestandteile + - Patientenstammdaten: Patientenidentifikation, Name, Geburtsname, Geburtsdatum, Adresse + - Administrative Daten: Fallidentifikation, Krankenkasse, Krankenversicherung + - Anamnese: Symptome, Beschwerden, Untersuchungs- und Behandlungsanlass + - Befunde: Laborwerte, Messdaten (Blutdruck, EKG), Bilder + - Diagnosen: Problembeschreibung, Hauptdiagnose, weitere Diagnosen + - Therapien: Medikationen, Operationen, Verordnungen + - Verlauf: zeitliche Entwicklung von Befunden, diagnostische Änderungen, Therapieplan, Therapieerfolg, Prognose + - Epikrise: zusammenfassender Rückblick und Interpretation des Krankengeschehens, oft in Form von Entlassungsdokumenten (Überweisung, Arztbrief etc.) +- Elektronische Patientenakte (EPA) + - deckt im Idealfall alle Ziele der patientenbezogenen klinischen Dokumentation ab + - Voraussetzung: + - integraler Bestand der KIS + - zentrale Patientenverwaltung (PID) + - leistungsfähige Kommunikation + - Vorteile: + - zeitgleich an mehreren Orten verfügbar + - kann nicht verloren gehen (Archivproblem) + - Daten werden multipel genutzt + - Daten können nach unterschiedlichen Kriterien präsentiert werden + - Patienten- oder krankheitsbezogene Auswertung (Arztbrief, Statistik) + +### Klinische Basisdokumentation +Krankenhäuser sind verpflichtet den Kostenträgern u.a. folgende Angaben zu übermitteln: +- Einweisungsdiagnose, Aufnahmediagnose, nachfolgende Diagnosen +- Entlassungsdiagnose +- Angaben über durchgeführte Maßnahmen, Vorschläge für die weitere Behandlung + +Motivation - Benötigt werden: +- einheitliche Klassifikationen / Nomenklaturen für die gesamte Medizin +- international anerkannt +- sprachunabhängig +- Grundlage für die Entwicklung spezieller Kataloge + +## ICD +- := Internationale Klassifikation der Krankheiten, Verletzungen und Todesursachen (ICD := International statistical Classification of diseases, injuries and causes of death (... related health problems)) +- Zweck: wichtigste weltweit anerkannte Klassifikation für Diagnosen +- Unterteilung in: Kapitel, Krankheitsgruppen, 3-stellige Krankheitsklassen, 4-stellige Krankheitsklassen +- Anwendung + - Vergütung medizinischer Leistungen + - ambulant (EBM) + - stationäre nach SGB V (DRG) + - Gesundheitsberichterstattung + - Todesursachen – Statistik + - Krankenhausdiagnosestatistik + - Morbi-RSA (Risikostrukturausgleich für Krankenkassen) + - Interne Aufgaben + - Qualitätssicherung + - Controlling + - Weitere: Arbeitsunfähigkeitsbescheinigung,... +- Aktuell ICD10, 10. Auflage der WHO + +## ICPM +- ICPM = Internationale Klassifikation der Prozeduren und Methoden in der Medizin (International classification of procedures in medicine) +- Ziel: + - bessere Kosten- und Leistungstransparenz + - erste Ansätze – operative und apparativ aufwendige Maßnahmen + - später für alle therapeutischen Eingriffe + +## OPS 301 +- := Operationsschlüssel nach § 301 SVG V +- amtliche Klassifikation zum Verschlüsseln von Operationen, Prozeduren und allgemein medizinischen Maßnahmen im stationären Bereich und beim ambulanten Operieren in Deutschland +- seit 1994 von DIMDI herausgegeben, gepflegt, jährlich aktualisiert +- verbindlich für alle Krankenhäuser zur Klassifizierung von Leistungen +- Verhandlungsgrundlage nach Bundespflegesatzverordnung (Pflegesätze, Fallpauschalen etc.) +- Anwendung + - G-DRG-System + - Fallpauschalen in der stationären Versorgung + - EBM + - Vergütungssystem in der ambulanten Versorgung + - Qualitätssicherung + - Qualitätsberichte der Krankenhäuser (ICD- und OPS-kodiert) +- Unterteilung in: Bereichsüberschriften, Kategorien, 4-/5-stellige Subkategorien + +## Krankenhausinformationssysteme +> Unter einem KIS versteht man das Teilsystem eines Krankenhauses, welches alle informationsverarbeitenden Prozesse und die an ihnen beteiligten menschlichen und maschinellen Handlungsträger in ihrer informationsverarbeitenden Rolle umfasst. Dazu gehören Hardware, Software, Personen und nicht-EDV-basierte Informationsverarbeitung +- Informationen über Patienten +- Unterstützung von Prozessen +- Wissen über Krankheiten und Wechselwirkungen +- Informationen über Qualität der Versorgung +- Informationen über Leistung und Kosten +- Unterstützung der Ausbildung und Forschung + +### KIS als Informationsmittelpunkt +- Medizin + - Diagnostik beschleunigen + - Therapie verbessern +- Pflege + - Pflege optimieren + - Personal entlasen +- Technik/Versorgung + - Zuverlässigkeit der Technik verbessern + - Versorgungsengpässe vermeiden +- Verwaltung + - Effizienz der Verwaltung erhöhen + - Qualität sichern + +- Verbundlösungen + - Krankenhaus nutzt EDV eines Serviceanbieters als Dienstleistung + - IT-Anbieter: kommunale oder firmeneigene Rechenzentren -> verschiedene Automatisierungsgrade + - Bedeutung allgemein abnehmend +- Autonome Lösung + - integriertes System mit Krhs.-eigenem Rechenzentrum + - aufgrund verfügbarer Hardware heute Standard -> verschiedene Systemarchitekturen + +Autonome Lösungen: +- Zentralrechnersysteme + - ein Zentralserver für gesamte Verarbeitung + - ansonsten nur Terminals +- Insellösungen + - separate Systeme für jeweilige Applikation + - keine Kommunikation zwischen den Einzelsystemen +- Verbundsysteme + - dedizierte, modulare Systeme + - Zentralserver zur Administration der Modulserver + - standardisierte Kommunikation zwischen den Komponenten + +### Was ist ein KIS nun in der Realität? +- Ein Krankenhausinformationssystem (KIS) ist heute eine Ansammlung von Programmen (Sub-Informationssystemen) zur Bearbeitung medizinischer und administrativer Daten im Krankenhaus. +- Ziel: Integration (Patientendaten-orientierte Abbildung aller Behandlungs- und Geschäftsprozesse im Krankenhaus im KIS) +- Praxis: + - Die Komplexität der Informationsverarbeitung im Krankenhaus und mit externen Einrichtungen ist so hoch, dass es praktisch kein monolithisches KIS gibt, dass alle Funktionsbereiche adäquat bzw. für die jeweilige Einrichtung bestmöglich abdeckt. + - Deshalb zumeist: heterogen verteilte Systeme („Best-of-Breed“) + +### Elektronische Patientenakte +- Inhalt / Funktion: + - alle Daten, die während stationärer Aufenthalte bei der Erfüllung der ärztlichen Aufgabenstellung erhoben bzw. erzeugt wurden bzw. im Wege der Übermittlung durch den Patienten gewonnen wurden, z.B. Arztbriefe, Operationsberichte, Befundunterlagen, Röntgenbilder, EKG, EEG usw. in elektronischer Form +- Merkmale: + - Selektiver Datenzugriff, virtuelle Sichten + - Elektron. Patientenakte / Krankenakte (EPA) + - Einrichtungsübergreifende EPA (eEPA) + - Elektron. Gesundkeitsakte (EGA) +- Informations-Lieferanten: + - Station / Ambulanz + - Klinik / Diagn. Informationssysteme +- Informations-Nutzer: + - Alle befugten Abteilungen + - Zentralarchiv + +- EPA – Elektronische Patientenakte + - ist eine Sammlung medizinischer und medizinisch relevanter Informationen zu einem Patienten in einer Institution, die auf digitalen Datenträgern gespeichert sind. +- eEPA – einrichtungsübergreifende EPA + - ist eine Sammlung medizinischer und medizinisch relevanter Informationen zu einem Patienten, die institutionsübergreifend auf digitalen Datenträgern gespeichert sind und im Sinne von „Shared Care“ allen an der Behandlung Beteiligten zur Verfügung gestellt werden; Arztmoderiert + - Synonym: Virtuell, Sektorenübergreifend +- eGA – elektronische GesundheitsAkte: + - Ermöglicht Eingabe von Inhalten durch Patienten selbst (Wellness, Ernährung, Home Care); Patientenmoderiert + - Synonym: PHR – Personal Health Record + +### Radiologie-Informationssystem (RIS / PACS) +- Inhalt / Funktion: + - RIS = IS zur Unterstützung des Workflows in der Radiologie +- Merkmale: + - Terminplanung + - Unterstützung radiologischer Untersuchungen (Röntgen, CT, MRT, ...) und ihrer Befundung + - Schnittstelle zu den bildgebenden Geräten und zum PACS (DICOM, DICOM MPPS) + - Dokumentation der Daten nach RöV + - Dokumentation durchgeführter Leistungen +- Informations-Lieferanten: + - Radiologe +- Informations-Nutzer: + - EPA + - Stationsarzt + - Leistungsabrechnung + +### Bildarchivierung (PACS) +- Inhalt / Funktion: + - PACS = Picture Archiving and Communication System + - Zentralarchiv für Bild- und Signaldaten +- Merkmale: + - Anbindung an RIS, aber auch CIS, Strahlentherapie, Neurologie u.a. + - Medizinische Monitore (Schnittstelle zur Befundung durch Arzt) +- Informations-Lieferanten: + - RIS +- Informations-Nutzer: + - Alle befugten Abteilungen + +### Kardiologie-Informationssystem (CIS) +- Inhalt / Funktion: + - IS zur Unterstützung des Workflows in der kardiolog. Klinik +- Merkmale: + - Terminplanung + - Unterstützung kardiologischer Untersuchungen (z.B.: Herzkatheter, EKG, ...) und ihrer Befundung + - Schnittstelle zu den Kardiologie-Geräten + - Dokumentation der Daten + - Dokumentation durchgeführter Leistungen +- Informations-Lieferanten: + - Kardiologe +- Informations-Nutzer: + - EPA + - Stationsarzt + - Leistungsabrechnung + +### Labor-Informationssystem (LIS) +- Inhalt / Funktion: + - IS zur Unterstützung der automatisierten Laboranalytik / Mikrobiologie im Krankenhaus +- Merkmale: + - Online-Auftragserfassung (HL7), Auftragsverwaltung + - Kopplung onlinefähiger Analysegeräte + - Verifizieren der Messergebnisse, Normalwerttabelle, Expertensystem + - Daten zur internen Qualitätssicherung, Statistiken, Plausibilitätsprüfungen + - Etikettendruck, Protokolldruck, Barcode + - Leistungsabrechnung +- Informations-Lieferanten: + - Labor +- Informations-Nutzer: + - EPA + - Stationsarzt + - Leistungsabrechnung + +### OP-Management +- Inhalt / Funktion: + - Planung und Dokumentation des Operationsgeschehens in den OP-Sälen + - OP-Planung: Erfassung der wichtigsten Informationen im Vorfeld, Terminierung, Personal- und Ressourcenzuordnung + - OP-Dokumentation: Dokumentation aller Daten direkt im Operationssaal (OP-Bericht) +- Merkmale: + - Anästhesieplanung + - Plausibilitätsprüfung + - Zugriff auf aktuelle OPS-Ziffern + - Effiziente OP-Auslastung (Kosten !) +- Informations-Lieferanten: + - Operateure, OP-Schwestern +- Informations-Nutzer: + - EPA, Leistungsabrechnung + - Klin. Basisdokumentation + - Labor, Matrialwirtschaft + +## Kommunikationsstandards +### DICOM +- DICOM := Digital Imaging and Communications in Medicine +- = Standard für den elektronischen Datenaustausch von medizinischen Bildern. +- Ziele: + - Offen und herstellerunabhängig + - Interoperabilität von medizinischen Geräten (Unterstützung des Datenaustausches) + - Heute auch Unterstützung anderer Dienste (Anzeige, Drucken, Speichern, Sicherheit) +- Inhalt/Definition von: + - Datenstrukturen med. Bilddaten u. zugehöriger Informationen + - Netzwerkorientierte Dienste + - Formate für den Datenträgeraustausch + - Konformitätsanforderungen an Geräte und Programme +- Inhaltliche Strukturierung + - Festlegung von Konformitätsbedingungen + - Definition von Informationsobjekten (IOD = Information Object Definition) als Abstraktion real existierender digitaler medizinischer Bilder + - Zweck des Informationsobjektes und zugehörende Attribute + - Beispiele: Computed Tomography Image IOD, Magnetic Resonance Image IOD usw. + - Definition von Serviceklassen = definierte Zusammenstellung von Befehlen (Services), die auf Informationsobjekte angewendet werden + - Datenstrukturen und Kodierung + - Nachrichtenaustausch / Netzwerkunterstützung + - Dateiformate + - Graustufen-Anzeigefunktionen + +### HL7 += High Level 7 +- Kommunikationsstandard im Krankenhaus zum Austausch von patientenbezogenen Nachrichten, z.B.: + - Patientenregistrierungsdaten + - Untersuchungsplanung + - Befunde + - Bestellinformationen + - Abrechnungsdaten +- offene, herstellerunabhängige Kommunikationsschnittstelle +- definiert ein Protokoll auf Ebene 7 des OSI-Modells +- Ziel: Interoperabilität zwischen verschiedenen Informationssystemen im Gesundheitswesen + +ISO/OSI - Referenzmodell/Grundprinzip: +- Schicht n auf System A kommuniziert mit Schicht n auf System B +- die Sprache dieser Kommunikation ist das Protokoll +- die Kommunikation ist virtuell, d.h. der Datenaustausch findet über die darunter liegenden Schichten statt +- die Schnittstelle spezifiziert die Kommunikation zwischen den Schichten +- allen Schichten liegt das physische Medium zugrunde + +Abstract Message Definition / Encoding Rules +- Nachricht - kleinste auszutauschende Einheit zwischen zwei Systemen +- Nachrichten setzt sich aus Segmenten zusammen +- Segmente enthalten Felder getrennt durch definiertes Trennzeichen: | +- Felder enthalten Komponenten (im Falle mehrerer Komponenten getrennt durch Komponententrennzeichen: ^ +- HL7 = reiner ASCII-Text +- Jedes Segment beginnt mit 3-stelliger Zeichenfolge und wird mit beendet. +- Jede Nachricht beginnt mit dem Message Header Segment (MSH). +- Segmente können zwingend (z.B. MSH) oder optional definiert sein (je nach Nachrichtentyp). +- Zu jedem Segmenttyp ist die Reihenfolge der Felder (und somit auch die entsprechenden Datentypen) festgelegt +- Trennsymbole (Delimiter) werden am Anfang jeder Nachricht im MHS definiert + +RIM – Reference Information Model +- Objektorientiertes Datenmodell zur konsistenten Darstellung der Daten & deren Beziehung untereinander +- Sicherstellung, dass Daten in Nachrichten beim Datenaustausch von allen beteiligten Applikationen gelesen werden können + +CDA – Clinical Document Architecture +- Dokument zur Dokumentation klinischer Beobachtungen und Maßnahmen während des Behandlungsprozesses +- Ziel: standardisierte, strukturierte Übertragung klinischer Dokumente zwischen verschiedenen Informationssystemen +- Grundlage für elektronische Patientenakte, elektronische Archive usw. +- XML-basiert (Text); kann zusätzlich auch Bilder und multimediale Daten enthalten +- Eigenschaften: + - Persistenz: Unveränderlichkeit des klinischen Dokumentes über seine gesamte Lebenszeit (Verjährungsfristen) + - Zuständigkeit: nur eine am Behandlungsprozess beteiligte Person/ Organisation, erstellt und pflegt das Dokument + - Justitiabilität: Urheberschaft und Integrität sind sicher gestellt + - Gesamtheit: Die Justitiabilität bezieht sich auf gesamtes Dokument + - Lesbarkeit: Maschinen- und menschenlesbar + - Vorteile: Möglichkeit der Herausfilterung gewünschter Informationen + +### Elektronische Gesundheitskarte +- Ziele: + - Beschleunigte und kostenreduzierte Datenübermittlung zwischen medizinischen Leistungserbringern, Krankenkassen, Apotheken und Patienten + - Verbesserung der Qualität der medizinischen Versorgung, insbes. Arzneimittelsicherheit + - Stärkungen der Eigenverantwortung, Mitwirkungsbereitschaft und initiative der Patienten + - Steigerung der Wirtschaftlichkeit und Leistungstransparenz im Gesundheitswesen +- Das ist neu: + - Konzept: eGK + HBA + Telematikinfrastruktur + - eGK = Smartcard (Mikroprozessorchip) + - 32 kB Speicher + - Administrativer Pflichtteil und freiwilliger medizinischer Teil +- Welche Daten enthält die Karte? + - Versichertenstammdaten + - Ausstellende Krankenkasse inkl. Kennzeichen für die zum Wohnsitz des Versicherten + - zugehörige Kassenärztliche Vereinigung + - Familienname, Vorname + - Geburtsdatum + - Geschlecht + - Anschrift + - Krankenversichertennummer + - Versichertenstatus + - Zuzahlungsstatus + - Ablaufdatum der Gültigkeit der Karte + - Die eGK enthält Schlüssel und Zertifikate + - für eine elektronische Signatur (optional) + - für Authentisierungszwecke + - für Verschlüsselung und Aufbau sicherer versichertenbezogener Kommunikationskanäle +- Pflichtanwendungen der eGK + - Versichertenstammdaten + - EHIC – European Health Insurance Card + - Elektronisches Rezept +- Freiwillige Anwendungen + - Daten für die Notfallversorgung + - Elektronischer Arztbrief + - Arzneimitteltherapiesicherheit + - Elektronische Patientenakte + - Dokumentation des Versicherten (Patientenfach) + - Patientenquittung + - Organspenderausweis + - weitere ... + +### Weitere Karten: +Heilberufsausweis (HBA)\ +Der Heilberufsausweis HBA (Engl.: Health Professional Card - HPC) enthält Schlüssel und Zertifikate +- für eine qualifizierte elektronische Signatur +- für Authentisierungszwecke +- für Verschlüsselung und Aufbau sicherer Kommunikationskanäle bezogen auf eine Person aus dem Bereich Gesundheit (Arzt, Apotheker, etc.) + - Apotheker + - Ärzte + - Zahnärzte + +Security Modul Card\ +Die SMC (Security Module Card) enthält Schlüssel und Zertifikate +- für eine elektronische Signatur +- für Authentisierungszwecke - für Verschlüsselung und Aufbau sicherer Kommunikationskanäle bezogen auf eine Organisationseinheit (Praxis, Apotheke, etc.) \ No newline at end of file diff --git a/Grundlagen und Diskrete Strukturen - Cheatsheet.tex b/Grundlagen und Diskrete Strukturen - Cheatsheet.tex index 149f4f0..2ea53d5 100644 --- a/Grundlagen und Diskrete Strukturen - Cheatsheet.tex +++ b/Grundlagen und Diskrete Strukturen - Cheatsheet.tex @@ -1,766 +1,766 @@ -\documentclass[10pt,landscape]{article} -\usepackage{multicol} -\usepackage{calc} -\usepackage{ifthen} -\usepackage[landscape]{geometry} -\usepackage{amsmath,amsthm,amsfonts,amssymb} -\usepackage{color,graphicx,overpic} -\usepackage{hyperref} - -\pdfinfo{ - /Title (Grundlagen und Diskrete Strukturen - Cheatsheet) - /Creator (TeX) - /Producer (pdfTeX 1.40.0) - /Author (Robert Jeutter) - /Subject (Grundlagen und Diskrete Strukturen) -} - -% This sets page margins to .5 inch if using letter paper, and to 1cm -% if using A4 paper. (This probably isn't strictly necessary.) -% If using another size paper, use default 1cm margins. -\ifthenelse{\lengthtest { \paperwidth = 11in}} - { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} } - {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}} - {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } - {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } - } - -% Turn off header and footer -\pagestyle{empty} - -% Redefine section commands to use less space -\makeatletter -\renewcommand{\section}{\@startsection{section}{1}{0mm}% - {-1ex plus -.5ex minus -.2ex}% - {0.5ex plus .2ex}%x - {\normalfont\large\bfseries}} -\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}% - {-1explus -.5ex minus -.2ex}% - {0.5ex plus .2ex}% - {\normalfont\normalsize\bfseries}} -\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}% - {-1ex plus -.5ex minus -.2ex}% - {1ex plus .2ex}% - {\normalfont\small\bfseries}} -\makeatother - -% Define BibTeX command -\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em - T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} - -% Don't print section numbers -\setcounter{secnumdepth}{0} - - -\setlength{\parindent}{0pt} -\setlength{\parskip}{0pt plus 0.5ex} - -%My Environments -\newtheorem{example}[section]{Example} -% ----------------------------------------------------------------------- - -\begin{document} -\raggedright -\footnotesize -\begin{multicols}{3} - - -% multicol parameters -% These lengths are set only within the two main columns -%\setlength{\columnseprule}{0.25pt} -\setlength{\premulticols}{1pt} -\setlength{\postmulticols}{1pt} -\setlength{\multicolsep}{1pt} -\setlength{\columnsep}{2pt} - -\section{Aussagen} -Aussagen sind Sätze die wahr oder falsch sind, d.h. der Wahrheitswert ist wahr oder falsch. - -\paragraph{Verknüpfungen von Aussagen} -Seien p und q Aussagen, dass sind folgende Sätze auch Aussagen -- $p \wedge q$ "und" -- $p \vee q$ "oder" -- $\neg p$ "nicht" -- $p \rightarrow q$ "impliziert" -- $p \leftrightarrow q$ "genau dann wenn" - -\paragraph{Wahrheitswerteverlauf} -\begin{tabular}{ l | c | c | c | c | c | c } - p & q & $p\wedge q$ & $p\vee q$ & $\neg q$ & $p\rightarrow q$ & $p\leftrightarrow q$\\ - \hline - f & f & f & f & w & w & w\\ - f & w & f & w & w & w & f\\ - w & f & f & w & f & f & f\\ - w & w & w & w & f & w & w\\ -\end{tabular} - -\begin{description} - \item[Aussagenlogische Variablen] Variable die den Wert w oder f annimmt - \item[Aussagenlogische Formel] Verknüpfung aussagenloser Variablen nach obigen Muster - \item[Belegung] Zuordnung von w/f an jede Variable einer aussagenlogischer Formel - \item[Wahrheitswerteverlauf] Wahrheitswert der Aussagenformel in Abhängigkeit von der Belegung der Variable - \item[Tautologie] Formel deren Wahrheitswerteverlauf konstant w ist - \item[Kontradiktion] Formel deren Wahrheitswerteverlauf konstant f ist - \item[Kontraposition] $(p\rightarrow q)\leftrightarrow (\neg q \rightarrow p)$ ist eine Tautologie - \item[Modus Potens] $(p\vee (p\rightarrow q))\rightarrow q$ ist eine Tautologie - \item[Äquivalenz] Zwei Formeln p,q sind äquivalent (bzw logisch äquivalent) wenn $p\leftrightarrow$ Tautologie ist. Man schreibt $p \equiv q$. Die Formel p impliziert die Formel q, wenn $p\rightarrow q$ eine Tautologie ist -\end{description} - -\paragraph{Regeln} -\begin{itemize} - \item $p\wedge q \equiv q \wedge p$ (Kommutativ) - \item $p\vee q \equiv q \vee p$ (Kommutativ) - \item $p\wedge (q \wedge r) \equiv (p \wedge q) \wedge r$ (Assoziativ) - \item $p\vee ( q \vee r) \equiv (p \vee q) \vee$ (Assoziativ) - \item $p\wedge (q\vee r) \equiv (p\wedge q) \vee (p\wedge r)$ (Distributiv) - \item $p\vee (q\wedge r) \equiv (p\vee q) \wedge (p\vee r)$ (Distributiv) - \item $\neg(\neg q) \equiv q$ (Doppelte Verneinung) - \item $\neg(p\wedge q) \equiv (\neg p) \wedge (\neg q)$ (de Morgansche) -\end{itemize} - -Aussagenformen in einer Variable x aus dem Universum U heißen Prädikate von U. Aussagenformen in n Variablen $x_1,...,x_n$ aus dem Universum U heißen "n-stellige Prädikate" von U. - -Seien p,q Prädikate über U -\begin{itemize} - \item $(\forall x: (p(x) \wedge q(x)))\leftrightarrow (\forall x: p(x) \wedge \forall x: q(x))$ - \item $\exists x: (p(x) \vee q(x)) \leftrightarrow (\exists x: p(x) \vee \exists x: q(x))$ - \item $\neg (\forall x:p(x))\leftrightarrow \exists x: \neg p(x)$ - \item $\neg(\exists x:p(x))\leftrightarrow \forall x:\neg p(x)$ -\end{itemize} -Achtung: Verschiedenartige Quantoren dürfen nicht getauscht werden! gleichartige Quantoren dürfen getauscht werden - -\section{Mengen} -"Eine Menge ist eine Zusammenfassung bestimmter, wohlunterschiedener Objekte unserer Anschauung oder unseres Denkens" ~ Cantor -Von jedem Objekt steht fest, ob es zur Menge gehört oder nicht. - -\paragraph{Wunsch 0} -Es gibt eine Menge. Ist A irgendeine Menge, so ist ${x \in A: \neg (x=x)}$ eine Menge ohne Elemente, die sogenannte leere Menge $\emptyset$. - -\paragraph{Wunsch 1} -"$x\in y$" soll Aussagenform über dem Universum U aller Mengen sein. D.h. für je zwei Mengen x und y ist entweder x ein Element von y oder nicht. D.h. "$x\in y$" ist ein 2-stelliges Prädikat über U. - -\paragraph{Wunsch 2} -Ist p(x) ein Prädikat über U, so soll es eine Menge geben, die aus genau denjenigen Mengen x besteht, für die p(x) wahr ist. Bezeichnung ${x:p(x) "ist-wahr" }$. -Danach gäbe es eine Menge M, die aus genau denjenigen Mengen x mit $x\not \in x$ besteht: $M={x:x\not \in x}$. - -\paragraph{Wunsch 2'} -Ist A eine Menge und p(x) ein Prädikat über U, dann gilt es eine Menge B die aus genau denjenigen Mengen x aus A besteht, für die p(x) wahr ist. Bezeichnung: $B={x\in A:p(x) wahr}$. -Folgerung: die Gesamtheit aller Mengen ist selbst keine Menge, sonst findet man einen Widerspruch wie oben. - -\paragraph{Wunsch 3} -Zwei Mengen x,y sind genau dann gleich wenn sie diesselben Elemente enthalten. D.h. $x=y: \leftrightarrow \forall z:(z\in x \leftrightarrow z\in y)$. Somit gilt für zwei Prädikate p(x), q(x) über U und jede Menge A: ${x\in A: p(x) wahr} = {x\in A: q(x) wahr}$ genau dann, wen q(x), p(x) den gleichen Wahrheitswert für jedes x aus A haben. - -\paragraph{Wunsch 4} -Zu jeder Menge A gibt es eine Menge B, die aus genau denjenigen Mengen besteht, die Teilmengen von A sind. Dabei ist x eine Teilmenge von $y: \leftrightarrow \forall z:(z\in x \rightarrow z \in y) [x \subseteq y]$\ -$B={x:x\subseteq A}=\wp(A)$ B heißt Potentmenge von A\ - -\subsection{Teilmengen} -A Teilmenge von B $\leftrightarrow \forall x: (x\in A \rightarrow x \in B):\Rightarrow A\subseteq B$\ -A Obermenge von B $\leftrightarrow \forall x: (x\in B \rightarrow x \in A):\Rightarrow A\supseteq B$\ -Folglich $A=B \leftrightarrow A\subseteq B \wedge B\subseteq A$\ -Schnittmenge von A und B: $A\cap B = {x: x\in A \wedge x\in B}$\ -Vereinigungsmenge von A und B: $A\cup B = {x: x\in A \vee x\in B}$ - -Sei eine Menge (von Mengen) dann gibt es eine Menge die aus genau den Mengen besteht, die in jeder Menge von A enthalten sind (außer $A=\emptyset$). -Ebenso gibt es Mengen die aus genau den Mengen besteht, die in wenigstens einer Menge aus A liegen. Die Existenz dieser Menge wird axiomatisch gefordert in ZFC:$ UA = {x: \exists z \in A: x \in z}$\ - -Seien A,B Mengen, dann sei $A/B:={x\in A: x\not \in B } = A\bigtriangleup B$\ -De Moorgansche Regel: $\overline{A \cup B} = \overline{A} \cap \overline{B}$ und $\overline{A\cap B}=\overline{A}\cup \overline{B}$\ -Das geordnete Paar (x,y) von Mengen x,y ist definiert durch ${{x},{x,y}}:={x,y}$\ -A und B Mengen: $A x B:={(x,y):x\in A \wedge y \in B}$ - -\section{Relationen} -$A={Peter, Paul, Marry}$ und $B={C++, Basic, Lisp}: R\subseteq AxB$, etwa {(Peter,c++),(Paul, C++), (Marry,Lisp)}. Seien A,B Mengen: Eine Relation von A nach B ist eine Teilmenge R von AxB.\ -$(x,y)\in R:$ x steht in einer Relation R zu y; auch xRy\ -Ist A=B, so heißt R auch binäre Relation auf A - -\paragraph{binäre Relation} -\begin{itemize} - \item Allrelation $R:=AxA \subseteq AxA$ - \item Nullrelation $R:=\emptyset \subseteq AxA$ - \item Gleichheitsrelation $R:={(x,y)... x=y}$ - \item $A=R; R:=((x,y)\in \mathbb{R} x \mathbb{R}, x \leq y)$ - \item $A=\mathbb{Z}; R:={(x,y)\in \mathbb{Z} x \mathbb{Z}: \text{x ist Teiler von y} }$ kurz: x|y -\end{itemize} - -\paragraph{Eigenschaften von Relationen} -Sei $R\in AxA$ binäre Relation auf A -\begin{itemize} - \item Reflexiv $\leftrightarrow$ xRx $\forall x \in A$ - \item symmetrisch $\leftrightarrow xRy \rightarrow yRx$ - \item Antisymmetrisch $\leftrightarrow xRy \wedge yRx \rightarrow x=y$ - \item Transitiv $\leftrightarrow xRy \wedge yRz \rightarrow xRz$ - \item totale Relation $\leftrightarrow xRy \vee yRx \forall x,y \in A$ -\end{itemize} -\begin{itemize} - \item R heißt Äquivalenzrelation $\leftrightarrow$ R reflexiv, symmetrisch und transitiv - \item R heißt Ordnung $\leftrightarrow$ R reflexiv, antisymmetrisch und transitiv - \item R heißt Totalordnung $\leftrightarrow$ R Ordnung und total - \item R heißt Quasiordnung $\leftrightarrow$ R reflexiv und transitiv -\end{itemize} - -\paragraph{Äqivalenzrelation} -Sei A Menge, $C\wp (A)$ Menge von Teilmengen von A. C heißt Partition von A, falls gilt: -1. $UC=A$ d.h. jedes $x\in A$ liegt in (wenigstens) einem $y\in C$ -2. $\emptyset \not \in C$ d.h. jedes $y\in C$ enthält (wenigstens) ein Element von A -3. $X \cap Y = \emptyset$ f.a. $X\not \in Y$ aus C - -Zwei Mengen $X\cap Y = \emptyset$ heißten disjunkt.\ -Satz: Sei $\sim$ Äquivalenzrelation auf A. Für $x\in A$ betrachtet $[x]_{/ \sim }:={y\in A: y \sim x}$. Dann ist ${[x]_{/ \sim }:x\in A}= C_{/ \sim }$ Partition von A. Die Elemente $[x]_{/ \sim }$ von $C_{/ \sim }$ heißen Äquivalenzklassen. Die Elemente von C heißten Teile, Klassen oder Partitionen. - -Somit ist $\equiv(mod m)$ eine Äquivalenzrelation. Ihre Äquivalenzklassen heißen Restklassen mod m - -Ein Graph $G=(V,E)$ ist ein Paar bestehend aus einer Menge V und $E\subseteq (x,y: x \not = y \text{ aus V} )$. -Zu $a,b\in V$ heißt eine Folge $P=x_1,..,x_n$ von paarweise verschiedenen Ebenen mit $a=x_0, b=x_j; x_{j-1},x_i \in E{a*i \in b*j}$ ein a,b-Weg der Länge l oder Weg a nach b. Durch $a\sim b$ gibt es einen a,b-Weg in G, wird eine Äquivalenzrelation auf V definiert, denn: -\begin{itemize} - \item "$\sim$ reflexiv": es ist $x\sim x$, denn $P=x$ ist ein x,x-Weg in G - \item "$\sim$ symmetrisch": aus $x\sim y$ folgt, es gibt einen x,y-Weg $\rightarrow$ es gibt einen y,x-Weg $y\sim x$ - \item "$\sim$ transitiv": aus $x\sim y$ und $y\sim x$ folgt, es gibt einen x,y-Weg und einen y,x-Weg -\end{itemize} -Die Äquivalenzklassen von $\sim _G$ erzeugen die Zusammenhangskomponenten von G - -Satz: Sei C eine Partition von A, dann wird durch $x\sim _G y \leftrightarrow$ es gibt ein $X\in C$ mit $x,y\in X$ eine Äquivalenzrelation auf A definiert. - -\paragraph{(Halb) Ordnungen} -Sei also $leq$ eine Ordnung auf X. Seo $A\subseteq X, b\in X$ -\begin{itemize} - \item b minimal in A $\leftrightarrow b\in A$ und $(c\leq b \rightarrow c=b f.a. c\in A)$ - \item b maximal in A $\leftrightarrow b\in A$ und $(b\leq c \rightarrow b=c f.a. c\in A)$ - \item b kleinstes Element in A $\leftrightarrow b\in A$ und $(b\leq c f.a. c\in A)$ - \item b größtes Element in A $\leftrightarrow b\in A$ und $(c\leq b f.a. c\in A)$ - \item b untere Schranke von A $\leftrightarrow b\leq c f.a. c\in A$ - \item b obere Schranke von A $\leftrightarrow c\leq b f.a. c\in A$ - \item b kleinste obere Schranke von A $\leftrightarrow$ b ist kleinstes Element von $(b'\in X: \text{b' obere Schranke von A})$ auch Supremum von A: $\lor A = b$ - \item b größte untere Schranke von A $\leftrightarrow$ b ist das größte Element von $(b'\in X: \text{ b' untere Schranke von A} )$ auch Infinum von A; $\land A = b$ -\end{itemize} -kleinstes und größtes Element sind jew. eindeutig bestimmt (falls existent) - -Satz: Sei X Menge. $\subseteq$ ist Ordnung auf $\wp(X)$. Ist $O\subseteq \wp(X)$, so ist $sup O=\bigcup O$ und $inf O=\bigcap O$ - -Satz: Die Teilbarkeitrelation | ist Ordnung auf den natürlichen Zahlen $\mathbb{N}$. Es gibt $sup(a,b)=kgV(a,b)$ (kleinstes gemeinsames Vielfaches) und $inf(a,b)=ggT(a,b)$ (größtes gemeinsames Vielfaches) - -\paragraph{Hesse Diagramm} -Darstellung einer Ordnung $\subseteq$ auf X -1. Im Fall $x\subseteq y$ zeichne x "unterhalb" von y in die Ebene -2. Gilt $x\subseteq y (x\not = y)$ und folgt aus $x \subseteq z \subseteq y$ stets $x=z$ oder $y=z$ so wird x mit y "verbunden" - -\paragraph{Zoonsche Lemma} -Zu jeder Menge und für jede Ordnung $\leq$ auf X mit der Eigenschaft, dass jede nicht-leere Kette nach der beschränkt ist, gibt es ein maximales Element. - -\paragraph{Wohlordnungssatz} -Jede Menge lässt sich durch eine Ordnung $\subseteq$ so ordnen, dass jede nichtleere Teilmenge von X darin ein kleinstes Element ist - -\section{Induktion} -X ist eine Menge, $X:=X\vee {X}$\ -M Menge heißt induktiv $:\leftrightarrow \emptyset \in M \wedge \forall X \in M$ $X^+ \in M$. - -Ist O eine Menge von induktiven Mengen, $O\pm O$ dann ist auch $\bigcap O$ induktiv. Insbesondere ist der Durchschnitt zweier induktiver Mengen induktiv. Es gibt eine induktive Menge M: $M =\bigcap {A \in \wp(M): A induktiv}$. -Sei M' irgendeine (andere) induktive Menge $\rightarrow M \cap M'$ ist induktive Teilmenge von M. $\mathbb{N}_M$ ist der Durchschnitt über alle induktiven Teilmengen von M $\mathbb{N}_M \subseteq M \cap M' \subseteq M'$. Folglich ist $\mathbb{N}_m$ Teilmenge jeder induktiven Menge. - -\paragraph{Satz I (Induktion I)} -Sei $p(n)$ ein Prädikat über $\mathbb{N}$. Gelte $p(0)$ und $p(n)\rightarrow p(n^{+})$ f.a. $n\in \mathbb{N}$ dann ist $p(n)$ wahr f.a. $n \in \mathbb{N}$. Schreibe $x=y:\leftrightarrow x\in y \vee x=y$ - -\paragraph{Satz II (Induktion II)} -Sei $p(n)$ ein Prädikat über $\mathbb{N}$, gelte ($\forall x < n: p(x)) \rightarrow p(n)$ f.a. $n\in \mathbb{N}$. Damit ist $p(n)$ wahr für alle $n\in \mathbb{N}$. - -\section{Funktionen} -Seien A,B Mengen: Eine Relation $f\subseteq A x B$ heißt Funktion. A nach B ("$f:A\rightarrow B$") falls es zu jedem $x\in A$ genau ein $y\in B$ mit $(x,y)\in f$ gibt. Dieses y wird mit $f(x)$ bezeichnet. - -Satz: $f:A\rightarrow B, g:A\rightarrow B$; dann gilt $f=g \leftrightarrow f(x)=g(x)$. Sei $f:A\rightarrow B$ Funktion -\begin{itemize} - \item f heißt injektiv $\leftrightarrow$ jedes y aus B hat höchstens ein Urbild - \item f heißt subjektiv $\leftrightarrow$ jedes y aus B hat wenigstens ein Urbild - \item f heißt bijektiv $\leftrightarrow$ jedes y aus B hat genau ein Urbild -\end{itemize} - -Ist $f:A\rightarrow B$ bijektive Funktion, dann ist auch $f^{-1}\subseteq BxA$ bijektiv von B nach A, die Umkehrfunktion von f. -Man nennt f dann Injektion, Surjektion bzw Bijektion -\begin{itemize} - \item f injektiv $\leftrightarrow (f(x)=f(y)\rightarrow x=y)$ f.a. $x,y\in A$ oder $(x\not = y \rightarrow f(x)\not = f(y))$ - \item f surjektiv $\leftrightarrow$ Zu jedem $x\in B$ existiert ein $x\in A$ mit $f(x)=y$ - \item f bijektiv $\leftrightarrow$ f injektiv und surjektiv -\end{itemize} - -Sind $f:A\rightarrow B$ und $g:B\rightarrow C$ Funktionen, so wird durch $(g \circ f)(x):=g(f(x))$ eine Funktion $g \circ f: A \rightarrow C$ definiert, die sog. Konkatenation/Hintereinanderschaltung/Verkettung/Verkopplung von f und g (gesprochen "g nach f"). - -Satz: $f:A\rightarrow B, g:B\rightarrow C$ sind Funktionen. Sind f,g bijektiv, so ist auch $g \circ f: A\rightarrow C$ bijektiv - -Satz: ist $f:A\rightarrow B$ bijektiv, so ist $f^{-1}$ eine Funktion B nach A. Mengen A,B, heißen gleichmächtig ($|A|=|B| \equiv A\cong B$) falls Bijektion von A nach B. $\cong$ ist auf jeder Menge von Mengen eine Äquivalenzrelation -\begin{itemize} - \item "$\cong$ reflexiv": $A\cong A$, denn $f:A\rightarrow A, f(x)=X$, ist Bijektion von A nach A - \item "$\cong$ symmetrisch": Aus $A\cong B$ folgt Bijektion von A nach B $\rightarrow B\cong A$ - \item "$\cong$ transitiv": Aus $A\cong B$ und $B\cong C$ folgt $A\cong C$ -\end{itemize} - -$|A|=|A|:|A|$ ist die Kordinalität von A, d.h. die kleinste zu A gleichmächtige Ordinalzahl. Eine Ordinalzahl ist eine e-transitive Menge von e-transitiven Mengen. Eine Menge X heißt e-transitiv, wenn aus $a\in b$ und $b\in c$ stets $a\in c$ folgt. -Sei $A:=\mathbb{N}$ und $B={0,2,4,...}={n\in \mathbb{N}: 2|n}$, dann sind A und B gleichmächtig, denn $f:A\rightarrow B, f(x)=2x$ ist Bijektion von A nach B. -Eine Menge A heißt endlich, wenn sie gleichmächtig zu einer natürlichen Zahl ist; sonst heißt A unendlich. -Eine Menge A heißt Deckend-unendlich, falls es eine Injektion $f:A\rightarrow B$ gibt die nicht surjektiv ist. - -Satz: A unendlich $\leftrightarrow$ A deckend-unendlich -A,B sind Mengen. A heißt höchstens so mächtig wie B, falls es eine Injektion von A nach B gibt. $|A|\leq |B|$ bzw $A\preceq B$. $\preceq$ ist Quasiordnung auf jeder Menge von Mengen. -\begin{itemize} - \item "$\preceq$ reflexiv": Injektion von A nach A - \item "$\preceq$ transitiv": $A\preceq B$ und $B\preceq C$ folgt Injektion $f:A\rightarrow B$ und $g:B\rightarrow C$. Verkopplung $g \circ f \rightarrow A \preceq C$ -\end{itemize} - -Satz (Vergleichbarkeitssatz): -Für zwei Mengen A,B gilt $|A|\leq |B|$ oder $|B| \leq |A|$. Eine Relation f von A nach B heißt partielle Bijektion (oder Matching), falls es Teilmengen $A'\subseteq A$ und $B'\subseteq B$ gibt sodass f eine Bijektion von A' nach B' gibt. - -Sei M die Menge aller Matchings von A nach B und wie jede Menge durch $\subseteq$ geordnet. Sei $K\subseteq M$ eine Kette von Matchings. K besitzt eine obere Schranke ($\bigcup K$) in M. Seien $(x,y);(x',y')$ zwei Zuordnungspfeile aus $\bigcup K$, zeige $x\not = x'$ und $y\not = y'$ dann folgt Matching. -Jede Kette von Matchings benutzt eine obere Schranke, die ebenfalls ein Matching ist $\rightarrow$ es gibt ein maximales Matching von A nach B, etwa h. Im Fall ($x\in A, y\in B$ mit $(x,y)\in h$) ist h eine Injektion von A nach B, d.h. $|A| \subseteq |B|$ andernfalls $y\in B, x\in A$ mit $x,y\in h$ ist $h^{-1}$ eine Injektion von B nach A, d.h. $|B| \subseteq |A|$. - -Satz (Cantor/Schröder/Bernstein): -Für zwei Mengen A,B gilt: Aus $|A|\subseteq |B|$ und $|B| \subseteq |A|$ folgt $|A| = |B|$. - -Satz (Cantor): -Für jede Menge X gilt: $|X| \leq \wp(X)$ und $|X|\not= |\wp (X)|$. Z.B. ist $|\mathbb{N}|<|\mathbb{R}|$; zu $|\mathbb{N}|$ gleichmächtige Mengen nennt man abzählbar; unendliche nicht-abzählbare Mengen nennt man überzählbar. - -\paragraph{Kontinuitätshypothese} -Aus $|\mathbb{N}|\leq |A| \leq |\mathbb{R}|$ folgt $|A|=|\mathbb{N}|$ oder $|A|=|\mathbb{R}|$ (keine Zwischengrößen). - -Seien M,I zwei Mengen. Eine Funktion $f:I\rightarrow M$ von I nach M heißt auch Familie über der Indexmenge I auf M. Schreibweise $(m_i)_{i\in I}$ wobei $m_i=f(i)$. Familien über $I=\mathbb{N}$ heißen Folgen (bzw. unendliche Folgen). -Eine (endliche) Folge ist eine Familie über einer endlichen Indexmenge I. Funktionen von ${1,...,n}$ in einer Menge A ($a_q,...,a_n\in A$) heißen n-Tupel. Für eine Mengenfamilie $(A_i)_{i\in A}$ sei ihr Produkt durch $\prod A_i=(f: \text{ Funktion von I nach}\bigcup A_i \text{ mit } f(i)\in A_i \text{ f.a. } i\in I)$. Ist allgemein $A_i=A$ konstant, so schreibe $\prod A_i=A^I={f:I\rightarrow R}$. Bezeichnung auch $2^{\mathbb{N}}$. - -\section{Gruppen, Ringe, Körper} -Eine Operation auf eine Menge A ist eine Funktion $f:AxA\rightarrow A$; schreibweise $xfy$. EIne Menge G mit einer Operation $\circ$ auf G heißt Gruppe, falls gilt: -\begin{itemize} - \item $a\circ (b\circ c) = (a\circ b)\circ c$ freie Auswertungsfolge - \item es gibt ein $e\in G$ mit $a\circ e=a$ und $e\circ a=a$ f.a. $a\in G$. e heißt neutrales Element von G und ist eindeutig bestimmt - \item zu jedem $a\in G$ existiert ein $b\in G$ mit $a\circ b=e$ und $b\circ a=e$; wobei e ein neutrales Element ist. b ist durch a eindeutig bestimmt, denn gäbe es noch ein $c\in G$ mit $a\circ c=e$ folgt $b=b\circ e$. Schreibweise für dieses eindeutig durch a bestimmte b: $a^{-1}$ -\end{itemize} - -Eine Gruppe G mit $\circ$ wird auch mit $(G, \circ)$ bezeichnet. Sie heißt kommutativ bzw abelsch, falls neben 1.,2. und 3. außerdem gilt: -\begin{itemize} - \item $a\circ b = b\circ a$ f.a. $a,b \in G$ -\end{itemize} - -Das neutrale Element aus 2. wird mit 1 bezeichnet. Im Fall der abelschen Gruppe benutzt man gerne "additive Schreibung": "+" statt "$\circ$" und "0" statt "1" (Bsp: $1*a = a*1 = a$). -Eine Bijektion von X nach X heißt Permutation von X. $(S_X, \circ)$ ist eine Gruppe. - -Zwei Gruppen $(G, \circ_G)$ und $(H,\circ_H)$ heißen isomorph, falls es einen Isomorphismus von $(G,\circ_G)$ nach $(H,\circ_H)$ gibt (bzw. von G nach H). Schreibweise $(G,\circ_G)\cong (H,\circ_H)$ -\begin{itemize} - \item "$\cong$ reflexiv": $G\cong G$, denn $id_G$ ist ein Isomorphismus - \item "$\cong$ symmetrisch": aus $G\cong G$ folgt: es existiert ein bijektiver Homomorphismus - \item "$\cong$ transitiv": sei $G\cong H$ und $H\cong J \rightarrow$ es gibt einen Isomorphismus $\phi:G\rightarrow H$ und $\psi:H\rightarrow J \rightarrow \phi\circ \psi :G\rightarrow J \rightarrow$ J ist bijektiv. $\phi\circ G$ ist Homomorphismus von G nach J und bijektiv also Isomorph -\end{itemize} -Satz: Jede Gruppe $(G,\circ)$ ist zu einer Untergruppe von $(S_G, \circ)$ isomorph - -\paragraph{Arithmetik von $\mathbb{N}$} -$+: \mathbb{N} x \mathbb{N} \rightarrow \mathbb{N}$ wird definiert durch: -\begin{itemize} - \item $m+0:=m$ f.a. $m\in \mathbb{N}$ (0 ist neutral) - \item $m+n$ sei schon definiert f.a. $m\in \mathbb{N}$ und ein gutes $n\in \mathbb{N}$ - \item $m+n^+:=(m+n)^+$ f.a. $m,n \in \mathbb{N}$ -\end{itemize} - -Satz: $m+n=n+m$ f.a. $m,n\in\mathbb{N}$ (Beweis induktiv über m) - -Satz: $l+(m+n)=(l+m)+n$ f.a. $l,m,n\in\mathbb{N}$ (Klammern sind neutral bzgl +) - -Satz (Streichungregel): aus $a+n=b+n$ folgt $a=b$ f.a. $a,b,n\in\mathbb{N}$ - -\paragraph{Analog: Multiplikation} -$*: \mathbb{N} x \mathbb{N} \rightarrow \mathbb{N}$ wird definiert durch: -\begin{itemize} - \item $m*0:=0$ f.a. $m\in \mathbb{N}$ - \item $m*n^+=m*n+m$ f.a. $n\in\mathbb{N}$ -\end{itemize} -Es gilt: -\begin{itemize} - \item $m*n=n*m$ f.a. $n\in\mathbb{N}$ - \item $m*(n*l)=(m*n)*l$ f.a. $m,n\in\mathbb{N}$ - \item $m*1 = 1*m =m$ f.a. $m\in\mathbb{N}$ - \item $a*n=b*n \rightarrow a=b$ f.a. $a,b\in\mathbb{N}, n\in\mathbb{N}/{0}$ - \item $a*(b+c)=a*b+a*c$ (Distributivgesetz) -\end{itemize} - -\paragraph{Die ganzen Zahlen $\mathbb{Z}$} -Durch $(a,b)\sim (c,d)\leftrightarrow a+d=b+c$ wird eine Äquivalenzrelation auf $\mathbb{N} x\mathbb{N}$ definiert. -Die Äquivalenzklassen bzgl $\sim$ heißen ganze Zahlen (Bezeichnung $\mathbb{Z}$, Bsp $17=[(17,0)]_{/\sim }$). -Wir definieren Operationen +, * auf $\mathbb{Z}$ durch: -\begin{itemize} - \item $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a+c, b+d)]_{/\sim }$ - \item $[(a,b)]_{/\sim } * [(c,d)]_{/\sim } = [(ac+bd, ad+bc)]_{/\sim }$ -\end{itemize} -Zu zeigen ist: Die auf der rechten Seite definierten Klassen hängen nicht von der Wahl der "Repräsentanten" der Klassen auf der linken Seite ab (Wohldefiniert). - -Formal (für +): $[(a,b)]_{/\sim } = [(a',b')]_{/\sim }$ und $[(c,d)]_{/\sim } = [(c',d')]_{/\sim }$ impliziert $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a'+c', b'+d')]_{/\sim }$. Aus der Vss konstant kommt $a+b'=b+a'$ und $c+d'=c'+d$. Dann folgt $a+c+b'+d'=b+d+a'+c'$, also $(a+c, b+d)\sim (a'+c',b'+d')$. - -Satz: $\mathbb{Z}$ ist eine abelsche Gruppe (+ assoziativ, enthält neutrales Element, additiv Invers). -$[(a,0)]_{/\sim }$ wird als a notiert. $-[(a,0)]_{/\sim }=[(0,a)]_{/\sim }$ wird als -a notiert. -Anordnung: $[(a,b)]_{/\sim } \subseteq [(c,d)]_{/\sim } \leftrightarrow a+d\leq b+c$ - -Ein Ring R ist eine Menge mit zwei Operationen $+,*: \mathbb{R} x \mathbb{R} \rightarrow \mathbb{R}$ mit: -\begin{itemize} - \item $a+(b+c) = (a+b)+c$ f.a. $a,b,c\in \mathbb{R}$ - \item Es gibt ein neutrales Element $O\in \mathbb{R}$ mit $O+a=a+O=O$ f.a. $a\in\mathbb{R}$ - \item zu jedem $a\in \mathbb{R}$ gibt es ein $-a\in \mathbb{R}$ mit $a+(-a)=-a+a=0$ - \item $a+b=b+a$ f.a. $a,b\in\mathbb{R}$ - \item $a*(b*c)=(a*b)*c)$ f.a. $a,b,c\in\mathbb{R}$ - \item $a*(b+c)=a*b+a*c$ f.a. $a,b,c\in\mathbb{R}$ -\end{itemize} -R heißt Ring mit 1, falls: -\begin{itemize} - \item es gibt ein $1\in\mathbb{R}$ mit $a*1=1*a=a$ f.a. $a\in\mathbb{R}$ -\end{itemize} -R heißt kommutativ, falls: -\begin{itemize} - \item $a*b=b*a$ f.a. $a,b\in\mathbb{R}$ -\end{itemize} -Ein kommutativer Ring mit $1\not=O$ heißt Körper, falls: -\begin{itemize} - \item zu jedem $a\in\mathbb{R}$ gibt es ein $a^{-1}\in\mathbb{R}$ mit $a*a^{-1}=a^{-1}*a=1$ -\end{itemize} - -Bemerkung: $O$ kann kein multiplikativ inverses haben. -\begin{itemize} - \item Ist $\mathbb{R}$ ein Körper, so ist $\mathbb{R}*=\mathbb{R} /(0)$ mit $*$ eine abelsche Gruppe. - \item $\mathbb{Z}$ mit + und * ist ein kommutativer Ring mit $1 \not= 0$ aber kein Körper - \item $\mathbb{Q}, \mathbb{C}, \mathbb{R}$ mit + und * ist ein Körper -\end{itemize} - -\paragraph{Division mt Rest in $\mathbb{Z}$} -Satz: Zu $a,b\in\mathbb{Z}, b \not= 0$, gibt es eindeutig bestimmte $q,r\in \mathbb{Z}$ mit $a=q*b+r$ und $0\leq q <|b|$ (d.h. $\mathbb{Z}$ ist ein euklidischer Ring). (Beweis über Induktion) - -\paragraph{Zerlegen in primäre Elemente} -Satz: Jede ganze Zahl $n>0$ lässt sich bis auf die Reihenfolge der Faktoren eindeutig als Produkt von Primzahlen darstellen. - -Beweis-Existenz mit Annahme: Der Satz gilt nicht, dann gibt es eine kleinste Zahl n die sich nicht als Produkt von Primzahlen schreiben lässt $\rightarrow$ n weder Primzahl noch 1 $\rightarrow n=m*l$ für $m,l>1 \rightarrow$ m und l sind Produkte von Primzahlen $\rightarrow m*l=$ Produkt von Primzahlen. - -Eindeutigkeit mit Annahme: es gibt ein $n>0$ ohne eindeutige Primfaktorzerlegung (PFZ)$\rightarrow$ es gibt ein kleinstes $n>0$ ohne eindeutige PFZ. Kommt eine Primzahl p in beiden Zerlegungen vor, so hat auch $\frac{n}{p}$ zwei verschiedene PFZen. Man erhält die PFZ von $n'=(1_1-p_1)*b$ aus den PFZen von $q_1-p_1$ und b.. -> Eindeutig bestimmbar. - -\paragraph{Arithmetik im Restklassenring in $\mathbb{Z}$} -Sei $m > 1$ gegeben, $a\equiv \text{b mod m} \leftrightarrow m|a-b$ def. Relation auf $\mathbb{Z}$. Die Äquivalenzklasse zu a wird mit $\bar{a}$ bezeichnet, d.h. $\bar{a}=[a]_{\text{mod m}}={x\in \mathbb{Z}: x\equiv \text{a mod m}}$, $\mathbb{Z}_m={\bar{a}:a\in \mathbb{Z}}$. Sei dazu $\bar{a}\in \mathbb{Z}_m$ beliebig. - -Division mit Rest $\rightarrow$ es gibt eindeutig bestimmt q,r mit $a=q*m+r$ und $0\leq r < m \rightarrow a-r=q*m \rightarrow m| a-r \rightarrow a\equiv \text{r mod m } \rightarrow \bar{a}=\bar{r}$. Also tritt $\bar{a}$ in der Liste $\bar{0},\bar{1},...,\bar{m-1}$ auf. Aus $0\leq i < j \leq m-1$ folgt $\bar{i}\not=\bar{j}$. In der Liste $\bar{0},\bar{1},...,\bar{m-1}$ gibt es daher keine Wiederholungen $\rightarrow |\mathbb{Z}_M|=m$. - -Wir definieren Operationen +,* auf $\mathbb{Z}_m$ durch $\bar{a}+\bar{b}:= \bar{a+b}$ und $\bar{a}*\bar{b}:=\bar{a*b}$ für $a,b\in \mathbb{Z}$. -Wohldefiniert: aus $\bar{a}=\bar{a'}$ und $\bar{b}=\bar{b'}$ folgt $\bar{a+b}=\bar{a'+b'}$. Analog für Multiplikation. - -Eigenschaften von $\mathbb{Z}$ mit +,* werden auf $\mathbb{Z}$ mit +,* "vererbt", z.B. Distributivgesetz. - -Satz: Sei $m\geq 2$ dann ist $\mathbb{Z}_m$ mit +,* ein kommutativer Ring mit $\bar{1}\not=\bar{0}$. Genau dann ist $\mathbb{Z}_m$ sogar ein Körper, wenn m eine Primzahl ist. - -Satz: Genau dann gibt es einen Körper mit n ELementen, wenn n eine Primzahl ist. D.h.. wenn $n=p^a$ ist für eine Primzahl p und $a\geq 1$. - -\paragraph{Konstruktion von $\mathbb{Q}$ aus $\mathbb{Z}$} -Sei $M=\mathbb{Z} x(\mathbb{Z} /{0}$ die Menge von Brüchen. Durch $(a,b)\sim (c,d)\leftrightarrow ad=bc$ wird Äquivalenzrelation auf M durchgeführt. Schreibweise für die Äquivalenzklassen $\frac{a}{b}$ Die Elemente von $\mathbb{Q} :{\frac{a}{b}:a,b\in\mathbb{Z}, b\not=0}$ heißten rationale Zahlen. -Definiere Operationen +,* auf $\mathbb{Q}$ wie folgt: -\begin{itemize} - \item $\frac{a}{b}+\frac{c}{d} = \frac{ad+bc}{b*d}$ (wohldefiniert) - \item $\frac{a}{b}*\frac{c}{d} = \frac{a*c}{b*d}$ -\end{itemize} - -Satz: $\mathbb{Q}$ mit +,* ist ein Körper. - -Durch $\frac{a}{b}\leq\frac{c}{d}$ wird eine totale Ordnung auf $\mathbb{Q}$ definiert. Konstruktion von $\mathbb{R}$ aus $\mathbb{Q}$ mit Dedchin-Schnitten. - -\paragraph{Ring der formalen Potenzreihe} -Sei k ein Körper (oder nur ein Ring mit 1+0). Eine Folge $(a_0, a_1,...,a:n)\in K^{\mathbb{N}}$ mit Einträgen aus K heißt formale Potenzreihe. Die Folge (0,1,0,0,...) wird mit x bezeichnet. Statt $K^{\mathbb{N}}$ schreibt man $K[[x]]$. $(0_0,a_1,a_2,...)$ heißt Polynom in x, falls es ein $d\in \mathbb{N}$ gibt mit $a_j=0$ f.a. $j0$, dann ist $p_B:B\rightarrow [0,1]; p_B(\omega)=\frac{p(\omega)}{p(B)}$ eine Verteilung auf B, denn $\sum p_b(\omega)=\sum \frac{p(\omega)}{p(B)}=\frac{1}{p(B)} \sum p(\omega)= \frac{1}{p(B)} p(B)= 1$. -$p_B$ ist die durch B bedingte Verteilung. Für $A\subseteq \Omega$ gilt $p_B(A\cap B)=\sum p_B(\omega)=\sum\frac{p(\omega)}{p(B)}= \frac{p(A\cap B)}{p(B)}:= p(A|B)$ ("p von A unter B") bedingte Wahrscheinlichkeit von A unter B. - -Satz (Bayer): $p(A|B)=\frac{p(B|A)*p(A)}{p(B)}$ wobei $p_A, p_B \geq 0$ - -Satz (Totale Wahrscheinlichkeit): Seien $A_1, ...,A_k$ paarweise disjunkt, $\bigcup A_j=\Omega, p(A_i)>0, B\subseteq \Omega$, dann gilt $p(B)=\sum p(B|A_i)*p(A_i)$. - -Satz (Bayer, erweitert): $A_1,...,A_k,B$ wie eben, $p(B)>0$. Für $i\in {1,...,k}$ gilt $p(A_i|B)=\frac{p(B|A_i)*p(A_i)}{\sum p(B|A_j)*p(A_j)}$ - -Beispiel: In einem Hut liegen drei beidseitig gefärbte Karten. Jemand zieht ("zufällig") eine Karte und leg sie mit einer ("zufälligen") Seite auf den Tisch. Karten rot/rot, rot/blau und blau/blau. Gegeben er sieht rot, wie groß ist die Wahrscheinlichkeit, dass die andere Seite auch rot ist? -p(unten rot | oben rot) = p(unten rot und oben rot)/p(oben rot) = $\frac{p\binom{r}{r}}{p(\binom{r}{r}\binom{r}{b})}=\frac{\frac{2}{6}}{\frac{3}{6}}=\frac{2}{3}$ - -Eine Funktion $X:\Omega \rightarrow \mathbb{R}$ heißt (reellwertige) Zufallsvariable. Weil $\Omega$ endlich ist, ist auch $X(\Omega)={X(\omega): \omega \in \Omega}\subseteq \mathbb{R}$ endlich. Durch $p_x(x):=p(X=x):=p({\omega \in \Omega: X(\omega)=x})$ wird ein Wahrscheinlichkeitsraum $(X(\Omega),p_x)$ definiert; denn $\sum p_x(x)=p(\Omega)=1$. $p_x$ heißt die von X induzierte Verteilung. $X(\Omega)$ ist meist erheblich kleiner als $\Omega$. -Beispiel: Augensumme beim Doppelwurf: $X:\Omega\rightarrow \mathbb{R}, X((i,j))=i+j \rightarrow X(\Omega)={2,3,4,...,12}$ - -Satz: Seien $(\Omega_1, p_1),(\Omega_2, p_2)$ Wahrscheinlichkeitsräume und $(\Omega, p)$ ihr Produktraum. Sei $X:\Omega_1\rightarrow\mathbb{R},Y:\Omega_2\rightarrow \mathbb{R}$, fasse X,Y als ZVA in $\Omega$ zusammen $X((\omega_1,\omega_2))=X(\omega_1)$ und $Y((\omega_1,\omega_2))=Y(\omega_2)$; d.h. X,Y werden auf $\Omega$ "fortgesetzt". Dann sind X,Y stochastisch unabhängig in $(\Omega, p)$ (und $p(X=x)=p_1(X=x), p(Y=y)=p_2(Y=y)$). - -\paragraph{Erwartungswert, Varianz, Covarianz} -Sei $X:\Omega\rightarrow \mathbb{R}$ ZVA im Wahrscheinlichkeitsraum $(\Omega, p)$. $E(X)=\sum_{x\in X(\Omega)}x p(X=x)=\sum_{\omega in Omega} X(\omega)p(\omega)$ "E verhält sich wie Integral"; E(x) heißt Erwartungswert von x. - -Linearität des Erwartungswertes: $E(x+y)=E(x)+E(y)$ und $E(\alpha x)=\alpha E(x)$.\ -Ist $X:\Omega\rightarrow \mathbb{R}$ konstant gleich c, so ist $E(x)=\sum x*p(X=x)=c*p(X=x)=c*1=c$.\ -Die Varianz von X: $Var(X)=E((X-E(X))^2)$ heißt Varianz von X (um E(X)).\ -Die Covarianz: $Cov(X,Y)=E((X-E(X))*(Y-E(Y)))$ heißt Covarianz von X und Y.\ -Der Verschiebungssatz: $Cov(X,Y)=E(X*Y)-E(X)*E(Y)$\ -$Var(X)=Cov(X,X)=E(X*X)-E(X)E(X)=E(X^2)-(E(X))^2$ - -Seien X,Y stochastisch unabhängig ($\leftrightarrow p(X=x \wedge Y=y)=p(X=x)*p(Y=y)$) -$E(X)*E(Y)=\sum_{x\in X(\Omega)} x*p(X=x)* \sum_{y\in Y(\Omega)} y*p(Y=y)=\sum_{x\in X(\Omega)} \sum_{y\in Y(\Omega)} xy*p(X=x)p(Y=y)=\sum_{Z\in\mathbb{R}} z*p(X*Y=Z) = E(X*Y)$. -Sind X,Y stochastisch unabhängig ZVA, so ist $E(X)*E(Y)=E(X*Y)$; folglich $Cov(X,Y)=0$ - -Satz: Seien X,Y ZVA, dann gilt $Var(X+Y)=Var(x)+Var(Y)+2*Cov(X,Y)$. Sind insbesondere X,Y unabhängig gilt: $Var(X+Y)=Var(X)+Var(Y)$. - -Sei $(\Omega, p)$ Wahrscheinlichkeitsraum, $X:\Omega\rightarrow \mathbb{R}$ Zufallsvariable heißt Bernoulliverteilt im Parameter p falls $p(X=1)=p$ und $p(X=0)=1-p$, $p\in [0,1]$. $E(X)=\sum x*p(X=x)= 1*p(X=1)=p$ -Für $X:\Omega\rightarrow {0,1}$ ist $X^2=X$: $Var(X)=E(X^2)-E(X)^2 = p-p^2 = p(1-p)=p*q$ - -\paragraph{Binominalkoeffizienten} -Sei N eine Menge, dann ist $\binom{N}{k} := (x \subseteq N: \text{x hat genau k Elemente } (|x|=k) )$ für $k\in \mathbb{N}$. Für $n\in \mathbb{N}$ sei $\binom{n}{k}:=|(\binom{1,...,k}{k})$. - -Satz: $\binom{n}{0}={n}{n}=1$ f.a. $n\geq 0$ $\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}$ f.a. $n\geq 0,k\geq 1, k\geq n-1$ - -Jede n-elementige Menge N ist $\binom{N}{0}=(\emptyset), \binom{N}{n}={N}\rightarrow \binom{n}{0}=\binom{n}{n}=1$. Den zweiten Teil der Behauptung zeigt man induktiv über n. - -\paragraph{Binominalsatz} -$(a+b)^n = \sum_{k=0}^n a^k b^{n-k}$ für $a,b\in \mathbb{R}$. -Für $n\in \mathbb{N}$ sei $n!=n(n-1)(n-2)...*3*2*1=\prod i$; für $n\in\mathbb{N}$ und $k\geq 0$ sei $[\binom{n}{k}]=\frac{n!}{k!(n-k)!}$ - -Satz: $\binom{n}{0}=\binom{n}{n}=1$ für jedes $n\in\mathbb{N}$, $\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}$ für $k\geq 1$ und $k\leq n-1$. -Zweiter Teil: $[\binom{n-1}{k}]+[\binom{n-1}{k-1}]=\frac{n!}{k!(n-k)!} = [\binom{n}{k}]$. Also stimmen die Rekursionsgleichungen von $\binom{n}{k}$ und $[\binom{n}{k}]$ überein sowie $\binom{n}{k}=[\binom{n}{k}]$. Folglich ist die Anzahl k-elementiger Teilmengen eine n-elementige Menge gleich $\frac{n!}{k!(n-k)!}$. - -Seien $X_1,...,X_n$ unabhängige ZVAen, alle $X_i$ seien Bernoulli-Verteilt im Parameter $p[0,1]$, d.h. $p(X_1=1)=p$, $p(X_i=0)=(1-p)$. Dann ist $X_i=X_1+X_2+...+X_n$ ebenfalls reellwertige ZVA. Im Fall $X_i:\Omega\rightarrow {0,1}$ ist $X:\Omega\rightarrow {0,1,...,n}$. Die Verteilung von X ergibt sich wie folgt, für $k\in {0,1,...,n}$: $p(X=k)=\binom{n}{k}*p^k(1-p)^{n-k}$ - -Eine ZVA heißt binominalverteilt in den Parametern n und p falls gilt: $p(X=k)=\binom{n}{k}p^k (1-p)^{n-k}$ für $k\in{0,1,...,n}$; schreibe $X\sim L(n,p)$. Sonst ist X Bernoulliverteilt (genau dann wenn $X\sim L(1,p)$). - -\paragraph{Erwartungswert und Varianz} -Sei $X\sim L(n,p)$ OBdA $X=X_1,+...+X_n$ wobei $X_i$ unabhängig und Bernoulliverteilt.\ -$E(X)=n*p$, $E(X_i)=p$\ -$Var(X)=n*p*(1-p)$, $Var(X_i)=p*(1-p)$ - -\paragraph{Multinominalverteilung} -$\binom{N}{k_1,...,k_n}$ sei Menge der Abbildungen $f:N\rightarrow {1,...,r}$ mit $k1,...,k_r\geq 0$, $k_1+...+k_r=|\mathbb{N}|$ und $f^{-1}[{j}]=k_j \binom{n}{k_1,...,k_r} = |\binom{N}{k_1,...,k_r}$. - -\paragraph{Hypergeometrische Verteilung} -Beispiel: Urne mit zwei Sorten Kugeln; N Gesamtzahl der Kugeln, M Gesamtzahl Kugeln Sorte 1, N-M Gesamtzahl Kugeln Sorte 2, $n\leq N$ Anzahl Elemente einer Stichprobe. X Anzahl der Kugeln Sorte 1 in einer zufälligen n-elementigen Stichprobe. -$p(X=k)=\frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}$ -Eine ZVA $X:\Omega\rightarrow \mathbb{R}$ heißt hypergeometrisch Verteilt in den Parametern M,N,n falls $p(X=k)$ für alle $k\geq 0, k\geq M$ gilt. - -$E(X)=\sum_{x=0}^M \frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}=...=n*\frac{M}{N}$ - -$Var(X)=E(X^2)-E(X)^2 =...= n*\frac{M}{N}(1-\frac{M}{N})(\binom{N-n}{N-1})$ - -\section{Elementare Graphentheorie} -$G=(V,E)$ heißt Graph mit Eckenmenge $V(G)=V$ und Kantenmenge $E(G)=E\subseteq {{x,y}:x\not=y \in V}$. Veranschaulichung als Punkte in der Ebene (V) mit "Verknüpfunglinien" von x nach y. Bsp $G=({1,2,3,4},{12,13,14,15,16})$. - -$P=x_0,...,x_e$ Folge pw verschiedener Ecken mit $x_{i-1},...,x_i \in E(k)$ für $i\in{1,...,l}$ heißt ein Weg von $x_0$ nach $x_e$ der Länge l. Für $(a,b)\in V(G)$ heißt $d_G(a,b)=min(l: \text{ es gibt einen a,b-Weg der Länge l} )$ Abstand von a nach b. Falls es keinen a,b-Weg gibt, definiere $d_G(a,b)=+\infty$. - -$a\sim b \leftrightarrow$ es gibt einen a,b-Weg in G wird eine Äquivalenzrelation auf V(G) definiert. DIe Äquivalenzklassen heißen (Zusammenhangs-) Komponenten von G. - -G heißt zusammenhängend, wenn G höchstens eine Komponente besitzt. $d_G: V(G) x V(G) \leftrightarrow \mathbb{R}_{\geq 0}$ ist eine Matrix -\begin{itemize} - \item $d_G(x,y)=0 \leftrightarrow x=y$ f.a. $x,y \in V(G)$ - \item $d_G(x,y)=d_G(y,x)$ f.a. $x,y\in V(F)$ - \item $d_G(x,z)\leq d_G(x,y) + d_G(y,z))$ f.a. $x,y,z \in V(G)$ -\end{itemize} - -Für $A\subseteq V(G)$ sei $G[A]:= (A, {x,y\in E(G):x,y\in A})$. Für $F\subseteq E(G)$ sei $G[F]:=(V(G), F)$. $G[A]$ bzw $G[F]$ heißt von A bzw F induzierte Teilgraph. Ein Graph H mit $V(H)\subseteq V(G)$ und $E(H)\subseteq E(G)$ heißt Teilgraph von G, schreibweise $H\leq G$. $\leq$ ist Ordnung, denn: -\begin{itemize} - \item $G\leq G$ - \item $H\leq G \wedge G\leq H \rightarrow H=G$ - \item $H\leq G \wedge G=L \rightarrow H\leq L$ -\end{itemize} - -Ist $P=x_0,...,x_p$ Weg, so heißt auch der Teilgraph ein Weg von $x_0$ nach $x_e$. -Graphen G, H heißen isomorph, falls es einen Isomorphismus von V(G) nach V(H) gibt. Das heißt eine Bijektion. -$V(G)\rightarrow V(H)$ mit $f(x)f(y)\in E(H)\leftrightarrow x,y \in E(G)$. Es gilt: -\begin{itemize} - \item $G\cong G$ - \item $G\cong H \rightarrow H \cong G$ - \item $G\cong H \wedge H\cong L \rightarrow G\cong L$ -\end{itemize} - -Eine Folge $C=x_0,x_1,...,x_{l-1}$ von Ecken mit $x_i,x_{i+1}\in E(G)$ für $i\in {0,...,l-2}$ und $x_{l-1}x_0 \in E(G)$ heißt Kreis in G der Länge l, falls $x_0,...,x_{l-1}$ pw verschieden sind. Bsp: Kreis der Länge 5. - -Ein Teilgraph H des Graphen G (also $H\leq G$) heißt aufspannend, falls $V(H)=V(G)$. Für eine Ecke $x\in V(G)$ sei $d_G(x)=|{x,y\in E(G), y\in V(G)}|$ die Anzahl der mit x indizierten Kanten, der sogenannte Grad von x in G. - -Weiter $N_G(x):={x\in V(G): xy \in E(G)}$ die Menge der nachbarn von x in G. Hier gilt: $|N_G(x)=d_G(x)|$. - -In jedem Graph G gilt $\sum_{x\in V(G)} d_G(x)=2|E(G)|$. Der Durchschnittsgrad von G ist somit $\bar{d(G)}=\frac{1}{|V(G)|}\sum d_G(x)=\frac{2|E(G)|}{|V(G)|}$. - -Ein Graph ist ein Baum wenn G zusammenhängend und G-e nicht zusammenhängend für jedes $e\in E(G)$ "G ist minimal zusammenhängend" -Graph G ist ein Baum wenn G kreisfrei und Graph G+xy nicht kreisfrei für jedes $xy \not\in E(G)$ -G ist Baum, wenn -\begin{itemize} - \item G ist kreisfrei und zusammenhängend - \item G kreisfrei und $|E(G)|=|V(G)|-1$ - \item G zusammenhängend und $|E(G)|=|V(G)|-1$ -\end{itemize} - -Jeder Baum mit wenigstens einer Ecke besitzt eine Ecke vom Grad $\leq 1$, ein sog. Blatt ("jeder Baum besitzt ein Blatt"). -$\rightarrow E(G)=|V(G)|-1$ für jeden Baum also $d(G)=\frac{2|V(G)| -2}{|V(G)|}<2$. - -G Wald $\leftrightarrow$ die Komponenten von G sind Bäume - -G Baum $\leftrightarrow$ G ist zusammenhängender Wald - -Ein Teilgraph H von G heißt Teilbaum von G, falls H ein Baum ist. Ein aufspannender Teilbaum von G heißt Spannbaum von G. G zusammenhängend $\leftrightarrow$ G Spannbaum. - -Ein Spannbaum T von G heißt Breitensuchbaum von G bei $x\in V(G)$ falls $d_F(z,x)=d_G(z,x)$ f.a. $z\in V(G)$. - -Ein Spannbaum T von G heißt Tiefensuchbaum von G bei $x\in V(G)$ falls für jede Kante zy gilt: z liegt auf dem y,x-Weg in T oder y liegt auf dem z,t-Weg in T. - -Satz: Sei G zusammenhängender Graph $x\in V(G)$. -(X) sind $x_0,...,x_{e-1}$ schon gewählt und gibt es ein $+ \in (0,..., e-1)$ so, dass $x_{+}$ einen Nachbarn y in $V(G)\ (x_0,...,x_{e-1} )$, so setze $x_e=y$ und $f(e):=t$; iteriere mit $e+1$ statt e. -Dann ist $T:=({x_0,...,x_e},{x_j*x_{f(j)}: j\in {1,...,e}})$ ein Spannbaum -\begin{itemize} - \item (X) wird in + stets kleinstmöglich gewählt, so ist T ein Breitensuchbaum - \item wird in (X) + stets größtmöglich gewählt, so ist T ein Tiefensuchbaum -\end{itemize} - -\paragraph{Spannbäume minimaler Gewichte} -G Graph, $F \subseteq E(G)$ heißt kreisfrei, falls G(F) kreisfrei ist. - -Lemma (Austauschlemma für Graphen): -Seien F, F' zwei kreisfreie Kantenmengen in Graph G und $|F|<|F'|$, dann gibt es ein $e \in F'/F$ so, dass $F\vee {e}$ kreisfrei ist. - -G, $\omega:E(G)\rightarrow \mathbb{R}$ (Gewichtsfunktion an den Kanten). Für $F\subseteq E(G)$ sei $\omega (F)=\sum \omega (e)$, speziell $\omega (\emptyset)=0$. - -Für einen Teilgraphen H von G sei $\omega (G)=\omega (E(G))$. Ein Spannbaum minimalen Gewichts ist ein Spannbaum T von G mit $\omega (T)\leq \omega (S)$ für jeden Spannbaum S von G. - -Satz (Kruskal): Sei G zuständiger Graph, $\omega:E(G)\rightarrow \mathbb{R}$; Setze $F=\emptyset$. Solange es eine Kante $e\in E(G)/F$ gibt so, dass $F \vee (e)$ kreisfrei ist, wähle e mit minimalem Gewicht $\omega(e)$, setzte $F=F\vee {e}$, iterieren. Das Verfahren endet mit einem Spannbaum $T=G(F)$ minimalen Gewichts. - -Beweis: Weil G endlich ist endet das Verfahren mit einem maximal kreisfreien Graphen T. Seien $e_1,...,e_n$ die Kanten von T in der Reihenfolge ihres Erscheinens, sei S Spannbaum minimalen Gewichts und $f_1,...,f_m$ die Kanten in Reihenfolge aufsteigenden Gewichts. Angenommen (redactio ad absurdum) $\omega(T)>\omega(S)$. Dann gibt es ein $i\in{1,...,m}$ mit $\omega(e_i)>\omega(f_i)$. Wähle i kleinstmöglich, dann ist $F={e_1,...,e_{i-1}}$ und $F'={f_1,...,f_i}$ kreisfrei. Nach Austauschlemma gibt es ein $f\in F'/F$ so, dass $F\vee {f}$ kreisfrei ist. Also ist f ein Kandidat bei der Auswahl von $e_i$ gewesen, also $\omega(e_i)\leq \omega(f)$ (Fehler!). Folglich ist $\omega(T)\leq \omega(S) \Rightarrow \omega(T)=\omega(S)$ also T und S Spannbaum mit minimalen Gewichten. - -\subsection{Das Traveling Salesman Problem} -G sei Graph (vollständig) auf n Ecken, d.h. $xy\in E(G) \forall x\not =y$ aus V(G) und $\omega*E(G)\rightarrow \mathbb{R}$. Finde aufspannenden Kreis C von G minimalen Gewichts. Zusatzannahme (metrische TSP) $\omega(xz)\leq \omega(xy)+\omega(yz)$. -Finde einen aufspannenden Kreis C, der um einen Faktor von höchstens zwei von einem aufspannenden Kreis D minimalen Gewichts abweicht ($\omega(C)\leq 2 \omega(D)$) sog. Approximationsalgorithmus mit Gütefaktor $\leq$. - -Konstruiere eine Folge$x_0,...,x_m$ mit der Eigenschaft, dass jede Kante von T genau zweimal zum Übergang benutzt wird, d.h. zu $e\in E(T)$ existieren $i\not = j$ mit $e=x_i x_{i+1}$ und $e=x_j x_{j+1}$ und zu jedem k existieren $e\in E(T)$ mit $e=x_k x_{k+1}$. Das Gewicht dieser Folge sei $\sum \omega(x_i x_{i+1})= 2\omega(T)$. - -Eliminiere Mehrfachnennungen in der Folge. Gibt es $i\not= j$ mit $x_j=x_i$ so streiche x aus der Folge. Das Gewicht der neuen Folge ist maximal so groß wie das Gewicht der alten. Durch iteration erhält man einen aufspannenden Kreis mit $\omega(X) \leq 2 \omega(T)$. Sei e Kante von D $\rightarrow D-e=S$ ist aufspanndender Weg $\rightarrow \omega(T) \leq w(D-e) \leq \omega (D)$. - -G Graph, $k\geq 0$. Eine Funktion $f:V(G)\rightarrow C$ mit $|C|\leq k$ heißt k-Färbung, falls $f(x)\not = f(y)$ für $xy\in E(G)$. G heißt k-färbbar, falls G eine k-Färbung besitzt. Das kleinste $k\geq 0$ für das G k-färbbar ist heißt dramatische Zahl von G, Bezeichnung $X(G)$. - -Satz (Tuga): Sei $k\geq 2$ und G ein Graph ohne Kreise eine Lösung $l\equiv 1 mod k$, dann ist G k-faltbar. G 2-färbbar $\leftrightarrow$ G hat keine Kreise ungerader Länge. Ein Graph heißt bipartit mit den Klassen A,B falls $(x\in A \wedge y\in B)\vee (x\in B \wedge y\in A)$ für alle $xy \in E(G)$ gilt. Genau dann ist G bipartit mit gewissen Klassen A,B wenn G 2-färbbar ist. - -Satz (Hall): Sei G bipartit mit Klassen A,B. Dann gilt G hat ein Matching von A $\leftrightarrow |N_G(X)|\leq |X|$ für alle $X\subseteq A$. - -Satz: "$\rightarrow$" sei M Matching von A in G $\rightarrow |N_G(X)| \leq N_{G[M]}(X)=|X|$. "$\leftarrow$" Induktiv über $|V(G)|$. -Ein schneller Zeuge für die Existenz eines Matchings von A im bipartiten Graphen G mit Klassen A,B ist das Matching selbst. Ein schneller Zeuge für die nicht-existenz eines Matchings ist ein $X\subseteq A$ mit $|N_G(X)| < |X|$. - -Das Entscheidungsproblem "hat ein bipartiter Graph ein Matching?" ist im NP und zugleich in co-NP. Also ist auch Problem "ist ein Graph 2-färbbar?" in NP und co-NP. Das Problem "ist ein Graph 3-färbbar" ist in NP. Es ist sogar NP-vollständig, d.h. jedes Problem in NP (jedes Entscheidungsproblem mit schnellen Zeugen für Ja) lässt sich in Polynomalzeit in dieses Färbungsproblem überführen. - -\end{multicols} +\documentclass[10pt,landscape]{article} +\usepackage{multicol} +\usepackage{calc} +\usepackage{ifthen} +\usepackage[landscape]{geometry} +\usepackage{amsmath,amsthm,amsfonts,amssymb} +\usepackage{color,graphicx,overpic} +\usepackage{hyperref} + +\pdfinfo{ + /Title (Grundlagen und Diskrete Strukturen - Cheatsheet) + /Creator (TeX) + /Producer (pdfTeX 1.40.0) + /Author (Robert Jeutter) + /Subject (Grundlagen und Diskrete Strukturen) +} + +% This sets page margins to .5 inch if using letter paper, and to 1cm +% if using A4 paper. (This probably isn't strictly necessary.) +% If using another size paper, use default 1cm margins. +\ifthenelse{\lengthtest { \paperwidth = 11in}} + { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} } + {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}} + {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } + {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } + } + +% Turn off header and footer +\pagestyle{empty} + +% Redefine section commands to use less space +\makeatletter +\renewcommand{\section}{\@startsection{section}{1}{0mm}% + {-1ex plus -.5ex minus -.2ex}% + {0.5ex plus .2ex}%x + {\normalfont\large\bfseries}} +\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}% + {-1explus -.5ex minus -.2ex}% + {0.5ex plus .2ex}% + {\normalfont\normalsize\bfseries}} +\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}% + {-1ex plus -.5ex minus -.2ex}% + {1ex plus .2ex}% + {\normalfont\small\bfseries}} +\makeatother + +% Define BibTeX command +\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em + T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} + +% Don't print section numbers +\setcounter{secnumdepth}{0} + + +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt plus 0.5ex} + +%My Environments +\newtheorem{example}[section]{Example} +% ----------------------------------------------------------------------- + +\begin{document} +\raggedright +\footnotesize +\begin{multicols}{3} + + +% multicol parameters +% These lengths are set only within the two main columns +%\setlength{\columnseprule}{0.25pt} +\setlength{\premulticols}{1pt} +\setlength{\postmulticols}{1pt} +\setlength{\multicolsep}{1pt} +\setlength{\columnsep}{2pt} + +\section{Aussagen} +Aussagen sind Sätze die wahr oder falsch sind, d.h. der Wahrheitswert ist wahr oder falsch. + +\paragraph{Verknüpfungen von Aussagen} +Seien p und q Aussagen, dass sind folgende Sätze auch Aussagen +- $p \wedge q$ "und" +- $p \vee q$ "oder" +- $\neg p$ "nicht" +- $p \rightarrow q$ "impliziert" +- $p \leftrightarrow q$ "genau dann wenn" + +\paragraph{Wahrheitswerteverlauf} +\begin{tabular}{ l | c | c | c | c | c | c } + p & q & $p\wedge q$ & $p\vee q$ & $\neg q$ & $p\rightarrow q$ & $p\leftrightarrow q$\\ + \hline + f & f & f & f & w & w & w\\ + f & w & f & w & w & w & f\\ + w & f & f & w & f & f & f\\ + w & w & w & w & f & w & w\\ +\end{tabular} + +\begin{description} + \item[Aussagenlogische Variablen] Variable die den Wert w oder f annimmt + \item[Aussagenlogische Formel] Verknüpfung aussagenloser Variablen nach obigen Muster + \item[Belegung] Zuordnung von w/f an jede Variable einer aussagenlogischer Formel + \item[Wahrheitswerteverlauf] Wahrheitswert der Aussagenformel in Abhängigkeit von der Belegung der Variable + \item[Tautologie] Formel deren Wahrheitswerteverlauf konstant w ist + \item[Kontradiktion] Formel deren Wahrheitswerteverlauf konstant f ist + \item[Kontraposition] $(p\rightarrow q)\leftrightarrow (\neg q \rightarrow p)$ ist eine Tautologie + \item[Modus Potens] $(p\vee (p\rightarrow q))\rightarrow q$ ist eine Tautologie + \item[Äquivalenz] Zwei Formeln p,q sind äquivalent (bzw logisch äquivalent) wenn $p\leftrightarrow$ Tautologie ist. Man schreibt $p \equiv q$. Die Formel p impliziert die Formel q, wenn $p\rightarrow q$ eine Tautologie ist +\end{description} + +\paragraph{Regeln} +\begin{itemize} + \item $p\wedge q \equiv q \wedge p$ (Kommutativ) + \item $p\vee q \equiv q \vee p$ (Kommutativ) + \item $p\wedge (q \wedge r) \equiv (p \wedge q) \wedge r$ (Assoziativ) + \item $p\vee ( q \vee r) \equiv (p \vee q) \vee$ (Assoziativ) + \item $p\wedge (q\vee r) \equiv (p\wedge q) \vee (p\wedge r)$ (Distributiv) + \item $p\vee (q\wedge r) \equiv (p\vee q) \wedge (p\vee r)$ (Distributiv) + \item $\neg(\neg q) \equiv q$ (Doppelte Verneinung) + \item $\neg(p\wedge q) \equiv (\neg p) \wedge (\neg q)$ (de Morgansche) +\end{itemize} + +Aussagenformen in einer Variable x aus dem Universum U heißen Prädikate von U. Aussagenformen in n Variablen $x_1,...,x_n$ aus dem Universum U heißen "n-stellige Prädikate" von U. + +Seien p,q Prädikate über U +\begin{itemize} + \item $(\forall x: (p(x) \wedge q(x)))\leftrightarrow (\forall x: p(x) \wedge \forall x: q(x))$ + \item $\exists x: (p(x) \vee q(x)) \leftrightarrow (\exists x: p(x) \vee \exists x: q(x))$ + \item $\neg (\forall x:p(x))\leftrightarrow \exists x: \neg p(x)$ + \item $\neg(\exists x:p(x))\leftrightarrow \forall x:\neg p(x)$ +\end{itemize} +Achtung: Verschiedenartige Quantoren dürfen nicht getauscht werden! gleichartige Quantoren dürfen getauscht werden + +\section{Mengen} +"Eine Menge ist eine Zusammenfassung bestimmter, wohlunterschiedener Objekte unserer Anschauung oder unseres Denkens" ~ Cantor +Von jedem Objekt steht fest, ob es zur Menge gehört oder nicht. + +\paragraph{Wunsch 0} +Es gibt eine Menge. Ist A irgendeine Menge, so ist ${x \in A: \neg (x=x)}$ eine Menge ohne Elemente, die sogenannte leere Menge $\emptyset$. + +\paragraph{Wunsch 1} +"$x\in y$" soll Aussagenform über dem Universum U aller Mengen sein. D.h. für je zwei Mengen x und y ist entweder x ein Element von y oder nicht. D.h. "$x\in y$" ist ein 2-stelliges Prädikat über U. + +\paragraph{Wunsch 2} +Ist p(x) ein Prädikat über U, so soll es eine Menge geben, die aus genau denjenigen Mengen x besteht, für die p(x) wahr ist. Bezeichnung ${x:p(x) "ist-wahr" }$. +Danach gäbe es eine Menge M, die aus genau denjenigen Mengen x mit $x\not \in x$ besteht: $M={x:x\not \in x}$. + +\paragraph{Wunsch 2'} +Ist A eine Menge und p(x) ein Prädikat über U, dann gilt es eine Menge B die aus genau denjenigen Mengen x aus A besteht, für die p(x) wahr ist. Bezeichnung: $B={x\in A:p(x) wahr}$. +Folgerung: die Gesamtheit aller Mengen ist selbst keine Menge, sonst findet man einen Widerspruch wie oben. + +\paragraph{Wunsch 3} +Zwei Mengen x,y sind genau dann gleich wenn sie diesselben Elemente enthalten. D.h. $x=y: \leftrightarrow \forall z:(z\in x \leftrightarrow z\in y)$. Somit gilt für zwei Prädikate p(x), q(x) über U und jede Menge A: ${x\in A: p(x) wahr} = {x\in A: q(x) wahr}$ genau dann, wen q(x), p(x) den gleichen Wahrheitswert für jedes x aus A haben. + +\paragraph{Wunsch 4} +Zu jeder Menge A gibt es eine Menge B, die aus genau denjenigen Mengen besteht, die Teilmengen von A sind. Dabei ist x eine Teilmenge von $y: \leftrightarrow \forall z:(z\in x \rightarrow z \in y) [x \subseteq y]$\ +$B={x:x\subseteq A}=\wp(A)$ B heißt Potentmenge von A\ + +\subsection{Teilmengen} +A Teilmenge von B $\leftrightarrow \forall x: (x\in A \rightarrow x \in B):\Rightarrow A\subseteq B$\ +A Obermenge von B $\leftrightarrow \forall x: (x\in B \rightarrow x \in A):\Rightarrow A\supseteq B$\ +Folglich $A=B \leftrightarrow A\subseteq B \wedge B\subseteq A$\ +Schnittmenge von A und B: $A\cap B = {x: x\in A \wedge x\in B}$\ +Vereinigungsmenge von A und B: $A\cup B = {x: x\in A \vee x\in B}$ + +Sei eine Menge (von Mengen) dann gibt es eine Menge die aus genau den Mengen besteht, die in jeder Menge von A enthalten sind (außer $A=\emptyset$). +Ebenso gibt es Mengen die aus genau den Mengen besteht, die in wenigstens einer Menge aus A liegen. Die Existenz dieser Menge wird axiomatisch gefordert in ZFC:$ UA = {x: \exists z \in A: x \in z}$\ + +Seien A,B Mengen, dann sei $A/B:={x\in A: x\not \in B } = A\bigtriangleup B$\ +De Moorgansche Regel: $\overline{A \cup B} = \overline{A} \cap \overline{B}$ und $\overline{A\cap B}=\overline{A}\cup \overline{B}$\ +Das geordnete Paar (x,y) von Mengen x,y ist definiert durch ${{x},{x,y}}:={x,y}$\ +A und B Mengen: $A x B:={(x,y):x\in A \wedge y \in B}$ + +\section{Relationen} +$A={Peter, Paul, Marry}$ und $B={C++, Basic, Lisp}: R\subseteq AxB$, etwa {(Peter,c++),(Paul, C++), (Marry,Lisp)}. Seien A,B Mengen: Eine Relation von A nach B ist eine Teilmenge R von AxB.\ +$(x,y)\in R:$ x steht in einer Relation R zu y; auch xRy\ +Ist A=B, so heißt R auch binäre Relation auf A + +\paragraph{binäre Relation} +\begin{itemize} + \item Allrelation $R:=AxA \subseteq AxA$ + \item Nullrelation $R:=\emptyset \subseteq AxA$ + \item Gleichheitsrelation $R:={(x,y)... x=y}$ + \item $A=R; R:=((x,y)\in \mathbb{R} x \mathbb{R}, x \leq y)$ + \item $A=\mathbb{Z}; R:={(x,y)\in \mathbb{Z} x \mathbb{Z}: \text{x ist Teiler von y} }$ kurz: x|y +\end{itemize} + +\paragraph{Eigenschaften von Relationen} +Sei $R\in AxA$ binäre Relation auf A +\begin{itemize} + \item Reflexiv $\leftrightarrow$ xRx $\forall x \in A$ + \item symmetrisch $\leftrightarrow xRy \rightarrow yRx$ + \item Antisymmetrisch $\leftrightarrow xRy \wedge yRx \rightarrow x=y$ + \item Transitiv $\leftrightarrow xRy \wedge yRz \rightarrow xRz$ + \item totale Relation $\leftrightarrow xRy \vee yRx \forall x,y \in A$ +\end{itemize} +\begin{itemize} + \item R heißt Äquivalenzrelation $\leftrightarrow$ R reflexiv, symmetrisch und transitiv + \item R heißt Ordnung $\leftrightarrow$ R reflexiv, antisymmetrisch und transitiv + \item R heißt Totalordnung $\leftrightarrow$ R Ordnung und total + \item R heißt Quasiordnung $\leftrightarrow$ R reflexiv und transitiv +\end{itemize} + +\paragraph{Äqivalenzrelation} +Sei A Menge, $C\wp (A)$ Menge von Teilmengen von A. C heißt Partition von A, falls gilt: +1. $UC=A$ d.h. jedes $x\in A$ liegt in (wenigstens) einem $y\in C$ +2. $\emptyset \not \in C$ d.h. jedes $y\in C$ enthält (wenigstens) ein Element von A +3. $X \cap Y = \emptyset$ f.a. $X\not \in Y$ aus C + +Zwei Mengen $X\cap Y = \emptyset$ heißten disjunkt.\ +Satz: Sei $\sim$ Äquivalenzrelation auf A. Für $x\in A$ betrachtet $[x]_{/ \sim }:={y\in A: y \sim x}$. Dann ist ${[x]_{/ \sim }:x\in A}= C_{/ \sim }$ Partition von A. Die Elemente $[x]_{/ \sim }$ von $C_{/ \sim }$ heißen Äquivalenzklassen. Die Elemente von C heißten Teile, Klassen oder Partitionen. + +Somit ist $\equiv(mod m)$ eine Äquivalenzrelation. Ihre Äquivalenzklassen heißen Restklassen mod m + +Ein Graph $G=(V,E)$ ist ein Paar bestehend aus einer Menge V und $E\subseteq (x,y: x \not = y \text{ aus V} )$. +Zu $a,b\in V$ heißt eine Folge $P=x_1,..,x_n$ von paarweise verschiedenen Ebenen mit $a=x_0, b=x_j; x_{j-1},x_i \in E{a*i \in b*j}$ ein a,b-Weg der Länge l oder Weg a nach b. Durch $a\sim b$ gibt es einen a,b-Weg in G, wird eine Äquivalenzrelation auf V definiert, denn: +\begin{itemize} + \item "$\sim$ reflexiv": es ist $x\sim x$, denn $P=x$ ist ein x,x-Weg in G + \item "$\sim$ symmetrisch": aus $x\sim y$ folgt, es gibt einen x,y-Weg $\rightarrow$ es gibt einen y,x-Weg $y\sim x$ + \item "$\sim$ transitiv": aus $x\sim y$ und $y\sim x$ folgt, es gibt einen x,y-Weg und einen y,x-Weg +\end{itemize} +Die Äquivalenzklassen von $\sim _G$ erzeugen die Zusammenhangskomponenten von G + +Satz: Sei C eine Partition von A, dann wird durch $x\sim _G y \leftrightarrow$ es gibt ein $X\in C$ mit $x,y\in X$ eine Äquivalenzrelation auf A definiert. + +\paragraph{(Halb) Ordnungen} +Sei also $leq$ eine Ordnung auf X. Seo $A\subseteq X, b\in X$ +\begin{itemize} + \item b minimal in A $\leftrightarrow b\in A$ und $(c\leq b \rightarrow c=b f.a. c\in A)$ + \item b maximal in A $\leftrightarrow b\in A$ und $(b\leq c \rightarrow b=c f.a. c\in A)$ + \item b kleinstes Element in A $\leftrightarrow b\in A$ und $(b\leq c f.a. c\in A)$ + \item b größtes Element in A $\leftrightarrow b\in A$ und $(c\leq b f.a. c\in A)$ + \item b untere Schranke von A $\leftrightarrow b\leq c f.a. c\in A$ + \item b obere Schranke von A $\leftrightarrow c\leq b f.a. c\in A$ + \item b kleinste obere Schranke von A $\leftrightarrow$ b ist kleinstes Element von $(b'\in X: \text{b' obere Schranke von A})$ auch Supremum von A: $\lor A = b$ + \item b größte untere Schranke von A $\leftrightarrow$ b ist das größte Element von $(b'\in X: \text{ b' untere Schranke von A} )$ auch Infinum von A; $\land A = b$ +\end{itemize} +kleinstes und größtes Element sind jew. eindeutig bestimmt (falls existent) + +Satz: Sei X Menge. $\subseteq$ ist Ordnung auf $\wp(X)$. Ist $O\subseteq \wp(X)$, so ist $sup O=\bigcup O$ und $inf O=\bigcap O$ + +Satz: Die Teilbarkeitrelation | ist Ordnung auf den natürlichen Zahlen $\mathbb{N}$. Es gibt $sup(a,b)=kgV(a,b)$ (kleinstes gemeinsames Vielfaches) und $inf(a,b)=ggT(a,b)$ (größtes gemeinsames Vielfaches) + +\paragraph{Hesse Diagramm} +Darstellung einer Ordnung $\subseteq$ auf X +1. Im Fall $x\subseteq y$ zeichne x "unterhalb" von y in die Ebene +2. Gilt $x\subseteq y (x\not = y)$ und folgt aus $x \subseteq z \subseteq y$ stets $x=z$ oder $y=z$ so wird x mit y "verbunden" + +\paragraph{Zoonsche Lemma} +Zu jeder Menge und für jede Ordnung $\leq$ auf X mit der Eigenschaft, dass jede nicht-leere Kette nach der beschränkt ist, gibt es ein maximales Element. + +\paragraph{Wohlordnungssatz} +Jede Menge lässt sich durch eine Ordnung $\subseteq$ so ordnen, dass jede nichtleere Teilmenge von X darin ein kleinstes Element ist + +\section{Induktion} +X ist eine Menge, $X:=X\vee {X}$\ +M Menge heißt induktiv $:\leftrightarrow \emptyset \in M \wedge \forall X \in M$ $X^+ \in M$. + +Ist O eine Menge von induktiven Mengen, $O\pm O$ dann ist auch $\bigcap O$ induktiv. Insbesondere ist der Durchschnitt zweier induktiver Mengen induktiv. Es gibt eine induktive Menge M: $M =\bigcap {A \in \wp(M): A induktiv}$. +Sei M' irgendeine (andere) induktive Menge $\rightarrow M \cap M'$ ist induktive Teilmenge von M. $\mathbb{N}_M$ ist der Durchschnitt über alle induktiven Teilmengen von M $\mathbb{N}_M \subseteq M \cap M' \subseteq M'$. Folglich ist $\mathbb{N}_m$ Teilmenge jeder induktiven Menge. + +\paragraph{Satz I (Induktion I)} +Sei $p(n)$ ein Prädikat über $\mathbb{N}$. Gelte $p(0)$ und $p(n)\rightarrow p(n^{+})$ f.a. $n\in \mathbb{N}$ dann ist $p(n)$ wahr f.a. $n \in \mathbb{N}$. Schreibe $x=y:\leftrightarrow x\in y \vee x=y$ + +\paragraph{Satz II (Induktion II)} +Sei $p(n)$ ein Prädikat über $\mathbb{N}$, gelte ($\forall x < n: p(x)) \rightarrow p(n)$ f.a. $n\in \mathbb{N}$. Damit ist $p(n)$ wahr für alle $n\in \mathbb{N}$. + +\section{Funktionen} +Seien A,B Mengen: Eine Relation $f\subseteq A x B$ heißt Funktion. A nach B ("$f:A\rightarrow B$") falls es zu jedem $x\in A$ genau ein $y\in B$ mit $(x,y)\in f$ gibt. Dieses y wird mit $f(x)$ bezeichnet. + +Satz: $f:A\rightarrow B, g:A\rightarrow B$; dann gilt $f=g \leftrightarrow f(x)=g(x)$. Sei $f:A\rightarrow B$ Funktion +\begin{itemize} + \item f heißt injektiv $\leftrightarrow$ jedes y aus B hat höchstens ein Urbild + \item f heißt subjektiv $\leftrightarrow$ jedes y aus B hat wenigstens ein Urbild + \item f heißt bijektiv $\leftrightarrow$ jedes y aus B hat genau ein Urbild +\end{itemize} + +Ist $f:A\rightarrow B$ bijektive Funktion, dann ist auch $f^{-1}\subseteq BxA$ bijektiv von B nach A, die Umkehrfunktion von f. +Man nennt f dann Injektion, Surjektion bzw Bijektion +\begin{itemize} + \item f injektiv $\leftrightarrow (f(x)=f(y)\rightarrow x=y)$ f.a. $x,y\in A$ oder $(x\not = y \rightarrow f(x)\not = f(y))$ + \item f surjektiv $\leftrightarrow$ Zu jedem $x\in B$ existiert ein $x\in A$ mit $f(x)=y$ + \item f bijektiv $\leftrightarrow$ f injektiv und surjektiv +\end{itemize} + +Sind $f:A\rightarrow B$ und $g:B\rightarrow C$ Funktionen, so wird durch $(g \circ f)(x):=g(f(x))$ eine Funktion $g \circ f: A \rightarrow C$ definiert, die sog. Konkatenation/Hintereinanderschaltung/Verkettung/Verkopplung von f und g (gesprochen "g nach f"). + +Satz: $f:A\rightarrow B, g:B\rightarrow C$ sind Funktionen. Sind f,g bijektiv, so ist auch $g \circ f: A\rightarrow C$ bijektiv + +Satz: ist $f:A\rightarrow B$ bijektiv, so ist $f^{-1}$ eine Funktion B nach A. Mengen A,B, heißen gleichmächtig ($|A|=|B| \equiv A\cong B$) falls Bijektion von A nach B. $\cong$ ist auf jeder Menge von Mengen eine Äquivalenzrelation +\begin{itemize} + \item "$\cong$ reflexiv": $A\cong A$, denn $f:A\rightarrow A, f(x)=X$, ist Bijektion von A nach A + \item "$\cong$ symmetrisch": Aus $A\cong B$ folgt Bijektion von A nach B $\rightarrow B\cong A$ + \item "$\cong$ transitiv": Aus $A\cong B$ und $B\cong C$ folgt $A\cong C$ +\end{itemize} + +$|A|=|A|:|A|$ ist die Kordinalität von A, d.h. die kleinste zu A gleichmächtige Ordinalzahl. Eine Ordinalzahl ist eine e-transitive Menge von e-transitiven Mengen. Eine Menge X heißt e-transitiv, wenn aus $a\in b$ und $b\in c$ stets $a\in c$ folgt. +Sei $A:=\mathbb{N}$ und $B={0,2,4,...}={n\in \mathbb{N}: 2|n}$, dann sind A und B gleichmächtig, denn $f:A\rightarrow B, f(x)=2x$ ist Bijektion von A nach B. +Eine Menge A heißt endlich, wenn sie gleichmächtig zu einer natürlichen Zahl ist; sonst heißt A unendlich. +Eine Menge A heißt Deckend-unendlich, falls es eine Injektion $f:A\rightarrow B$ gibt die nicht surjektiv ist. + +Satz: A unendlich $\leftrightarrow$ A deckend-unendlich +A,B sind Mengen. A heißt höchstens so mächtig wie B, falls es eine Injektion von A nach B gibt. $|A|\leq |B|$ bzw $A\preceq B$. $\preceq$ ist Quasiordnung auf jeder Menge von Mengen. +\begin{itemize} + \item "$\preceq$ reflexiv": Injektion von A nach A + \item "$\preceq$ transitiv": $A\preceq B$ und $B\preceq C$ folgt Injektion $f:A\rightarrow B$ und $g:B\rightarrow C$. Verkopplung $g \circ f \rightarrow A \preceq C$ +\end{itemize} + +Satz (Vergleichbarkeitssatz): +Für zwei Mengen A,B gilt $|A|\leq |B|$ oder $|B| \leq |A|$. Eine Relation f von A nach B heißt partielle Bijektion (oder Matching), falls es Teilmengen $A'\subseteq A$ und $B'\subseteq B$ gibt sodass f eine Bijektion von A' nach B' gibt. + +Sei M die Menge aller Matchings von A nach B und wie jede Menge durch $\subseteq$ geordnet. Sei $K\subseteq M$ eine Kette von Matchings. K besitzt eine obere Schranke ($\bigcup K$) in M. Seien $(x,y);(x',y')$ zwei Zuordnungspfeile aus $\bigcup K$, zeige $x\not = x'$ und $y\not = y'$ dann folgt Matching. +Jede Kette von Matchings benutzt eine obere Schranke, die ebenfalls ein Matching ist $\rightarrow$ es gibt ein maximales Matching von A nach B, etwa h. Im Fall ($x\in A, y\in B$ mit $(x,y)\in h$) ist h eine Injektion von A nach B, d.h. $|A| \subseteq |B|$ andernfalls $y\in B, x\in A$ mit $x,y\in h$ ist $h^{-1}$ eine Injektion von B nach A, d.h. $|B| \subseteq |A|$. + +Satz (Cantor/Schröder/Bernstein): +Für zwei Mengen A,B gilt: Aus $|A|\subseteq |B|$ und $|B| \subseteq |A|$ folgt $|A| = |B|$. + +Satz (Cantor): +Für jede Menge X gilt: $|X| \leq \wp(X)$ und $|X|\not= |\wp (X)|$. Z.B. ist $|\mathbb{N}|<|\mathbb{R}|$; zu $|\mathbb{N}|$ gleichmächtige Mengen nennt man abzählbar; unendliche nicht-abzählbare Mengen nennt man überzählbar. + +\paragraph{Kontinuitätshypothese} +Aus $|\mathbb{N}|\leq |A| \leq |\mathbb{R}|$ folgt $|A|=|\mathbb{N}|$ oder $|A|=|\mathbb{R}|$ (keine Zwischengrößen). + +Seien M,I zwei Mengen. Eine Funktion $f:I\rightarrow M$ von I nach M heißt auch Familie über der Indexmenge I auf M. Schreibweise $(m_i)_{i\in I}$ wobei $m_i=f(i)$. Familien über $I=\mathbb{N}$ heißen Folgen (bzw. unendliche Folgen). +Eine (endliche) Folge ist eine Familie über einer endlichen Indexmenge I. Funktionen von ${1,...,n}$ in einer Menge A ($a_q,...,a_n\in A$) heißen n-Tupel. Für eine Mengenfamilie $(A_i)_{i\in A}$ sei ihr Produkt durch $\prod A_i=(f: \text{ Funktion von I nach}\bigcup A_i \text{ mit } f(i)\in A_i \text{ f.a. } i\in I)$. Ist allgemein $A_i=A$ konstant, so schreibe $\prod A_i=A^I={f:I\rightarrow R}$. Bezeichnung auch $2^{\mathbb{N}}$. + +\section{Gruppen, Ringe, Körper} +Eine Operation auf eine Menge A ist eine Funktion $f:AxA\rightarrow A$; schreibweise $xfy$. EIne Menge G mit einer Operation $\circ$ auf G heißt Gruppe, falls gilt: +\begin{itemize} + \item $a\circ (b\circ c) = (a\circ b)\circ c$ freie Auswertungsfolge + \item es gibt ein $e\in G$ mit $a\circ e=a$ und $e\circ a=a$ f.a. $a\in G$. e heißt neutrales Element von G und ist eindeutig bestimmt + \item zu jedem $a\in G$ existiert ein $b\in G$ mit $a\circ b=e$ und $b\circ a=e$; wobei e ein neutrales Element ist. b ist durch a eindeutig bestimmt, denn gäbe es noch ein $c\in G$ mit $a\circ c=e$ folgt $b=b\circ e$. Schreibweise für dieses eindeutig durch a bestimmte b: $a^{-1}$ +\end{itemize} + +Eine Gruppe G mit $\circ$ wird auch mit $(G, \circ)$ bezeichnet. Sie heißt kommutativ bzw abelsch, falls neben 1.,2. und 3. außerdem gilt: +\begin{itemize} + \item $a\circ b = b\circ a$ f.a. $a,b \in G$ +\end{itemize} + +Das neutrale Element aus 2. wird mit 1 bezeichnet. Im Fall der abelschen Gruppe benutzt man gerne "additive Schreibung": "+" statt "$\circ$" und "0" statt "1" (Bsp: $1*a = a*1 = a$). +Eine Bijektion von X nach X heißt Permutation von X. $(S_X, \circ)$ ist eine Gruppe. + +Zwei Gruppen $(G, \circ_G)$ und $(H,\circ_H)$ heißen isomorph, falls es einen Isomorphismus von $(G,\circ_G)$ nach $(H,\circ_H)$ gibt (bzw. von G nach H). Schreibweise $(G,\circ_G)\cong (H,\circ_H)$ +\begin{itemize} + \item "$\cong$ reflexiv": $G\cong G$, denn $id_G$ ist ein Isomorphismus + \item "$\cong$ symmetrisch": aus $G\cong G$ folgt: es existiert ein bijektiver Homomorphismus + \item "$\cong$ transitiv": sei $G\cong H$ und $H\cong J \rightarrow$ es gibt einen Isomorphismus $\phi:G\rightarrow H$ und $\psi:H\rightarrow J \rightarrow \phi\circ \psi :G\rightarrow J \rightarrow$ J ist bijektiv. $\phi\circ G$ ist Homomorphismus von G nach J und bijektiv also Isomorph +\end{itemize} +Satz: Jede Gruppe $(G,\circ)$ ist zu einer Untergruppe von $(S_G, \circ)$ isomorph + +\paragraph{Arithmetik von $\mathbb{N}$} +$+: \mathbb{N} x \mathbb{N} \rightarrow \mathbb{N}$ wird definiert durch: +\begin{itemize} + \item $m+0:=m$ f.a. $m\in \mathbb{N}$ (0 ist neutral) + \item $m+n$ sei schon definiert f.a. $m\in \mathbb{N}$ und ein gutes $n\in \mathbb{N}$ + \item $m+n^+:=(m+n)^+$ f.a. $m,n \in \mathbb{N}$ +\end{itemize} + +Satz: $m+n=n+m$ f.a. $m,n\in\mathbb{N}$ (Beweis induktiv über m) + +Satz: $l+(m+n)=(l+m)+n$ f.a. $l,m,n\in\mathbb{N}$ (Klammern sind neutral bzgl +) + +Satz (Streichungregel): aus $a+n=b+n$ folgt $a=b$ f.a. $a,b,n\in\mathbb{N}$ + +\paragraph{Analog: Multiplikation} +$*: \mathbb{N} x \mathbb{N} \rightarrow \mathbb{N}$ wird definiert durch: +\begin{itemize} + \item $m*0:=0$ f.a. $m\in \mathbb{N}$ + \item $m*n^+=m*n+m$ f.a. $n\in\mathbb{N}$ +\end{itemize} +Es gilt: +\begin{itemize} + \item $m*n=n*m$ f.a. $n\in\mathbb{N}$ + \item $m*(n*l)=(m*n)*l$ f.a. $m,n\in\mathbb{N}$ + \item $m*1 = 1*m =m$ f.a. $m\in\mathbb{N}$ + \item $a*n=b*n \rightarrow a=b$ f.a. $a,b\in\mathbb{N}, n\in\mathbb{N}/{0}$ + \item $a*(b+c)=a*b+a*c$ (Distributivgesetz) +\end{itemize} + +\paragraph{Die ganzen Zahlen $\mathbb{Z}$} +Durch $(a,b)\sim (c,d)\leftrightarrow a+d=b+c$ wird eine Äquivalenzrelation auf $\mathbb{N} x\mathbb{N}$ definiert. +Die Äquivalenzklassen bzgl $\sim$ heißen ganze Zahlen (Bezeichnung $\mathbb{Z}$, Bsp $17=[(17,0)]_{/\sim }$). +Wir definieren Operationen +, * auf $\mathbb{Z}$ durch: +\begin{itemize} + \item $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a+c, b+d)]_{/\sim }$ + \item $[(a,b)]_{/\sim } * [(c,d)]_{/\sim } = [(ac+bd, ad+bc)]_{/\sim }$ +\end{itemize} +Zu zeigen ist: Die auf der rechten Seite definierten Klassen hängen nicht von der Wahl der "Repräsentanten" der Klassen auf der linken Seite ab (Wohldefiniert). + +Formal (für +): $[(a,b)]_{/\sim } = [(a',b')]_{/\sim }$ und $[(c,d)]_{/\sim } = [(c',d')]_{/\sim }$ impliziert $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a'+c', b'+d')]_{/\sim }$. Aus der Vss konstant kommt $a+b'=b+a'$ und $c+d'=c'+d$. Dann folgt $a+c+b'+d'=b+d+a'+c'$, also $(a+c, b+d)\sim (a'+c',b'+d')$. + +Satz: $\mathbb{Z}$ ist eine abelsche Gruppe (+ assoziativ, enthält neutrales Element, additiv Invers). +$[(a,0)]_{/\sim }$ wird als a notiert. $-[(a,0)]_{/\sim }=[(0,a)]_{/\sim }$ wird als -a notiert. +Anordnung: $[(a,b)]_{/\sim } \subseteq [(c,d)]_{/\sim } \leftrightarrow a+d\leq b+c$ + +Ein Ring R ist eine Menge mit zwei Operationen $+,*: \mathbb{R} x \mathbb{R} \rightarrow \mathbb{R}$ mit: +\begin{itemize} + \item $a+(b+c) = (a+b)+c$ f.a. $a,b,c\in \mathbb{R}$ + \item Es gibt ein neutrales Element $O\in \mathbb{R}$ mit $O+a=a+O=O$ f.a. $a\in\mathbb{R}$ + \item zu jedem $a\in \mathbb{R}$ gibt es ein $-a\in \mathbb{R}$ mit $a+(-a)=-a+a=0$ + \item $a+b=b+a$ f.a. $a,b\in\mathbb{R}$ + \item $a*(b*c)=(a*b)*c)$ f.a. $a,b,c\in\mathbb{R}$ + \item $a*(b+c)=a*b+a*c$ f.a. $a,b,c\in\mathbb{R}$ +\end{itemize} +R heißt Ring mit 1, falls: +\begin{itemize} + \item es gibt ein $1\in\mathbb{R}$ mit $a*1=1*a=a$ f.a. $a\in\mathbb{R}$ +\end{itemize} +R heißt kommutativ, falls: +\begin{itemize} + \item $a*b=b*a$ f.a. $a,b\in\mathbb{R}$ +\end{itemize} +Ein kommutativer Ring mit $1\not=O$ heißt Körper, falls: +\begin{itemize} + \item zu jedem $a\in\mathbb{R}$ gibt es ein $a^{-1}\in\mathbb{R}$ mit $a*a^{-1}=a^{-1}*a=1$ +\end{itemize} + +Bemerkung: $O$ kann kein multiplikativ inverses haben. +\begin{itemize} + \item Ist $\mathbb{R}$ ein Körper, so ist $\mathbb{R}*=\mathbb{R} /(0)$ mit $*$ eine abelsche Gruppe. + \item $\mathbb{Z}$ mit + und * ist ein kommutativer Ring mit $1 \not= 0$ aber kein Körper + \item $\mathbb{Q}, \mathbb{C}, \mathbb{R}$ mit + und * ist ein Körper +\end{itemize} + +\paragraph{Division mt Rest in $\mathbb{Z}$} +Satz: Zu $a,b\in\mathbb{Z}, b \not= 0$, gibt es eindeutig bestimmte $q,r\in \mathbb{Z}$ mit $a=q*b+r$ und $0\leq q <|b|$ (d.h. $\mathbb{Z}$ ist ein euklidischer Ring). (Beweis über Induktion) + +\paragraph{Zerlegen in primäre Elemente} +Satz: Jede ganze Zahl $n>0$ lässt sich bis auf die Reihenfolge der Faktoren eindeutig als Produkt von Primzahlen darstellen. + +Beweis-Existenz mit Annahme: Der Satz gilt nicht, dann gibt es eine kleinste Zahl n die sich nicht als Produkt von Primzahlen schreiben lässt $\rightarrow$ n weder Primzahl noch 1 $\rightarrow n=m*l$ für $m,l>1 \rightarrow$ m und l sind Produkte von Primzahlen $\rightarrow m*l=$ Produkt von Primzahlen. + +Eindeutigkeit mit Annahme: es gibt ein $n>0$ ohne eindeutige Primfaktorzerlegung (PFZ)$\rightarrow$ es gibt ein kleinstes $n>0$ ohne eindeutige PFZ. Kommt eine Primzahl p in beiden Zerlegungen vor, so hat auch $\frac{n}{p}$ zwei verschiedene PFZen. Man erhält die PFZ von $n'=(1_1-p_1)*b$ aus den PFZen von $q_1-p_1$ und b.. -> Eindeutig bestimmbar. + +\paragraph{Arithmetik im Restklassenring in $\mathbb{Z}$} +Sei $m > 1$ gegeben, $a\equiv \text{b mod m} \leftrightarrow m|a-b$ def. Relation auf $\mathbb{Z}$. Die Äquivalenzklasse zu a wird mit $\bar{a}$ bezeichnet, d.h. $\bar{a}=[a]_{\text{mod m}}={x\in \mathbb{Z}: x\equiv \text{a mod m}}$, $\mathbb{Z}_m={\bar{a}:a\in \mathbb{Z}}$. Sei dazu $\bar{a}\in \mathbb{Z}_m$ beliebig. + +Division mit Rest $\rightarrow$ es gibt eindeutig bestimmt q,r mit $a=q*m+r$ und $0\leq r < m \rightarrow a-r=q*m \rightarrow m| a-r \rightarrow a\equiv \text{r mod m } \rightarrow \bar{a}=\bar{r}$. Also tritt $\bar{a}$ in der Liste $\bar{0},\bar{1},...,\bar{m-1}$ auf. Aus $0\leq i < j \leq m-1$ folgt $\bar{i}\not=\bar{j}$. In der Liste $\bar{0},\bar{1},...,\bar{m-1}$ gibt es daher keine Wiederholungen $\rightarrow |\mathbb{Z}_M|=m$. + +Wir definieren Operationen +,* auf $\mathbb{Z}_m$ durch $\bar{a}+\bar{b}:= \bar{a+b}$ und $\bar{a}*\bar{b}:=\bar{a*b}$ für $a,b\in \mathbb{Z}$. +Wohldefiniert: aus $\bar{a}=\bar{a'}$ und $\bar{b}=\bar{b'}$ folgt $\bar{a+b}=\bar{a'+b'}$. Analog für Multiplikation. + +Eigenschaften von $\mathbb{Z}$ mit +,* werden auf $\mathbb{Z}$ mit +,* "vererbt", z.B. Distributivgesetz. + +Satz: Sei $m\geq 2$ dann ist $\mathbb{Z}_m$ mit +,* ein kommutativer Ring mit $\bar{1}\not=\bar{0}$. Genau dann ist $\mathbb{Z}_m$ sogar ein Körper, wenn m eine Primzahl ist. + +Satz: Genau dann gibt es einen Körper mit n ELementen, wenn n eine Primzahl ist. D.h.. wenn $n=p^a$ ist für eine Primzahl p und $a\geq 1$. + +\paragraph{Konstruktion von $\mathbb{Q}$ aus $\mathbb{Z}$} +Sei $M=\mathbb{Z} x(\mathbb{Z} /{0}$ die Menge von Brüchen. Durch $(a,b)\sim (c,d)\leftrightarrow ad=bc$ wird Äquivalenzrelation auf M durchgeführt. Schreibweise für die Äquivalenzklassen $\frac{a}{b}$ Die Elemente von $\mathbb{Q} :{\frac{a}{b}:a,b\in\mathbb{Z}, b\not=0}$ heißten rationale Zahlen. +Definiere Operationen +,* auf $\mathbb{Q}$ wie folgt: +\begin{itemize} + \item $\frac{a}{b}+\frac{c}{d} = \frac{ad+bc}{b*d}$ (wohldefiniert) + \item $\frac{a}{b}*\frac{c}{d} = \frac{a*c}{b*d}$ +\end{itemize} + +Satz: $\mathbb{Q}$ mit +,* ist ein Körper. + +Durch $\frac{a}{b}\leq\frac{c}{d}$ wird eine totale Ordnung auf $\mathbb{Q}$ definiert. Konstruktion von $\mathbb{R}$ aus $\mathbb{Q}$ mit Dedchin-Schnitten. + +\paragraph{Ring der formalen Potenzreihe} +Sei k ein Körper (oder nur ein Ring mit 1+0). Eine Folge $(a_0, a_1,...,a:n)\in K^{\mathbb{N}}$ mit Einträgen aus K heißt formale Potenzreihe. Die Folge (0,1,0,0,...) wird mit x bezeichnet. Statt $K^{\mathbb{N}}$ schreibt man $K[[x]]$. $(0_0,a_1,a_2,...)$ heißt Polynom in x, falls es ein $d\in \mathbb{N}$ gibt mit $a_j=0$ f.a. $j0$, dann ist $p_B:B\rightarrow [0,1]; p_B(\omega)=\frac{p(\omega)}{p(B)}$ eine Verteilung auf B, denn $\sum p_b(\omega)=\sum \frac{p(\omega)}{p(B)}=\frac{1}{p(B)} \sum p(\omega)= \frac{1}{p(B)} p(B)= 1$. +$p_B$ ist die durch B bedingte Verteilung. Für $A\subseteq \Omega$ gilt $p_B(A\cap B)=\sum p_B(\omega)=\sum\frac{p(\omega)}{p(B)}= \frac{p(A\cap B)}{p(B)}:= p(A|B)$ ("p von A unter B") bedingte Wahrscheinlichkeit von A unter B. + +Satz (Bayer): $p(A|B)=\frac{p(B|A)*p(A)}{p(B)}$ wobei $p_A, p_B \geq 0$ + +Satz (Totale Wahrscheinlichkeit): Seien $A_1, ...,A_k$ paarweise disjunkt, $\bigcup A_j=\Omega, p(A_i)>0, B\subseteq \Omega$, dann gilt $p(B)=\sum p(B|A_i)*p(A_i)$. + +Satz (Bayer, erweitert): $A_1,...,A_k,B$ wie eben, $p(B)>0$. Für $i\in {1,...,k}$ gilt $p(A_i|B)=\frac{p(B|A_i)*p(A_i)}{\sum p(B|A_j)*p(A_j)}$ + +Beispiel: In einem Hut liegen drei beidseitig gefärbte Karten. Jemand zieht ("zufällig") eine Karte und leg sie mit einer ("zufälligen") Seite auf den Tisch. Karten rot/rot, rot/blau und blau/blau. Gegeben er sieht rot, wie groß ist die Wahrscheinlichkeit, dass die andere Seite auch rot ist? +p(unten rot | oben rot) = p(unten rot und oben rot)/p(oben rot) = $\frac{p\binom{r}{r}}{p(\binom{r}{r}\binom{r}{b})}=\frac{\frac{2}{6}}{\frac{3}{6}}=\frac{2}{3}$ + +Eine Funktion $X:\Omega \rightarrow \mathbb{R}$ heißt (reellwertige) Zufallsvariable. Weil $\Omega$ endlich ist, ist auch $X(\Omega)={X(\omega): \omega \in \Omega}\subseteq \mathbb{R}$ endlich. Durch $p_x(x):=p(X=x):=p({\omega \in \Omega: X(\omega)=x})$ wird ein Wahrscheinlichkeitsraum $(X(\Omega),p_x)$ definiert; denn $\sum p_x(x)=p(\Omega)=1$. $p_x$ heißt die von X induzierte Verteilung. $X(\Omega)$ ist meist erheblich kleiner als $\Omega$. +Beispiel: Augensumme beim Doppelwurf: $X:\Omega\rightarrow \mathbb{R}, X((i,j))=i+j \rightarrow X(\Omega)={2,3,4,...,12}$ + +Satz: Seien $(\Omega_1, p_1),(\Omega_2, p_2)$ Wahrscheinlichkeitsräume und $(\Omega, p)$ ihr Produktraum. Sei $X:\Omega_1\rightarrow\mathbb{R},Y:\Omega_2\rightarrow \mathbb{R}$, fasse X,Y als ZVA in $\Omega$ zusammen $X((\omega_1,\omega_2))=X(\omega_1)$ und $Y((\omega_1,\omega_2))=Y(\omega_2)$; d.h. X,Y werden auf $\Omega$ "fortgesetzt". Dann sind X,Y stochastisch unabhängig in $(\Omega, p)$ (und $p(X=x)=p_1(X=x), p(Y=y)=p_2(Y=y)$). + +\paragraph{Erwartungswert, Varianz, Covarianz} +Sei $X:\Omega\rightarrow \mathbb{R}$ ZVA im Wahrscheinlichkeitsraum $(\Omega, p)$. $E(X)=\sum_{x\in X(\Omega)}x p(X=x)=\sum_{\omega in Omega} X(\omega)p(\omega)$ "E verhält sich wie Integral"; E(x) heißt Erwartungswert von x. + +Linearität des Erwartungswertes: $E(x+y)=E(x)+E(y)$ und $E(\alpha x)=\alpha E(x)$.\ +Ist $X:\Omega\rightarrow \mathbb{R}$ konstant gleich c, so ist $E(x)=\sum x*p(X=x)=c*p(X=x)=c*1=c$.\ +Die Varianz von X: $Var(X)=E((X-E(X))^2)$ heißt Varianz von X (um E(X)).\ +Die Covarianz: $Cov(X,Y)=E((X-E(X))*(Y-E(Y)))$ heißt Covarianz von X und Y.\ +Der Verschiebungssatz: $Cov(X,Y)=E(X*Y)-E(X)*E(Y)$\ +$Var(X)=Cov(X,X)=E(X*X)-E(X)E(X)=E(X^2)-(E(X))^2$ + +Seien X,Y stochastisch unabhängig ($\leftrightarrow p(X=x \wedge Y=y)=p(X=x)*p(Y=y)$) +$E(X)*E(Y)=\sum_{x\in X(\Omega)} x*p(X=x)* \sum_{y\in Y(\Omega)} y*p(Y=y)=\sum_{x\in X(\Omega)} \sum_{y\in Y(\Omega)} xy*p(X=x)p(Y=y)=\sum_{Z\in\mathbb{R}} z*p(X*Y=Z) = E(X*Y)$. +Sind X,Y stochastisch unabhängig ZVA, so ist $E(X)*E(Y)=E(X*Y)$; folglich $Cov(X,Y)=0$ + +Satz: Seien X,Y ZVA, dann gilt $Var(X+Y)=Var(x)+Var(Y)+2*Cov(X,Y)$. Sind insbesondere X,Y unabhängig gilt: $Var(X+Y)=Var(X)+Var(Y)$. + +Sei $(\Omega, p)$ Wahrscheinlichkeitsraum, $X:\Omega\rightarrow \mathbb{R}$ Zufallsvariable heißt Bernoulliverteilt im Parameter p falls $p(X=1)=p$ und $p(X=0)=1-p$, $p\in [0,1]$. $E(X)=\sum x*p(X=x)= 1*p(X=1)=p$ +Für $X:\Omega\rightarrow {0,1}$ ist $X^2=X$: $Var(X)=E(X^2)-E(X)^2 = p-p^2 = p(1-p)=p*q$ + +\paragraph{Binominalkoeffizienten} +Sei N eine Menge, dann ist $\binom{N}{k} := (x \subseteq N: \text{x hat genau k Elemente } (|x|=k) )$ für $k\in \mathbb{N}$. Für $n\in \mathbb{N}$ sei $\binom{n}{k}:=|(\binom{1,...,k}{k})$. + +Satz: $\binom{n}{0}={n}{n}=1$ f.a. $n\geq 0$ $\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}$ f.a. $n\geq 0,k\geq 1, k\geq n-1$ + +Jede n-elementige Menge N ist $\binom{N}{0}=(\emptyset), \binom{N}{n}={N}\rightarrow \binom{n}{0}=\binom{n}{n}=1$. Den zweiten Teil der Behauptung zeigt man induktiv über n. + +\paragraph{Binominalsatz} +$(a+b)^n = \sum_{k=0}^n a^k b^{n-k}$ für $a,b\in \mathbb{R}$. +Für $n\in \mathbb{N}$ sei $n!=n(n-1)(n-2)...*3*2*1=\prod i$; für $n\in\mathbb{N}$ und $k\geq 0$ sei $[\binom{n}{k}]=\frac{n!}{k!(n-k)!}$ + +Satz: $\binom{n}{0}=\binom{n}{n}=1$ für jedes $n\in\mathbb{N}$, $\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}$ für $k\geq 1$ und $k\leq n-1$. +Zweiter Teil: $[\binom{n-1}{k}]+[\binom{n-1}{k-1}]=\frac{n!}{k!(n-k)!} = [\binom{n}{k}]$. Also stimmen die Rekursionsgleichungen von $\binom{n}{k}$ und $[\binom{n}{k}]$ überein sowie $\binom{n}{k}=[\binom{n}{k}]$. Folglich ist die Anzahl k-elementiger Teilmengen eine n-elementige Menge gleich $\frac{n!}{k!(n-k)!}$. + +Seien $X_1,...,X_n$ unabhängige ZVAen, alle $X_i$ seien Bernoulli-Verteilt im Parameter $p[0,1]$, d.h. $p(X_1=1)=p$, $p(X_i=0)=(1-p)$. Dann ist $X_i=X_1+X_2+...+X_n$ ebenfalls reellwertige ZVA. Im Fall $X_i:\Omega\rightarrow {0,1}$ ist $X:\Omega\rightarrow {0,1,...,n}$. Die Verteilung von X ergibt sich wie folgt, für $k\in {0,1,...,n}$: $p(X=k)=\binom{n}{k}*p^k(1-p)^{n-k}$ + +Eine ZVA heißt binominalverteilt in den Parametern n und p falls gilt: $p(X=k)=\binom{n}{k}p^k (1-p)^{n-k}$ für $k\in{0,1,...,n}$; schreibe $X\sim L(n,p)$. Sonst ist X Bernoulliverteilt (genau dann wenn $X\sim L(1,p)$). + +\paragraph{Erwartungswert und Varianz} +Sei $X\sim L(n,p)$ OBdA $X=X_1,+...+X_n$ wobei $X_i$ unabhängig und Bernoulliverteilt.\ +$E(X)=n*p$, $E(X_i)=p$\ +$Var(X)=n*p*(1-p)$, $Var(X_i)=p*(1-p)$ + +\paragraph{Multinominalverteilung} +$\binom{N}{k_1,...,k_n}$ sei Menge der Abbildungen $f:N\rightarrow {1,...,r}$ mit $k1,...,k_r\geq 0$, $k_1+...+k_r=|\mathbb{N}|$ und $f^{-1}[{j}]=k_j \binom{n}{k_1,...,k_r} = |\binom{N}{k_1,...,k_r}$. + +\paragraph{Hypergeometrische Verteilung} +Beispiel: Urne mit zwei Sorten Kugeln; N Gesamtzahl der Kugeln, M Gesamtzahl Kugeln Sorte 1, N-M Gesamtzahl Kugeln Sorte 2, $n\leq N$ Anzahl Elemente einer Stichprobe. X Anzahl der Kugeln Sorte 1 in einer zufälligen n-elementigen Stichprobe. +$p(X=k)=\frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}$ +Eine ZVA $X:\Omega\rightarrow \mathbb{R}$ heißt hypergeometrisch Verteilt in den Parametern M,N,n falls $p(X=k)$ für alle $k\geq 0, k\geq M$ gilt. + +$E(X)=\sum_{x=0}^M \frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}=...=n*\frac{M}{N}$ + +$Var(X)=E(X^2)-E(X)^2 =...= n*\frac{M}{N}(1-\frac{M}{N})(\binom{N-n}{N-1})$ + +\section{Elementare Graphentheorie} +$G=(V,E)$ heißt Graph mit Eckenmenge $V(G)=V$ und Kantenmenge $E(G)=E\subseteq {{x,y}:x\not=y \in V}$. Veranschaulichung als Punkte in der Ebene (V) mit "Verknüpfunglinien" von x nach y. Bsp $G=({1,2,3,4},{12,13,14,15,16})$. + +$P=x_0,...,x_e$ Folge pw verschiedener Ecken mit $x_{i-1},...,x_i \in E(k)$ für $i\in{1,...,l}$ heißt ein Weg von $x_0$ nach $x_e$ der Länge l. Für $(a,b)\in V(G)$ heißt $d_G(a,b)=min(l: \text{ es gibt einen a,b-Weg der Länge l} )$ Abstand von a nach b. Falls es keinen a,b-Weg gibt, definiere $d_G(a,b)=+\infty$. + +$a\sim b \leftrightarrow$ es gibt einen a,b-Weg in G wird eine Äquivalenzrelation auf V(G) definiert. DIe Äquivalenzklassen heißen (Zusammenhangs-) Komponenten von G. + +G heißt zusammenhängend, wenn G höchstens eine Komponente besitzt. $d_G: V(G) x V(G) \leftrightarrow \mathbb{R}_{\geq 0}$ ist eine Matrix +\begin{itemize} + \item $d_G(x,y)=0 \leftrightarrow x=y$ f.a. $x,y \in V(G)$ + \item $d_G(x,y)=d_G(y,x)$ f.a. $x,y\in V(F)$ + \item $d_G(x,z)\leq d_G(x,y) + d_G(y,z))$ f.a. $x,y,z \in V(G)$ +\end{itemize} + +Für $A\subseteq V(G)$ sei $G[A]:= (A, {x,y\in E(G):x,y\in A})$. Für $F\subseteq E(G)$ sei $G[F]:=(V(G), F)$. $G[A]$ bzw $G[F]$ heißt von A bzw F induzierte Teilgraph. Ein Graph H mit $V(H)\subseteq V(G)$ und $E(H)\subseteq E(G)$ heißt Teilgraph von G, schreibweise $H\leq G$. $\leq$ ist Ordnung, denn: +\begin{itemize} + \item $G\leq G$ + \item $H\leq G \wedge G\leq H \rightarrow H=G$ + \item $H\leq G \wedge G=L \rightarrow H\leq L$ +\end{itemize} + +Ist $P=x_0,...,x_p$ Weg, so heißt auch der Teilgraph ein Weg von $x_0$ nach $x_e$. +Graphen G, H heißen isomorph, falls es einen Isomorphismus von V(G) nach V(H) gibt. Das heißt eine Bijektion. +$V(G)\rightarrow V(H)$ mit $f(x)f(y)\in E(H)\leftrightarrow x,y \in E(G)$. Es gilt: +\begin{itemize} + \item $G\cong G$ + \item $G\cong H \rightarrow H \cong G$ + \item $G\cong H \wedge H\cong L \rightarrow G\cong L$ +\end{itemize} + +Eine Folge $C=x_0,x_1,...,x_{l-1}$ von Ecken mit $x_i,x_{i+1}\in E(G)$ für $i\in {0,...,l-2}$ und $x_{l-1}x_0 \in E(G)$ heißt Kreis in G der Länge l, falls $x_0,...,x_{l-1}$ pw verschieden sind. Bsp: Kreis der Länge 5. + +Ein Teilgraph H des Graphen G (also $H\leq G$) heißt aufspannend, falls $V(H)=V(G)$. Für eine Ecke $x\in V(G)$ sei $d_G(x)=|{x,y\in E(G), y\in V(G)}|$ die Anzahl der mit x indizierten Kanten, der sogenannte Grad von x in G. + +Weiter $N_G(x):={x\in V(G): xy \in E(G)}$ die Menge der nachbarn von x in G. Hier gilt: $|N_G(x)=d_G(x)|$. + +In jedem Graph G gilt $\sum_{x\in V(G)} d_G(x)=2|E(G)|$. Der Durchschnittsgrad von G ist somit $\bar{d(G)}=\frac{1}{|V(G)|}\sum d_G(x)=\frac{2|E(G)|}{|V(G)|}$. + +Ein Graph ist ein Baum wenn G zusammenhängend und G-e nicht zusammenhängend für jedes $e\in E(G)$ "G ist minimal zusammenhängend" +Graph G ist ein Baum wenn G kreisfrei und Graph G+xy nicht kreisfrei für jedes $xy \not\in E(G)$ +G ist Baum, wenn +\begin{itemize} + \item G ist kreisfrei und zusammenhängend + \item G kreisfrei und $|E(G)|=|V(G)|-1$ + \item G zusammenhängend und $|E(G)|=|V(G)|-1$ +\end{itemize} + +Jeder Baum mit wenigstens einer Ecke besitzt eine Ecke vom Grad $\leq 1$, ein sog. Blatt ("jeder Baum besitzt ein Blatt"). +$\rightarrow E(G)=|V(G)|-1$ für jeden Baum also $d(G)=\frac{2|V(G)| -2}{|V(G)|}<2$. + +G Wald $\leftrightarrow$ die Komponenten von G sind Bäume + +G Baum $\leftrightarrow$ G ist zusammenhängender Wald + +Ein Teilgraph H von G heißt Teilbaum von G, falls H ein Baum ist. Ein aufspannender Teilbaum von G heißt Spannbaum von G. G zusammenhängend $\leftrightarrow$ G Spannbaum. + +Ein Spannbaum T von G heißt Breitensuchbaum von G bei $x\in V(G)$ falls $d_F(z,x)=d_G(z,x)$ f.a. $z\in V(G)$. + +Ein Spannbaum T von G heißt Tiefensuchbaum von G bei $x\in V(G)$ falls für jede Kante zy gilt: z liegt auf dem y,x-Weg in T oder y liegt auf dem z,t-Weg in T. + +Satz: Sei G zusammenhängender Graph $x\in V(G)$. +(X) sind $x_0,...,x_{e-1}$ schon gewählt und gibt es ein $+ \in (0,..., e-1)$ so, dass $x_{+}$ einen Nachbarn y in $V(G)\ (x_0,...,x_{e-1} )$, so setze $x_e=y$ und $f(e):=t$; iteriere mit $e+1$ statt e. +Dann ist $T:=({x_0,...,x_e},{x_j*x_{f(j)}: j\in {1,...,e}})$ ein Spannbaum +\begin{itemize} + \item (X) wird in + stets kleinstmöglich gewählt, so ist T ein Breitensuchbaum + \item wird in (X) + stets größtmöglich gewählt, so ist T ein Tiefensuchbaum +\end{itemize} + +\paragraph{Spannbäume minimaler Gewichte} +G Graph, $F \subseteq E(G)$ heißt kreisfrei, falls G(F) kreisfrei ist. + +Lemma (Austauschlemma für Graphen): +Seien F, F' zwei kreisfreie Kantenmengen in Graph G und $|F|<|F'|$, dann gibt es ein $e \in F'/F$ so, dass $F\vee {e}$ kreisfrei ist. + +G, $\omega:E(G)\rightarrow \mathbb{R}$ (Gewichtsfunktion an den Kanten). Für $F\subseteq E(G)$ sei $\omega (F)=\sum \omega (e)$, speziell $\omega (\emptyset)=0$. + +Für einen Teilgraphen H von G sei $\omega (G)=\omega (E(G))$. Ein Spannbaum minimalen Gewichts ist ein Spannbaum T von G mit $\omega (T)\leq \omega (S)$ für jeden Spannbaum S von G. + +Satz (Kruskal): Sei G zuständiger Graph, $\omega:E(G)\rightarrow \mathbb{R}$; Setze $F=\emptyset$. Solange es eine Kante $e\in E(G)/F$ gibt so, dass $F \vee (e)$ kreisfrei ist, wähle e mit minimalem Gewicht $\omega(e)$, setzte $F=F\vee {e}$, iterieren. Das Verfahren endet mit einem Spannbaum $T=G(F)$ minimalen Gewichts. + +Beweis: Weil G endlich ist endet das Verfahren mit einem maximal kreisfreien Graphen T. Seien $e_1,...,e_n$ die Kanten von T in der Reihenfolge ihres Erscheinens, sei S Spannbaum minimalen Gewichts und $f_1,...,f_m$ die Kanten in Reihenfolge aufsteigenden Gewichts. Angenommen (redactio ad absurdum) $\omega(T)>\omega(S)$. Dann gibt es ein $i\in{1,...,m}$ mit $\omega(e_i)>\omega(f_i)$. Wähle i kleinstmöglich, dann ist $F={e_1,...,e_{i-1}}$ und $F'={f_1,...,f_i}$ kreisfrei. Nach Austauschlemma gibt es ein $f\in F'/F$ so, dass $F\vee {f}$ kreisfrei ist. Also ist f ein Kandidat bei der Auswahl von $e_i$ gewesen, also $\omega(e_i)\leq \omega(f)$ (Fehler!). Folglich ist $\omega(T)\leq \omega(S) \Rightarrow \omega(T)=\omega(S)$ also T und S Spannbaum mit minimalen Gewichten. + +\subsection{Das Traveling Salesman Problem} +G sei Graph (vollständig) auf n Ecken, d.h. $xy\in E(G) \forall x\not =y$ aus V(G) und $\omega*E(G)\rightarrow \mathbb{R}$. Finde aufspannenden Kreis C von G minimalen Gewichts. Zusatzannahme (metrische TSP) $\omega(xz)\leq \omega(xy)+\omega(yz)$. +Finde einen aufspannenden Kreis C, der um einen Faktor von höchstens zwei von einem aufspannenden Kreis D minimalen Gewichts abweicht ($\omega(C)\leq 2 \omega(D)$) sog. Approximationsalgorithmus mit Gütefaktor $\leq$. + +Konstruiere eine Folge$x_0,...,x_m$ mit der Eigenschaft, dass jede Kante von T genau zweimal zum Übergang benutzt wird, d.h. zu $e\in E(T)$ existieren $i\not = j$ mit $e=x_i x_{i+1}$ und $e=x_j x_{j+1}$ und zu jedem k existieren $e\in E(T)$ mit $e=x_k x_{k+1}$. Das Gewicht dieser Folge sei $\sum \omega(x_i x_{i+1})= 2\omega(T)$. + +Eliminiere Mehrfachnennungen in der Folge. Gibt es $i\not= j$ mit $x_j=x_i$ so streiche x aus der Folge. Das Gewicht der neuen Folge ist maximal so groß wie das Gewicht der alten. Durch iteration erhält man einen aufspannenden Kreis mit $\omega(X) \leq 2 \omega(T)$. Sei e Kante von D $\rightarrow D-e=S$ ist aufspanndender Weg $\rightarrow \omega(T) \leq w(D-e) \leq \omega (D)$. + +G Graph, $k\geq 0$. Eine Funktion $f:V(G)\rightarrow C$ mit $|C|\leq k$ heißt k-Färbung, falls $f(x)\not = f(y)$ für $xy\in E(G)$. G heißt k-färbbar, falls G eine k-Färbung besitzt. Das kleinste $k\geq 0$ für das G k-färbbar ist heißt dramatische Zahl von G, Bezeichnung $X(G)$. + +Satz (Tuga): Sei $k\geq 2$ und G ein Graph ohne Kreise eine Lösung $l\equiv 1 mod k$, dann ist G k-faltbar. G 2-färbbar $\leftrightarrow$ G hat keine Kreise ungerader Länge. Ein Graph heißt bipartit mit den Klassen A,B falls $(x\in A \wedge y\in B)\vee (x\in B \wedge y\in A)$ für alle $xy \in E(G)$ gilt. Genau dann ist G bipartit mit gewissen Klassen A,B wenn G 2-färbbar ist. + +Satz (Hall): Sei G bipartit mit Klassen A,B. Dann gilt G hat ein Matching von A $\leftrightarrow |N_G(X)|\leq |X|$ für alle $X\subseteq A$. + +Satz: "$\rightarrow$" sei M Matching von A in G $\rightarrow |N_G(X)| \leq N_{G[M]}(X)=|X|$. "$\leftarrow$" Induktiv über $|V(G)|$. +Ein schneller Zeuge für die Existenz eines Matchings von A im bipartiten Graphen G mit Klassen A,B ist das Matching selbst. Ein schneller Zeuge für die nicht-existenz eines Matchings ist ein $X\subseteq A$ mit $|N_G(X)| < |X|$. + +Das Entscheidungsproblem "hat ein bipartiter Graph ein Matching?" ist im NP und zugleich in co-NP. Also ist auch Problem "ist ein Graph 2-färbbar?" in NP und co-NP. Das Problem "ist ein Graph 3-färbbar" ist in NP. Es ist sogar NP-vollständig, d.h. jedes Problem in NP (jedes Entscheidungsproblem mit schnellen Zeugen für Ja) lässt sich in Polynomalzeit in dieses Färbungsproblem überführen. + +\end{multicols} \end{document} \ No newline at end of file diff --git a/Grundlagen und Diskrete Strukturen - short.tex b/Grundlagen und Diskrete Strukturen - short.tex index 504261e..a71600c 100644 --- a/Grundlagen und Diskrete Strukturen - short.tex +++ b/Grundlagen und Diskrete Strukturen - short.tex @@ -1,245 +1,245 @@ -\documentclass[10pt,landscape]{article} -\usepackage{multicol} -\usepackage{calc} -\usepackage{ifthen} -\usepackage[landscape]{geometry} -\usepackage{amsmath,amsthm,amsfonts,amssymb} -\usepackage{color,graphicx,overpic} -\usepackage{hyperref} - -\pdfinfo{ - /Title (Grundlagen und Diskrete Strukturen - Short Script) - /Creator (TeX) - /Producer (pdfTeX 1.40.0) - /Author (Robert Jeutter) - /Subject (Grundlagen und Diskrete Strukturen) -} - -% This sets page margins to .5 inch if using letter paper, and to 1cm -% if using A4 paper. (This probably isn't strictly necessary.) -% If using another size paper, use default 1cm margins. -\ifthenelse{\lengthtest { \paperwidth = 11in}} - { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} } - {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}} - {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } - {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } - } - -% Turn off header and footer -\pagestyle{empty} - -% Redefine section commands to use less space -\makeatletter -\renewcommand{\section}{\@startsection{section}{1}{0mm}% - {-1ex plus -.5ex minus -.2ex}% - {0.5ex plus .2ex}%x - {\normalfont\large\bfseries}} -\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}% - {-1explus -.5ex minus -.2ex}% - {0.5ex plus .2ex}% - {\normalfont\normalsize\bfseries}} -\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}% - {-1ex plus -.5ex minus -.2ex}% - {1ex plus .2ex}% - {\normalfont\small\bfseries}} -\makeatother - -% Define BibTeX command -\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em - T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} - -% Don't print section numbers -\setcounter{secnumdepth}{0} - - -\setlength{\parindent}{0pt} -\setlength{\parskip}{0pt plus 0.5ex} - -%My Environments -\newtheorem{example}[section]{Example} -% ----------------------------------------------------------------------- - -\begin{document} -\raggedright -\footnotesize -\begin{multicols}{3} - - -% multicol parameters -% These lengths are set only within the two main columns -%\setlength{\columnseprule}{0.25pt} -\setlength{\premulticols}{1pt} -\setlength{\postmulticols}{1pt} -\setlength{\multicolsep}{1pt} -\setlength{\columnsep}{2pt} - -\paragraph{Relationen} -Sei $R\in AxA$ binäre Relation auf A -\begin{itemize} - \item Reflexiv $\leftrightarrow \text{ xRx } \forall x \in A$ - \item symmetrisch $\leftrightarrow \text{ xRy } \rightarrow \text{ yRx }$ - \item Antisymmetrisch $\leftrightarrow \text{ xRy } \wedge yRx \rightarrow x=y$ - \item Transitiv $\leftrightarrow \text{ xRy } \wedge \text{ yRz } \rightarrow \text{ xRz }$ - \item totale Relation $\leftrightarrow \text{ xRy } \vee \text{ yRx } \forall x,y \in A$ -\end{itemize} -R heißt: -\begin{itemize} - \item Äquivalenzrelation $\leftrightarrow$ reflexiv, symmetrisch und transitiv - \item Ordnung $\leftrightarrow$ reflexiv, antisymmetrisch und transitiv - \item Totalordnung $\leftrightarrow$ Ordnung und total - \item Quasiordnung $\leftrightarrow$ reflexiv und transitiv -\end{itemize} - -\paragraph{Partition/Klasse} -Sei $C\wp (A)$. C heißt Partition/Klasse von A, falls gilt: -\begin{itemize} - \item $\bigcup C=A$ d.h. jedes $x\in A$ liegt in (min) einem $y\in C$ - \item $\emptyset \not \in C$ d.h. jedes $y\in C$ enthält (min) ein Element von A - \item $x \cap y = \emptyset$ f.a. $x\not \in y$ aus C -\end{itemize} - -\paragraph{Ordnungen} -Sei $leq$ eine Ordnung auf X. Sei $A\subseteq X, b\in X$ -\begin{itemize} - \item b minimal in A $\leftrightarrow b\in A$ und $(c\leq b \rightarrow c=b f.a. c\in A)$ - \item b maximal in A $\leftrightarrow b\in A$ und $(b\leq c \rightarrow b=c f.a. c\in A)$ - \item b kleinstes Element in A $\leftrightarrow b\in A$ und $(b\leq c f.a. c\in A)$ - \item b größtes Element in A $\leftrightarrow b\in A$ und $(c\leq b f.a. c\in A)$ - \item b untere Schranke von A $\leftrightarrow b\leq c f.a. c\in A$ - \item b obere Schranke von A $\leftrightarrow c\leq b f.a. c\in A$ - \item b kleinste obere Schranke $\leftrightarrow$ kleinstes Element von obere Schranke; Supremum $\lor A = b$ - \item b größte untere Schranke $\leftrightarrow$ größte Element von untere Schranke; Infinum $\land A = b$ -\end{itemize} - -\paragraph{Induktion I} -Sei $p(n)\in \mathbb{N}$. Gelte $p(0)$ und $p(n)\rightarrow p(n^{+})$ f.a. $n\in \mathbb{N}$ dann ist $p(n)$ wahr f.a. $n \in \mathbb{N}$. - -\paragraph{Induktion II} -Sei $p(n)\in \mathbb{N}$, gelte $\{\forall x < n: p(x)\} \rightarrow p(n)$ f.a. $n\in \mathbb{N}$. Damit ist $p(n)$ wahr für alle $n\in \mathbb{N}$. - -\section{Funktionen} -Eine Relation $f\subseteq A x B$ heißt Funktion $f:A\rightarrow B$ falls es zu jedem $x\in A$ genau ein $y\in B$ mit $(x,y)\in f$ gibt. -\begin{itemize} - \item injektiv $\leftrightarrow$ jedes y aus B hat höchstens ein Urbild $f(x)=f(y)\rightarrow x=y$ - \item subjektiv $\leftrightarrow$ jedes y aus B hat wenigstens ein Urbild $f(x)=y$ - \item bijektiv $\leftrightarrow$ jedes y aus B hat genau ein Urbild; injektiv und surjektiv -\end{itemize} -ist $f:A\rightarrow B$ bijektiv, so ist $f^{-1}$ eine Funktion B nach A und gleichmächtig. - -\section{Gruppen, Ringe, Körper} -Eine Menge G mit einer Operation $\circ$ auf G heißt Gruppe, falls gilt: -\begin{itemize} - \item $a\circ (b\circ c) = (a\circ b)\circ c$ freie Auswertungsfolge - \item es gibt ein neutrales Element $e\in G$ mit $a\circ e=a$ und $e\circ a=a$ f.a. $a\in G$ - \item $\forall a\in G \exists b\in G: \{a\circ b=e\} \vee \{b\circ a=e\}; b=a^{-1}$ -\end{itemize} -kommutativ/abelsch, falls neben obigen gilt: -\begin{itemize} - \item $a\circ b = b\circ a$ f.a. $a,b \in G$ -\end{itemize} - -Zwei Gruppen $(G, \circ_G)$ und $(H,\circ_H)$ heißen isomorph, falls es einen Isomorphismus $(G,\circ_G)\cong (H,\circ_H)$ von $(G,\circ_G)$ nach $(H,\circ_H)$ gibt. - -\paragraph{Addition \& Multiplikation} -$+: \mathbb{N} x \mathbb{N} \rightarrow \mathbb{N}$ wird definiert durch: -\begin{itemize} - \item $m+0:=m$ (0 ist neutral) - \item $m+n$ sei schon definiert - \item $m+n^+:=(m+n)^+$ - \item $m*0:=0$ - \item $m*n^+=m*n+m$ - \item $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a+c, b+d)]_{/\sim }$ - \item $[(a,b)]_{/\sim } * [(c,d)]_{/\sim } = [(ac+bd, ad+bc)]_{/\sim }$ -\end{itemize} - -Ein Ring R ist eine Menge mit zwei Operationen $+,*: \mathbb{R} x \mathbb{R} \rightarrow \mathbb{R}$ mit: -\begin{itemize} - \item $a+(b+c) = (a+b)+c$ f.a. $a,b,c\in \mathbb{R}$ - \item Es gibt ein neutrales Element $O\in \mathbb{R}$ mit $O+a=a+O=O$ - \item zu jedem $a\in \mathbb{R}$ gibt es ein $-a\in \mathbb{R}$ mit $a+(-a)=-a+a=0$ - \item $a+b=b+a$ f.a. $a,b\in\mathbb{R}$ - \item $a*(b*c)=(a*b)*c)$ f.a. $a,b,c\in\mathbb{R}$ - \item $a*(b+c)=a*b+a*c$ f.a. $a,b,c\in\mathbb{R}$ - \item heißt Ring mit 1, falls: es gibt ein $1\in\mathbb{R}$ mit $a*1=1*a=a$ - \item heißt kommutativ, falls: $a*b=b*a$ f.a. $a,b\in\mathbb{R}$ - \item heißt Körper, falls: zu jedem $a\in\mathbb{R}$ gibt es ein $a^{-1}\in\mathbb{R}$ mit $a*a^{-1}=1$ - \item Ist $\mathbb{R}$ ein Körper, so ist $\mathbb{R}*=\mathbb{R} /(0)$ mit $*$ eine abelsche Gruppe. - \item $\mathbb{Z}$ mit + und * ist ein kommutativer Ring mit $1 \not= 0$ aber kein Körper - \item $\mathbb{Q}, \mathbb{C}, \mathbb{R}$ mit + und * ist ein Körper -\end{itemize} - -\paragraph{Konstruktion von rationalen Zahlen} -Definiere Operationen +,* auf $\mathbb{Q}$ wie folgt: -\begin{itemize} - \item $\frac{a}{b}+\frac{c}{d} = \frac{ad+bc}{b*d}$ (wohldefiniert) - \item $\frac{a}{b}*\frac{c}{d} = \frac{a*c}{b*d}$ -\end{itemize} - -\paragraph{Ring der formalen Potenzreihe} -Sei k ein Körper. Eine Folge $(a_0,...,a:n)\in K^{\mathbb{N}}$ mit Einträgen aus K heißt formale Potenzreihe $K[[x]]$. -\begin{itemize} - \item +: $(a_0,a_1,...) + (b_0,b_1,...) = (a_o+b_0, a_1+b_1, ...)$ - \item *: $(a_0,a_1,...) + (b_0,b_1,...) = (c_0, c_1,...)$ mit $c_K=\sum_{j=a}^{k} a_j*b_{k-j}$ -\end{itemize} - -\section{Wahrscheinlichkeit} -Ein Wahrscheinlichkeitsraum ist ein Paar $(\Omega, p)$ aus einer endlichen Menge $\Omega$ und einer Funktion $p:\Omega \rightarrow [0,1]\in \mathbb{R}$ -Es gilt für Ereignisse $A,B,A_1,...,A_k$: -\begin{itemize} - \item $A\subseteq B \rightarrow p(A)\leq p(B)$ - \item $p(A\cup B) \rightarrow p(A)+p(B)-p(A\cap B)$ - \item disjunkt($A_i \cap A_J=\emptyset$ für $i\not =j$) so gilt $p(A_1 \cup ... \cup A_k)= p(A_1)+...+p(A_k)$ - \item $p(\Omega / A):=$ Gegenereignis von $A=1-p(A)$ - \item $p(A_1,...,A_k) \leq p(A_1)+...+p(A_k)$ - \item (stochastisch) unabhängig, falls $p(A\cap B) = p(A)*p(B)$ -\end{itemize} - -\paragraph{Bedingte Wahrscheinlichkeiten} -$A,B\subseteq \Omega$ für $p_B(A\cap B)= \frac{p(A\cap B)}{p(B)}:= p(A|B)$\ -Erwartungswert $E(X) = \sum_{\omega \in \Omega} X(\omega)p(\omega)$\ -Linearität von E: $E(x+y)=E(x)+E(y)$ und $E(\alpha x)=\alpha E(x)$\ -Varianz von X: $Var(X)=E((X^2)-E(X))^2)$\ -Covarianz: $Cov(X,Y)=E((X-E(X))*(Y-E(Y)))$\ -Verschiebungssatz: $Cov(X,Y)=E(X*Y)-E(X)*E(Y)$\ -Bernoulliverteilt falls $p(X=1)=p$ und $p(X=0)=1-p$\ -Bernoulli $P=\binom{n}{k}*p^k*(1-p)^{n-k}$\ -$\binom{N}{0}=(\emptyset), \binom{N}{n}={N}, \binom{n}{0}=\binom{n}{n}=1$ $\binom{n}{0}=1, \binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}=\frac{n!}{k!(n-k)!}$ - -\paragraph{Hypergeometrische Verteilung} -Beispiel: Urne mit zwei Sorten Kugeln; N Gesamtzahl der Kugeln, M Gesamtzahl Kugeln Sorte 1, N-M Gesamtzahl Kugeln Sorte 2, $n\leq N$ Anzahl Elemente einer Stichprobe. X Anzahl der Kugeln Sorte 1 in einer zufälligen n-elementigen Stichprobe. -$p(X=k)=\frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}$\ -$E(X)=\sum_{x=0}^M \frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}=n*\frac{M}{N}$\ -$Var(X)=E(X^2)-E(X)^2 = n*\frac{M}{N}(1-\frac{M}{N})\binom{N-n}{N-1}$ - -\section{Elementare Graphentheorie} -$G=(V,E)$ heißt Graph mit Eckenmenge $V(G)=V$ und Kantenmenge $E(G)=E\subseteq {{x,y}:x\not=y \in V}$.\ -Für $(a,b)\in V(G)$ heißt $d_G(a,b)=min(l: \text{ es gibt einen a,b-Weg der Länge l} )$ Abstand von a nach b.\ -G heißt zusammenhängend, wenn G höchstens eine Komponente besitzt. -\begin{itemize} - \item $d_G(x,y)=0 \leftrightarrow x=y$ - \item $d_G(x,y)=d_G(y,x)$ - \item $d_G(x,z)\leq d_G(x,y) + d_G(y,z))$ -\end{itemize} - -Ein Graph ist ein Baum wenn "G ist minimal zusammenhängend und kreisfrei" -\begin{itemize} - \item G ist kreisfrei und zusammenhängend - \item G kreisfrei und $|E(G)|=|V(G)|-1$ - \item G zusammenhängend und $|E(G)|=|V(G)|-1$ -\end{itemize} -Breitensuchbaum von G falls $d_F(z,x)=d_G(z,x)$ f.a. $z\in V(G)$.\ -Tiefensuchbaum von G falls für jede Kante zy gilt: z liegt auf dem y,x-Weg in T oder y liegt auf dem z,t-Weg in T. - -\paragraph{Spannbäume minimaler Gewichte} -Sei G zuständiger Graph, $\omega:E(G)\rightarrow \mathbb{R}$; Setze $F=\emptyset$. Solange es eine Kante $e\in E(G)/F$ gibt so, dass $F \vee (e)$ kreisfrei ist, wähle e mit minimalem Gewicht $\omega(e)$, setzte $F=F\vee {e}$, iterieren. Das Verfahren endet mit einem Spannbaum $T=G(F)$ minimalen Gewichts. - -\paragraph{Das Traveling Salesman Problem} -Konstruiere eine Folge$x_0,...,x_m$ mit der Eigenschaft, dass jede Kante von T genau zweimal zum Übergang benutzt wird, d.h. zu $e\in E(T)$ existieren $i\not = j$ mit $e=x_i x_{i+1}$ und $e=x_j x_{j+1}$ und zu jedem k existieren $e\in E(T)$ mit $e=x_k x_{k+1}$. Das Gewicht dieser Folge sei $\sum \omega(x_i x_{i+1})= 2\omega(T)$. Eliminiere Mehrfachnennungen in der Folge. Durch iteration erhält man einen aufspannenden Kreis mit $\omega(X) \leq 2 \omega(T)$. - -\paragraph{Färbung \& bipartit} -Eine Funktion $f:V(G)\rightarrow C$ mit $|C|\leq k$ heißt k-Färbung, falls $f(x)\not = f(y)$ für $xy\in E(G)$. -Ein Graph heißt bipartit mit den Klassen A,B falls $(x\in A \wedge y\in B)\vee (x\in B \wedge y\in A)$. -Mit Bipartitheit gilt G hat ein Matching von A $\leftrightarrow |N_G(X)|\leq |X|$ für alle $X\subseteq A$. - -\end{multicols} +\documentclass[10pt,landscape]{article} +\usepackage{multicol} +\usepackage{calc} +\usepackage{ifthen} +\usepackage[landscape]{geometry} +\usepackage{amsmath,amsthm,amsfonts,amssymb} +\usepackage{color,graphicx,overpic} +\usepackage{hyperref} + +\pdfinfo{ + /Title (Grundlagen und Diskrete Strukturen - Short Script) + /Creator (TeX) + /Producer (pdfTeX 1.40.0) + /Author (Robert Jeutter) + /Subject (Grundlagen und Diskrete Strukturen) +} + +% This sets page margins to .5 inch if using letter paper, and to 1cm +% if using A4 paper. (This probably isn't strictly necessary.) +% If using another size paper, use default 1cm margins. +\ifthenelse{\lengthtest { \paperwidth = 11in}} + { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} } + {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}} + {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } + {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } + } + +% Turn off header and footer +\pagestyle{empty} + +% Redefine section commands to use less space +\makeatletter +\renewcommand{\section}{\@startsection{section}{1}{0mm}% + {-1ex plus -.5ex minus -.2ex}% + {0.5ex plus .2ex}%x + {\normalfont\large\bfseries}} +\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}% + {-1explus -.5ex minus -.2ex}% + {0.5ex plus .2ex}% + {\normalfont\normalsize\bfseries}} +\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}% + {-1ex plus -.5ex minus -.2ex}% + {1ex plus .2ex}% + {\normalfont\small\bfseries}} +\makeatother + +% Define BibTeX command +\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em + T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} + +% Don't print section numbers +\setcounter{secnumdepth}{0} + + +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt plus 0.5ex} + +%My Environments +\newtheorem{example}[section]{Example} +% ----------------------------------------------------------------------- + +\begin{document} +\raggedright +\footnotesize +\begin{multicols}{3} + + +% multicol parameters +% These lengths are set only within the two main columns +%\setlength{\columnseprule}{0.25pt} +\setlength{\premulticols}{1pt} +\setlength{\postmulticols}{1pt} +\setlength{\multicolsep}{1pt} +\setlength{\columnsep}{2pt} + +\paragraph{Relationen} +Sei $R\in AxA$ binäre Relation auf A +\begin{itemize} + \item Reflexiv $\leftrightarrow \text{ xRx } \forall x \in A$ + \item symmetrisch $\leftrightarrow \text{ xRy } \rightarrow \text{ yRx }$ + \item Antisymmetrisch $\leftrightarrow \text{ xRy } \wedge yRx \rightarrow x=y$ + \item Transitiv $\leftrightarrow \text{ xRy } \wedge \text{ yRz } \rightarrow \text{ xRz }$ + \item totale Relation $\leftrightarrow \text{ xRy } \vee \text{ yRx } \forall x,y \in A$ +\end{itemize} +R heißt: +\begin{itemize} + \item Äquivalenzrelation $\leftrightarrow$ reflexiv, symmetrisch und transitiv + \item Ordnung $\leftrightarrow$ reflexiv, antisymmetrisch und transitiv + \item Totalordnung $\leftrightarrow$ Ordnung und total + \item Quasiordnung $\leftrightarrow$ reflexiv und transitiv +\end{itemize} + +\paragraph{Partition/Klasse} +Sei $C\wp (A)$. C heißt Partition/Klasse von A, falls gilt: +\begin{itemize} + \item $\bigcup C=A$ d.h. jedes $x\in A$ liegt in (min) einem $y\in C$ + \item $\emptyset \not \in C$ d.h. jedes $y\in C$ enthält (min) ein Element von A + \item $x \cap y = \emptyset$ f.a. $x\not \in y$ aus C +\end{itemize} + +\paragraph{Ordnungen} +Sei $leq$ eine Ordnung auf X. Sei $A\subseteq X, b\in X$ +\begin{itemize} + \item b minimal in A $\leftrightarrow b\in A$ und $(c\leq b \rightarrow c=b f.a. c\in A)$ + \item b maximal in A $\leftrightarrow b\in A$ und $(b\leq c \rightarrow b=c f.a. c\in A)$ + \item b kleinstes Element in A $\leftrightarrow b\in A$ und $(b\leq c f.a. c\in A)$ + \item b größtes Element in A $\leftrightarrow b\in A$ und $(c\leq b f.a. c\in A)$ + \item b untere Schranke von A $\leftrightarrow b\leq c f.a. c\in A$ + \item b obere Schranke von A $\leftrightarrow c\leq b f.a. c\in A$ + \item b kleinste obere Schranke $\leftrightarrow$ kleinstes Element von obere Schranke; Supremum $\lor A = b$ + \item b größte untere Schranke $\leftrightarrow$ größte Element von untere Schranke; Infinum $\land A = b$ +\end{itemize} + +\paragraph{Induktion I} +Sei $p(n)\in \mathbb{N}$. Gelte $p(0)$ und $p(n)\rightarrow p(n^{+})$ f.a. $n\in \mathbb{N}$ dann ist $p(n)$ wahr f.a. $n \in \mathbb{N}$. + +\paragraph{Induktion II} +Sei $p(n)\in \mathbb{N}$, gelte $\{\forall x < n: p(x)\} \rightarrow p(n)$ f.a. $n\in \mathbb{N}$. Damit ist $p(n)$ wahr für alle $n\in \mathbb{N}$. + +\section{Funktionen} +Eine Relation $f\subseteq A x B$ heißt Funktion $f:A\rightarrow B$ falls es zu jedem $x\in A$ genau ein $y\in B$ mit $(x,y)\in f$ gibt. +\begin{itemize} + \item injektiv $\leftrightarrow$ jedes y aus B hat höchstens ein Urbild $f(x)=f(y)\rightarrow x=y$ + \item subjektiv $\leftrightarrow$ jedes y aus B hat wenigstens ein Urbild $f(x)=y$ + \item bijektiv $\leftrightarrow$ jedes y aus B hat genau ein Urbild; injektiv und surjektiv +\end{itemize} +ist $f:A\rightarrow B$ bijektiv, so ist $f^{-1}$ eine Funktion B nach A und gleichmächtig. + +\section{Gruppen, Ringe, Körper} +Eine Menge G mit einer Operation $\circ$ auf G heißt Gruppe, falls gilt: +\begin{itemize} + \item $a\circ (b\circ c) = (a\circ b)\circ c$ freie Auswertungsfolge + \item es gibt ein neutrales Element $e\in G$ mit $a\circ e=a$ und $e\circ a=a$ f.a. $a\in G$ + \item $\forall a\in G \exists b\in G: \{a\circ b=e\} \vee \{b\circ a=e\}; b=a^{-1}$ +\end{itemize} +kommutativ/abelsch, falls neben obigen gilt: +\begin{itemize} + \item $a\circ b = b\circ a$ f.a. $a,b \in G$ +\end{itemize} + +Zwei Gruppen $(G, \circ_G)$ und $(H,\circ_H)$ heißen isomorph, falls es einen Isomorphismus $(G,\circ_G)\cong (H,\circ_H)$ von $(G,\circ_G)$ nach $(H,\circ_H)$ gibt. + +\paragraph{Addition \& Multiplikation} +$+: \mathbb{N} x \mathbb{N} \rightarrow \mathbb{N}$ wird definiert durch: +\begin{itemize} + \item $m+0:=m$ (0 ist neutral) + \item $m+n$ sei schon definiert + \item $m+n^+:=(m+n)^+$ + \item $m*0:=0$ + \item $m*n^+=m*n+m$ + \item $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a+c, b+d)]_{/\sim }$ + \item $[(a,b)]_{/\sim } * [(c,d)]_{/\sim } = [(ac+bd, ad+bc)]_{/\sim }$ +\end{itemize} + +Ein Ring R ist eine Menge mit zwei Operationen $+,*: \mathbb{R} x \mathbb{R} \rightarrow \mathbb{R}$ mit: +\begin{itemize} + \item $a+(b+c) = (a+b)+c$ f.a. $a,b,c\in \mathbb{R}$ + \item Es gibt ein neutrales Element $O\in \mathbb{R}$ mit $O+a=a+O=O$ + \item zu jedem $a\in \mathbb{R}$ gibt es ein $-a\in \mathbb{R}$ mit $a+(-a)=-a+a=0$ + \item $a+b=b+a$ f.a. $a,b\in\mathbb{R}$ + \item $a*(b*c)=(a*b)*c)$ f.a. $a,b,c\in\mathbb{R}$ + \item $a*(b+c)=a*b+a*c$ f.a. $a,b,c\in\mathbb{R}$ + \item heißt Ring mit 1, falls: es gibt ein $1\in\mathbb{R}$ mit $a*1=1*a=a$ + \item heißt kommutativ, falls: $a*b=b*a$ f.a. $a,b\in\mathbb{R}$ + \item heißt Körper, falls: zu jedem $a\in\mathbb{R}$ gibt es ein $a^{-1}\in\mathbb{R}$ mit $a*a^{-1}=1$ + \item Ist $\mathbb{R}$ ein Körper, so ist $\mathbb{R}*=\mathbb{R} /(0)$ mit $*$ eine abelsche Gruppe. + \item $\mathbb{Z}$ mit + und * ist ein kommutativer Ring mit $1 \not= 0$ aber kein Körper + \item $\mathbb{Q}, \mathbb{C}, \mathbb{R}$ mit + und * ist ein Körper +\end{itemize} + +\paragraph{Konstruktion von rationalen Zahlen} +Definiere Operationen +,* auf $\mathbb{Q}$ wie folgt: +\begin{itemize} + \item $\frac{a}{b}+\frac{c}{d} = \frac{ad+bc}{b*d}$ (wohldefiniert) + \item $\frac{a}{b}*\frac{c}{d} = \frac{a*c}{b*d}$ +\end{itemize} + +\paragraph{Ring der formalen Potenzreihe} +Sei k ein Körper. Eine Folge $(a_0,...,a:n)\in K^{\mathbb{N}}$ mit Einträgen aus K heißt formale Potenzreihe $K[[x]]$. +\begin{itemize} + \item +: $(a_0,a_1,...) + (b_0,b_1,...) = (a_o+b_0, a_1+b_1, ...)$ + \item *: $(a_0,a_1,...) + (b_0,b_1,...) = (c_0, c_1,...)$ mit $c_K=\sum_{j=a}^{k} a_j*b_{k-j}$ +\end{itemize} + +\section{Wahrscheinlichkeit} +Ein Wahrscheinlichkeitsraum ist ein Paar $(\Omega, p)$ aus einer endlichen Menge $\Omega$ und einer Funktion $p:\Omega \rightarrow [0,1]\in \mathbb{R}$ +Es gilt für Ereignisse $A,B,A_1,...,A_k$: +\begin{itemize} + \item $A\subseteq B \rightarrow p(A)\leq p(B)$ + \item $p(A\cup B) \rightarrow p(A)+p(B)-p(A\cap B)$ + \item disjunkt($A_i \cap A_J=\emptyset$ für $i\not =j$) so gilt $p(A_1 \cup ... \cup A_k)= p(A_1)+...+p(A_k)$ + \item $p(\Omega / A):=$ Gegenereignis von $A=1-p(A)$ + \item $p(A_1,...,A_k) \leq p(A_1)+...+p(A_k)$ + \item (stochastisch) unabhängig, falls $p(A\cap B) = p(A)*p(B)$ +\end{itemize} + +\paragraph{Bedingte Wahrscheinlichkeiten} +$A,B\subseteq \Omega$ für $p_B(A\cap B)= \frac{p(A\cap B)}{p(B)}:= p(A|B)$\ +Erwartungswert $E(X) = \sum_{\omega \in \Omega} X(\omega)p(\omega)$\ +Linearität von E: $E(x+y)=E(x)+E(y)$ und $E(\alpha x)=\alpha E(x)$\ +Varianz von X: $Var(X)=E((X^2)-E(X))^2)$\ +Covarianz: $Cov(X,Y)=E((X-E(X))*(Y-E(Y)))$\ +Verschiebungssatz: $Cov(X,Y)=E(X*Y)-E(X)*E(Y)$\ +Bernoulliverteilt falls $p(X=1)=p$ und $p(X=0)=1-p$\ +Bernoulli $P=\binom{n}{k}*p^k*(1-p)^{n-k}$\ +$\binom{N}{0}=(\emptyset), \binom{N}{n}={N}, \binom{n}{0}=\binom{n}{n}=1$ $\binom{n}{0}=1, \binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}=\frac{n!}{k!(n-k)!}$ + +\paragraph{Hypergeometrische Verteilung} +Beispiel: Urne mit zwei Sorten Kugeln; N Gesamtzahl der Kugeln, M Gesamtzahl Kugeln Sorte 1, N-M Gesamtzahl Kugeln Sorte 2, $n\leq N$ Anzahl Elemente einer Stichprobe. X Anzahl der Kugeln Sorte 1 in einer zufälligen n-elementigen Stichprobe. +$p(X=k)=\frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}$\ +$E(X)=\sum_{x=0}^M \frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}=n*\frac{M}{N}$\ +$Var(X)=E(X^2)-E(X)^2 = n*\frac{M}{N}(1-\frac{M}{N})\binom{N-n}{N-1}$ + +\section{Elementare Graphentheorie} +$G=(V,E)$ heißt Graph mit Eckenmenge $V(G)=V$ und Kantenmenge $E(G)=E\subseteq {{x,y}:x\not=y \in V}$.\ +Für $(a,b)\in V(G)$ heißt $d_G(a,b)=min(l: \text{ es gibt einen a,b-Weg der Länge l} )$ Abstand von a nach b.\ +G heißt zusammenhängend, wenn G höchstens eine Komponente besitzt. +\begin{itemize} + \item $d_G(x,y)=0 \leftrightarrow x=y$ + \item $d_G(x,y)=d_G(y,x)$ + \item $d_G(x,z)\leq d_G(x,y) + d_G(y,z))$ +\end{itemize} + +Ein Graph ist ein Baum wenn "G ist minimal zusammenhängend und kreisfrei" +\begin{itemize} + \item G ist kreisfrei und zusammenhängend + \item G kreisfrei und $|E(G)|=|V(G)|-1$ + \item G zusammenhängend und $|E(G)|=|V(G)|-1$ +\end{itemize} +Breitensuchbaum von G falls $d_F(z,x)=d_G(z,x)$ f.a. $z\in V(G)$.\ +Tiefensuchbaum von G falls für jede Kante zy gilt: z liegt auf dem y,x-Weg in T oder y liegt auf dem z,t-Weg in T. + +\paragraph{Spannbäume minimaler Gewichte} +Sei G zuständiger Graph, $\omega:E(G)\rightarrow \mathbb{R}$; Setze $F=\emptyset$. Solange es eine Kante $e\in E(G)/F$ gibt so, dass $F \vee (e)$ kreisfrei ist, wähle e mit minimalem Gewicht $\omega(e)$, setzte $F=F\vee {e}$, iterieren. Das Verfahren endet mit einem Spannbaum $T=G(F)$ minimalen Gewichts. + +\paragraph{Das Traveling Salesman Problem} +Konstruiere eine Folge$x_0,...,x_m$ mit der Eigenschaft, dass jede Kante von T genau zweimal zum Übergang benutzt wird, d.h. zu $e\in E(T)$ existieren $i\not = j$ mit $e=x_i x_{i+1}$ und $e=x_j x_{j+1}$ und zu jedem k existieren $e\in E(T)$ mit $e=x_k x_{k+1}$. Das Gewicht dieser Folge sei $\sum \omega(x_i x_{i+1})= 2\omega(T)$. Eliminiere Mehrfachnennungen in der Folge. Durch iteration erhält man einen aufspannenden Kreis mit $\omega(X) \leq 2 \omega(T)$. + +\paragraph{Färbung \& bipartit} +Eine Funktion $f:V(G)\rightarrow C$ mit $|C|\leq k$ heißt k-Färbung, falls $f(x)\not = f(y)$ für $xy\in E(G)$. +Ein Graph heißt bipartit mit den Klassen A,B falls $(x\in A \wedge y\in B)\vee (x\in B \wedge y\in A)$. +Mit Bipartitheit gilt G hat ein Matching von A $\leftrightarrow |N_G(X)|\leq |X|$ für alle $X\subseteq A$. + +\end{multicols} \end{document} \ No newline at end of file diff --git a/Grundlagen und Diskrete Strukturen.md b/Grundlagen und Diskrete Strukturen.md index 377ad17..6cfc242 100644 --- a/Grundlagen und Diskrete Strukturen.md +++ b/Grundlagen und Diskrete Strukturen.md @@ -1,665 +1,665 @@ ---- -title: Grundlagen und diskrete Strukturen ---- -# Aussagen -Aussagen sind Sätze die wahr oder falsch sind, d.h. der Wahrheitswert ist wahr oder falsch. -> "5 ist prim" -> Aussage, wahr \ -> "dieser Satz ist falsch" -> keine Aussage - -Für keine natürliche Zahl n>3 ist die Gleichung x^n+y^n=z^n in positiven ganzen Zahl lösbar $\sim$ Fermatsche Ex-Vermutung - -## Verknüpfungen von Aussagen -Seien p und q Aussagen, dass sind folgende Sätze auch Aussagen -- $p \wedge q$ "und" -- $p \vee q$ "oder" -- $\neg p$ "nicht" -- $p \rightarrow q$ "impliziert" -- $p \leftrightarrow q$ "genau dann wenn" - -Der Wahrheitswert dieser Verknüpfung ergibt sich aus den Wahrheitswerten p,q wie folgt -| p | q | $p\wedge q$ | $p\vee q$ | $\neg q$ | $p\rightarrow q$ | $p\leftrightarrow q$ | -| -- | -- | -- | -- | -- | -- | -- | -| f | f | f | f | w | w | w | -| f | w | f | w | w | w | f | -| w | f | f | w | f | f | f | -| w | w | w | w | f | w | w | - -Aussagenlogische Variablen: Variable die den Wert w oder f annimmt - -Aussagenlogische Formel: Verknüpfung aussagenloser Variablen nach obrigen Muster - -Belegung: Zuordnung von w/f an jede Variable einer aussagenlogischer Formel - -Wahrheitswerteverlauf: Wahrheitswert der Aussagenformel in Abhängigkeit von der Belegung der Variable - -Tautologie: Formel deren Wahrheitswerteverlauf konstant w ist - -Kontradiktion: Formel deren Wahrheitswerteverlauf konstant f ist - -Kontraposition: $(p\rightarrow q)\leftrightarrow (\neg q \rightarrow p)$ ist eine Tautologie -Modus Potens: $(p\vee (p\rightarrow q))\rightarrow q$ ist eine Tautologie - -Äquivalenz: Zwei Formeln p,q sind äquivalent (bzw logisch äquivalent) wenn $p\leftrightarrow$ Tautologie ist. Man schreibt $p \equiv q$ - -Die Formel p impliziert die Formel q, wenn $p\rightarrow q$ eine Tautologie ist - -## Regeln -- $p\wedge q \equiv q \wedge p$ (Kommutativ) -- $p\vee q \equiv q \vee p$ (Kommutativ) -- $p\wedge (q \wedge r) \equiv (p \wedge q) \wedge r$ (Assoziativ) -- $p\vee ( q \vee r) \equiv (p \vee q) \vee$ (Assoziativ) -- $p\wedge (q\vee r) \equiv (p\wedge q) \vee (p\wedge r)$ (Distributiv) -- $p\vee (q\wedge r) \equiv (p\vee q) \wedge (p\vee r)$ (Distributiv) -- $\neg(\neg q) \equiv q$ (Doppelte Verneinung) -- $\neg(p\wedge q) \equiv (\neg p) \wedge (\neg q)$ (de Morgansche) - -Aussagenform über den Universen $U_1,...,U_n$: Satz mit Variablen $x_1,...,x_n$ der bei Ersetzung jedes x durch ein Objekt am $U_j$ stets zu einer Aussage wird. -Variablen können mehrfach auftreten, werden aber jeweils durch das gleiche Objekt (aus $U_j$) ersetzt. -- "x ist prim" ist eine Aussagenform über dem Universum $\N$ der natürlichen Zahlen -- "$x Eine Menge ist eine Zusammenfassung bestimmter, wohlunterschiedener Objekte unserer Anschauung oder unseres Denkens. (Cantor) -Von jedem Objekt steht fest, ob es zur Menge gehört oder nicht. - -Bsp: ${M,A,T,H,E,M,A,T,I,K} \approx {M,A,T,H,E,I,K}:$ Mengen der Buchstaben des Wortes Mathematik - -## Probleme der naiven Mathematik -### Wunsch 1 -"$x\in y$" soll Aussagenform über dem Universum U aller Mengen sein. D.h. für je zwei Mengen x und y ist entweder x ein Element von y oder nciht. D.h. "$x\in y$" ist ein 2-stelliges Prädikat über U. -### Wunsch 2 -Ist p(x) ein Prädikat über U, so soll es eine Menge geben, die aus genau denjenigen Mengen x besteht, für die p(x) wahr ist. Bezeichnung ${x:p(x) "ist-wahr" }$. -Danach gäbe es eine Menge M, die aus genau denjenigen Mengen x mit $x\not \in x$ besteht: $M={x:x\not \in x}$. -D.h. Wunsch 1 und 2 führen zu einem Widerspruch in der Mengenlehre!\ -Lösung: Aussonderung nur an bereits "gesicherten" Mengen\ -#### Wunsch 2': -Ist A eine Menge und p(x) ein Prädikat über U, dann gilt es eine Menge B die aus genau denjenigen Mengen x aus A besteht, für die p(x) wahr ist. Bezeichnung: $B={x\in A:p(x) wahr}$. -Folgerung: die Gesamtheit aller Mengen ist selbst keine Menge, sonst findet man einen Widerspruch wie oben. - -### Wunsch 3 -Zwei Mengen x,y sind genau dann gleich wenn sie diesselben Elemente enthalten. D.h. $x=y: \leftrightarrow \forall z:(z\in x \leftrightarrow z\in y)$. Somit gilt für zwei Prädikate p(x), q(x) über U und jede Menge A: ${x\in A: p(x) wahr} = {x\in A: q(x) wahr}$ genau dann, wen q(x), p(x) den gleichen Wahrheitswert für jedes x aus A haben. - -### Wunsch 0 -Es gibt eine Menge. Ist A irgendeine Menge, so ist ${x \in A: \neg (x=x)}$ eine Menge ohne Elemente, die sogenannte leere Menge $\emptyset$. - -### Wunsch 4 -Zu jeder Menge A gibt es eine Menge B, die aus genau denjenigen Mengen besteht, die Teilmengen von A sind. Dabei ist x eine Teilmenge von $y: \leftrightarrow \forall z:(z\in x \rightarrow z \in y) [x \subseteq y]$\ -$B={x:x\subseteq A}=\wp(A)$ B heißt Potentmenge von A\ -Bsp: $\wp({1,2,3}) = (\emptyset, (1),(2),(3),(1,2),(1,3),(2,3),(1,2,3))$ (Daraus lässt sich ein Hesse-Diagramm zeichnen). - -## Teilmengen -A Teilmenge von B $\leftrightarrow \forall x: (x\in A \rightarrow x \in B):\Rightarrow A\subseteq B$\ -A Obermenge von B $\leftrightarrow \forall x: (x\in B \rightarrow x \in A):\Rightarrow A\supseteq B$\ -Folglich $A=B \leftrightarrow A\subseteq B \wedge B\subseteq A$\ -Schnittmenge von A und B: $A\cap B = {x: x\in A \wedge x\in B}$\ -Vereinigungsmenge von A und B: $A\cup B = {x: x\in A \vee x\in B}$ - -Sei eine Menge (von Mengen) dann gibt es eine Menge die aus genau den Mengen besteht, die in jeder Menge von A enthalten sind (außer $A=\emptyset$). -Ebenso gibt es Mengen die aus genau den Mengen besteht, die in wenigstens einer Menge aus A liegen. Die Existenz dieser Menge wird axiomatisch gefordert in ZFC:$ UA = {x: \exists z \in A: x \in z}$\ - -Seien A,B Mengen, dann sei $A/B:={x\in A: x\not \in B } = A\bigtriangleup B$\ -De Moorgansche Regel: $\overline{A \cup B} = \overline{A} \cap \overline{B}$ und $\overline{A\cap B}=\overline{A}\cup \overline{B}$\ -Das geordnete Paar (x,y) von Mengen x,y ist definiert durch ${{x},{x,y}}:={x,y}$\ -A und B Mengen: $A x B:={(x,y):x\in A \wedge y \in B}$ - -# Relationen -$A={Peter, Paul, Marry}$ und $B={C++, Basic, Lisp}: $R\subseteq AxB$, etwa {(Peter,c++),(Paul, C++), (Marry,Lisp)}. Seien A,B Mengen: Eine Relation von A nach B ist eine Teilmenge R von AxB.\ -$(x,y)\in R:$ x steht in einer Relation R zu y; auch xRy\ -Ist A=B, so heißt R auch binäre Relation auf A - -## binäre Relation -1. Allrelation $R:=AxA \subseteq AxA$ -2. Nullrelation $R:=\emptyset \subseteq AxA$ -3. Gleichheitsrelation $R:={(x,y)... x=y} -4. $A=R$ $R:={(x,y)\in \R x \R, x \leq y}$ -5. $A=\Z$ $R:={(x,y)\in \Z x \Z: \text{x ist Teiler von y} }$ kurz: x|y - -## Eigenschaften von Relationen -Sei $R\in AxA$ binäre Relation auf A -1. Reflexiv $\leftrightarrow$ xRx $\forall x \in A$ -2. Symetrisch $\leftrightarrow xRy \rightarrow yRx$ -3. Antisymetrisch $\leftrightarrow xRy \wedge yRx \rightarrow x=y$ -4. Transitiv $\leftrightarrow xRy \wedge yRz \rightarrow xRz$ -5. totale Relation $\leftrightarrow xRy \vee yRx \forall x,y \in A$ - -- R heißt Äquivalenzrelation $\leftrightarrow$ R reflexiv, symetrisch und transitiv -- R heißt Ordnung $\leftrightarrow$ R reflexiv, antisymetrisch und transitiv -- R heißt Totalordnung \$leftrightarrow$ R Ordnung und total -- R heißt Quasiordnung $\leftrightarrow$ R reflexiv und transitiv - - -## Äqivalenzrelation -Sei A Menge, $C\wp (A)$ Menge von teilmengen von A. C heißt Partition von A, falls gilt: -1. $UC=A$ d.h. jedes $x\in A$ liegt in (wenigstens) einem $y\in C$ -2. $\emptyset \not \in C$ d.h. jedes $y\in C$ enthält (wenigstens) ein Element von A -3. $X \cap Y = \emptyset$ f.a. $X\not \in Y$ aus C - -Zwei Mengen $X\cap Y = \emptyset$ heißten disjunkt. -Die Elemente von C heißten Teile, Klassen oder Partitionen. -Satz: Sei \sim Äquivalenzrelation auf A. Für $x\in A$ betrachtet $[x]_{/\sim }:={y\in A: y\sim x}$. Dann ist {[x]_{/\sim }:x\in A}= C_{/\sim }$ Partition von A. Die Elemente $[x]_{/\sim }$ von $C_{/\sim }$ heißen Äquivalenzklassen. - -Wichtiges Bsp: Restklassen modulo m\ -$m\not \in \Z, m \geq 2$; Für $x,y \in \Z$ schreibe $x \equiv y$ mod m ("x konvergent y modulo m") falls $m | (x-y)$. $\equiv (mod m)$ ist eine binäre Relation auf $\Z$ -"$\equiv§ transitiv" aus $x=y mod m$ und $y\equiv z mod m$ folgt $\rightarrow m| x-z$ - -Somit ist $\equiv(mod m)$ eine Äquivalenzrelation. Ihre Äquivalenzklassen heißen Restklassen mod m - -Ein Graph $G=(V,E)$ ist ein Paar bestehend aus einer Menge V und $E\subseteq (x,y: x\not = y \text{ aus V} )$. -Zu $a,b\in V$ heißt eine Folge $P=x_1,..,x_n$ von paarweise verschiedenen Ebenen mit $a=x_0, b=x_j; x_{j-1},x_i \in E{a*i \in b*j}$ ein a,b-Weg der Länge l oder Weg a nach b. Durch a\sim b gibt es einen a,b-Weg in G, wird eine Äquivalenzrelation auf V definiert, denn: -- "$\sim$ reflexiv": es ist $x\sim x$, denn $P=x$ ist ein x,x-Weg in G -- "$\sim$ symetrisch": aus $x\sim y$ folgt, es gibt einen x,y-Weg $\rightarrow$ es gibt einen y,x-Weg $y\sim x$ -- "$\sim$ transitiv": aus $x\sim y$ und $y\sim x$ folgt, es gibt einen x,y-Weg und einen y,x-Weg -Die Äquivalenzklassen von $\sim _G$ erzeugen die Zusammenhangskomponenten von G - -Satz: Sei C eine Partition von A, dann wird durch $x\sim _G y \leftrightarrow$ es gibt ein $X\in C$ mit $x,y\in X$ eine Äquivalenzrelation auf A definiert. - -## (Halb) Ordnungen -Sei also $leq$ eine Ordnung auf X. Seo $A\subseteq X, b\in X$ -- b minimal in A $\leftrightarrow b\in A$ und $(c\leq b \rightarrow c=b f.a. c\in A)$ -- b maximal in A $\leftrightarrow b\in A$ und $(b\leq c \rightarrow b=c f.a. c\in A)$ -- b kleinstes Element in A $\leftrightarrow b\in A$ und $(b\leq c f.a. c\in A)$ -- b größtes Element in A $\leftrightarrow b\in A$ und $(c\leq b f.a. c\in A)$ -- b untere Schranke von A $\leftrightarrow b\leq c f.a. c\in A$ -- b obere Schranke von A $\leftrightarrow c\leq b f.a. c\in A$ -- b kleinste obere Schranke von A $\leftrightarrow$ b ist kleinstes Element von $(b'\in X: \text{b' obere Schranke von A})$ auch Supremum von A: $\lor A = b$ -- b größte untere Schranke von A $\leftrightarrow$ b ist das größte Element von $(b'\in X: \text{ b' untere Schranke von A} )$ auch Infinium von A; $\land A = b$ -kleinstes und größtes Element sind jew. eindeutig bestimmt (falls existent) - -Satz: Sei X Menge. $\subseteq$ ist Ordnung auf $\wp(X)$. Ist $O\subseteq \wp(X)$, so ist $sup O=\bigcup O$ und $inf O=\bigcap O$ - -Satz: Die Teilbarkeitsrelation | ist Ordnung auf den natürlichen Zahlen $\N$. Es gibt $sup(a,b)=kgV(a,b)$ (kleinstes gemeinsames Vielfaches) und $inf(a,b)=ggT(a,b)$ (größtes gemeinsames Vielfaches) - -## Hesse Diagramm -Darstellung einer Ordnung $\subseteq$ auf X -1. Im Fall $x\subseteq y$ zeichne x "unterhalb" von y in die Ebene -2. Gilt $x\subseteq y (x\not = y)$ und folgt aus $x \subseteq z \subseteq y$ stets $x=z$ oder $y=z$ so wird x mit y "verbunden" - -## Zoonsche Lemma -Zu jeder Menge und für jede Ordnung $\leq$ auf X mit der Eigenschaft, dass jede nicht-leere Kette nach der beschränkt ist, gibt es ein maximales Element. - -## Wohlordnungssatz -Jede Menge lässt sich durch eine Ordnung $\subseteq$ so ordnen, dass jede nichtleere Teilmenge von X darin ein kleinstes Element ist - -# Induktion -X ist eine Menge, $X:=X\vee {X}$\ -M Menge heißt induktiv $:\leftrightarrow \emptyset \in M \wedge \forall X \in M$ $X^+ \in M$. - -Ist O eine Menge von induktiven Mengen, $O\pm O$ dann ist auch $\bigcap O$ induktiv. Insbesondere ist der Durchschnitt zweier induktiver Mengen induktiv. Es gibt eine induktive Menge M: $M =\bigcap {A \in \wp(M): A induktiv}$. -Sei M' irgendeine (andere) induktive Menge $\rightarrow M \cap M'$ ist induktive Teilmenge von M. $\N_M$ ist der Durchschnitt über alle induktiven Teilmengen von M $\N_M \subseteq M\cap M' \subseteq M'$. Folglich ist $\N_m$ Teilmenge jeder induktiven Menge. - -## Satz I (Induktion I) -Sei p(n) ein Prädikat über $\N$. Gelte p(0) und $p(n)\rightarrow p(n^+)$ f.a. $n\in \N$ dann ist p(n) wahr f.a. $n\in N$. Schreibe $x=y:\leftrightarrow x\in y \vee x=y$ - -## Satz II (Induktion II) -Sei p(n) ein Prädikat über $\N$, gelte ($\forall x < n: p(x9))\rightarrow p(n)$ f.a. $n\in \N$. Damit ist p(n) wahr für alle $n\in \N$. - -# Funktionen -Seien A,B Mengen: Eine Relation $f\subseteq A x B$ heißt Funktion. A nach B ("$f:A\rightarrow B$") falls es zu jedem $x\in A$ genau ein $y\in B$ mit $(x,y)\in f$ gibt. Dieses y wird mit $f(x) bezeichnet. - -Satz: $f:A\rightarrow B, g:A\rightarrow B$; dann gilt $f=g \leftrightarrow f(x)=g(x)$. Sei $f:A\rightarrow B$ Funktion -1. f heißt injektiv $\leftrightarrow$ jedes y aus B hat höchstens ein Urbild -2. f heißt subjektiv $\leftrightarrow$ jedes y aus B hat wenigstens ein Urbild -3. f heißt bijektiv $\leftrightarrow$ jedes y aus B hat genau ein Urbild - -Ist $f:A\rightarrow B$ bijektive Funktion, dann ist auch $f^{-1}\subseteq BxA$ bijektiv von B nach A, die Umkehrfunktion von f. -Man nennt f dann Injektion, Surjektion bzw Bijektion -- f injektiv $\leftrightarrow (f(x)=f(y)\rightarrow x=y)$ f.a. $x,y\in A$ oder $(x\not = y \rightarrow f(x)\not = f(y))$ -- f surjektiv $\leftrightarrow$ Zu jedem $x\in B$ existiert ein $x\in A$ mit $f(x)=y$ -- f bijektiv $\leftrightarrow$ f injektiv und surjektiv - -Sind $f:A\rightarrow B$ und $g:B\rightarrow C$ Funktionen, so wird durch $(g \circ f)(x):=g(f(x))$ eine Funktion $g \circ f: A \rightarrow C$ definiert, die sog. Konkatenation/Hintereinanderschaltung/Verkettung/Verkopplung von f und g (gesprochen "g nach f"). - -Satz: $f:A\rightarrow B, g:B\rightarrow C$ sind Funktionen. Sind f,g bijektiv, so ist auch $g \circ f: A\rightarrow C$ bijektiv - -Satz: ist $f:A\rightarrow B$ bijektiv, so ist $f^{-1}$ eine Funktion B nach A. Mengen A,B, heißen gleichmächtig ($|A|=|B| \equiv A\cong B$) falls Bijektion von A nach B. $\cong$ ist auf jeder Menge von Mengen eine Äquivalenzrelation -- "$\cong$ reflexiv": $A\cong A$, denn $f:A\rightarrow A, f(x)=X$, ist Bijektion von A nach A -- "$\cong$ symetrisch": Aus $A\cong B$ folgt Bijektion von A nach B $\rightarrow B\cong A$ -- "$\cong$ transitiv": Aus $A\cong B$ und $B\cong C$ folgt $A\cong C$ - -$|A|=|A|:|A|$ ist die Kordinalität von A, d.h. die kleisnte zu A gleichmächtige Ordinalzahö. Eine Ordinalzahl ist eine e-transitive Menge von e-transitiven Mengen. Eine Menge X heißt e-transitiv, wenn aus $a\in b$ und $b\in c$ stets $a\in c$ folgt. -Sei $A:=\N$ und $B={0,2,4,...}={n\in \N: 2|n}$, dann sind A und B gleichmächtig, denn $f:A\rightarrow B, f(x)=2x$ ist Bijektion von A nach B. -Eine Menge A heißt endlich, wenn sie gleichmächtig zu einer natürlichen Zahl ist; sonst heißt A unendlich. -Eine Menge A heißt Deckend-unendlich, falls es eine Injektion $f:A\rightarrow B$ gibt die nicht surjektiv ist. - -Satz: A unendlich $\leftrightarrow$ A deckend-unendlich -A,B sind Mengen. A heißt höchstens so mächtig wie B, falls es eine Injektion von A nach B gibt. $|A|\leq |B|$ bzw $A\preceq B$. $\preceq$ ist Quasiordnung auf jeder Menge von Mengen. -- "$\preceq$ reflexiv": Injektion von A nach A -- "$\preceq$ transitiv": $A\preceq B$ und $B\preceq C$ folgt Injektion $f:A\rightarrow B$ und $g:B\rightarrow C$. Verkopplung $g \circ f \rightarrow A \preceq C$ - -Satz (Vergleichbarkeitssatz): -Für zwei Mengen A,B gilt $|A|\leq |B|$ oder $|B| \leq |A|$. Eine Relation f von A nach B heißt partielle Bijektion (oder Matching), falls es Teilmengen $A'\subseteq A$ und $B'\subseteq B$ gibt sodass f eine Bijektion von A' nach B' gibt. - -Sei M die Menge aller Matchings von A nach B und wie jede Menge durch $\subseteq$ geordnet. Sei $K\subseteq M$ eine Kette von Matchings. K besitzt eine obere Schranke ($\bigcup K$) in M. Seien $(x,y);(x',y')$ zwei Zuordnungspfeile aus $\bigcup K$, zeige $x\not = x'$ und $y\not = y'$ dann folgt Matching. -Jede Kette von Matchings benutzt eine obere Schranke, die ebenfalls ein Matching ist $\rightarrow$ es gibt ein maximales Matching von A nach B, etwa h. Im Fall ($x\in A, y\in B$ mit $(x,y)\in h$) ist h eine Injektion von A nach B, d.h. $|A| \subseteq |B|$ andernfalls $y\in B, x\in A$ mit $x,y\in h$ ist $h^{-1}$ eine Injektion von B nach A, d.h. $|B| \subseteq |A|$. - -## Satz - Cantor/Schröder/Bernstein -Für zwei Mengen A,B gilt: Aus $|A|\subseteq |B|$ und $|B| \subseteq |A|$ folgt $|A| = |B|$. - -Die Komponenten von f und g sind: -- endliche Kreise -- einseitig unendliche Wege -- beidseitig unendliche Wege - -## Satz Cantor -Für jede Menge X gilt: $|X|\leq \wp(X)$ und $|X|\not = |\wp (X)|$. Z.B. ist $|\N|<|\R|$; zu $|\N|$ gleichmächtige Mengen nennt man abzählbar; unendliche nicht-abzählbare Mengen nennt man überzählbar. - -## Kontinuitätshypothese -Aus $|\N|\leq |A| \leq |\R|$ folgt $|A|=|\N|$ oder $|A|=|\R|$ (keine Zwischengrößen) - -Seien M,I zwei Mengen. Eine FUnktion $f:I\rightarrow M$ von I nach M heißt auch Familie über der Indexmenge I auf M. Schreibweise $(m_i)_{i\in I}$ wobei $m_i=f(i)$. Damilien über $I=\N$ heißen Folgen (bzw. unendliche Folgen). -Eine (endliche) Folge ist eine Familie über einer endlichen Indexmenge I. Funktionen von ${1,...,n}$ in einer Menga A ($a_q,...,a_n\in A$) heißen n-Tupel. Für eine Mengenfamilie $(A_i)_{i\in A}$ sei ihr Produkt durch $\prod A_i=(f: \text{ Funktion von I nach}\bigcup A_i \text{ mit } f(i)\in A_i \text{ f.a. } i\in I)$. Ist allgemein $A_i=A$ konstant, so schreibe $\prod A_i=A^I={f:I\rightarrow R}$. Bezeichnung auch $2^{\N}$. - -# Gruppen, Ringe, Körper -Eine Operation auf eine Menge A ist eine Funktion $f:AxA\rightarrow A$; schreibweise $xfy$. EIne Menge G mit einer Operation $\circ$ auf G heißt Gruppe, falls gilt: -1. $a\circ (b\circ c) = (a\circ b)\circ c$ freie Auswertungsfolge -2. es gibt ein $e\in G$ mit $a\circ e=a$ und $e\circ a=a$ f.a. $a\in G$. e heißt neutrales Element von G und ist eindeutig bestimmt -3. zu jedem $a\in G$ existiert ein $b\in G$ mit $a\circ b=e$ und $b\circ a=e$; wobei e ein neutrales Element ist. b ist durch a eindeutig bestimmt, denn gäbe es noch ein $c\in G$ mit $a\circ c=e$ folgt $b=b\circ e$. Schreibweise für dieses eindeutig durch a bestimmte b: $a^{-1}$ - -Eine Gruppe G mit $\circ$ wird auch mit $(G, \circ)$ bezeichnet. Sie heißt kommutativ bzw abelsch, falls neben 1.,2. und 3. außerdem gilt: -4. $a\circ b = b\circ a$ f.a. $a,b \in G$ - -Das neutrale Element aus 2. wird mit 1 bezeichnet. Im Fall der abelschen Gruppe benutzt man gerne "additive Schreibung": "+" statt "$\circ$" und "0" statt "1" (Bsp: $1*a = a*1 = a$) - -Bsp: Sei X Menge und $S_X$ sei die Menge aller Bijektionen von X nach X. EIne Bijektion von X nach X heißt Permutation von X. $(S_X, \circ)$ ist eine Gruppe. - - -Zwei Gruppen $(G, \circ_G)$ und $(H,\circ_H)$ heißen isomorph, falls es einen Isomorphismus von $(G,\circ_G)$ nach $(H,\circ_H)$ gibt (bzw. von G nach H). Schreibweise $(G,\circ_G)\cong (H,\circ_H)$ -- "$\cong$ reflexiv": $G\cong G$, denn $id_G$ ist ein Isomorphismus -- "$\cong$ symetrisch": aus $G\cong G$ folt: es exisitert ein bijektiver Homomorphismus -- "$\cong$ transitiv": sei $G\cong H$ und $H\cong J \rightarrow$ es gibt einen Isomorphismus $\phi:G\rightarrow H$ und $\psi:H\rightarrow J \rightarrow \phi\circ \psi :G\rightarrow J \rightarrow$ J ist bijektiv. $\phi\circ G$ ist Homomorphismus von G nach J und bijektiv also Isomorph - -Satz: Jede Gruppe $(G,\circ)$ ist zu einer Untergruppe von $(S_G, \circ)$ isomorh - -## Arithmetik von $\N$ -$+: \N x \N \rightarrow \N$ wird definiert durch: -- $m+0:=m$ f.a. $m\in \N$ (0 ist neutral) -- $m+n$ sei schon definiert f.a. $m\in \N$ und ein gutes $n\in \N$ -- $m+n^+:=(m+n)^+$ f.a. $m,n \in \N$ -Satz: $m+n=n+m$ f.a. $m,n\in\N$ (Beweis induktiv über m) - -Satz: $l+(m+n)=(l+m)+n$ f.a. $l,m,n\in\N$ (Klammern sind neutral bzgl +) - -Satz (Streichungsregel): aus $a+n=b+n$ folgt $a=b$ f.a. $a,b,n\in\N$ - -## Analog: Multiplikation -$*: \N x \N \rightarrow \N$ wird definiert durch: -- $m*0:=0$ f.a. $m\in \N$ -- $m*n^+=m*n+m$ f.a. $n\in\N$ -Es gilt: -1. $m*n=n*m$ f.a. $n\in\N$ -2. $m*(n*l)=(m*n)*l$ f.a. $m,n\in\N$ -3. $m*1 = 1*m =m$ f.a. $m\in\N$ -4. $a*n=b*n \rightarrow a=b$ f.a. $a,b\in\N, n\in\N/{0}$ -5. $a*(b+c)=a*b+a*c$ (Distributivgesetz) - -## Die ganzen Zahlen $\Z$ -Durch $(a,b)\sim (c,d)\leftrightarrow a+d=b+c$ wird eine Äquivalenzrelation auf $\N x\N$ definiert. -Die Äquivalenzklassen bzgl \sim heißen ganze Zahlen (Bezeichnung $\Z$, Bsp $17=[(17,0)]_{/\sim }$). -Wir definieren Operationen +, * auf $\Z$ durch -- $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a+c, b+d)]_{/\sim }$ -- $[(a,b)]_{/\sim } * [(c,d)]_{/\sim } = [(ac+bd, ad+bc)]_{/\sim }$ -Zu zeigen ist: DIe auf der rechten Seite definierten Klassen hängen nicht von der Wahl der "Repräsentanten" der Klassen auf der linken Seite ab (Wohldefiniert). - -Formal (für +): $[(a,b)]_{/\sim } = [(a',b')]_{/\sim }$ und $[(c,d)]_{/\sim } = [(c',d')]_{/\sim }$ impliziert $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a'+c', b'+d')]_{/\sim }$. Aus der Vss konstant kommt $a+b'=b+a'$ und $c+d'=c'+d$. Dann folgt $a+c+b'+d'=b+d+a'+c'$, also $(a+c, b+d)\sim (a'+c',b'+d')$. - -Satz: $\Z$ ist eine abelsche Gruppe (+ assoziativ, enhält neutrales Element, additiv Invers). -$[(a,0)]_{/\sim }$ wird als a notiert. $-[(a,0)]_{/\sim }=[(0,a)]_{/\sim }$ wird als -a notiert. -Anordnung: $[(a,b)]_{/\sim } \subseteq [(c,d)]_{/\sim } \leftrightarrow a+d\leq b+c$ - -Ein Ring R ist eine Menge mit zwei Operationen $+,*: \R x\R \rightarrow \R$ mit: -1. $a+(b+c) = (a+b)+c$ f.a. $a,b,c\in \R$ -2. Es gibt ein neutrales Element $O\in \R$ mit $O+a=a+O=O$ f.a. $a\in\R$ -3. zu jedem $a\in\R$ gibt es ein $-a\in \R$ mit $a+(-a)=-a+a=0$ -4. $a+b=b+a$ f.a. $a,b\in\R$ -5. $a*(b*c)=(a*b)*c)$ f.a. $a,b,c\in\R$ -6. $a*(b+c)=a*b+a*c$ f.a. $a,b,c\in\R$ -R heißt Ring mit 1, falls: -7. es gibt ein $1\in\R$ mit $a*1=1*a=a$ f.a. $a\in\R$ -R heißt kommutativ, falls: -8. $a*b=b*a$ f.a. $a,b\in\R$ -Ein kommutativer Ring mit $1\not=O$ heißt Körper, falls: -9. zu jedem $a\in\R$ gibt es ein $a^{-1}\in\R$ mit $a*a^{-1}=a^{-1}*a=1$ - -Bemerkung: $O$ kann kein multiplivativ inverses haben. - -- Ist $\R$ ein Körper, so ist $\R*=\R\\{0}$ mit $*$ eine abelsche Gruppe. -- $\Z$ mit + und * ist ein kommutativer RIng mit $1\not=0$ aber kein Körper -- $\mathbb{Q}, \mathbb{C}, \R$ mit + und * ist ein Körper - -## Division mt Rest in $\Z$ -Satz: Zu $a,b\in\Z, b\not=0$, gibt es eindeutig bestimmte $q,r\in\Z$ mit $a=q*b+r$ und $0\leq q <|b|$ (d.h. $\Z$ ist ein euklidischer Ring). (Beweis über Induktion) - -## Zerlegen in primäre Elemente -Satz: Jede ganze Zahl $n>0$ lässt sich bis auf die Reihenfolge der Faktoren eindeutig als Produkt von Primzahlen darstellen. - -Beweis-Existenz mit Annahme: Der Satz gilt nicht, dann gibt es eine kleinste Zahl n die sich nicht als Produkt von Primzahlen schreiben lässt $\rightarrow$ n weder Primzahl noch 1 $\rightarrow n=m*l$ für $m,l>1 \rightarrow$ m und l sind Produkte von Primzahlen $\rightarrow m*l=$ Produkt von Primzahlen. - -Eindeutigkeit mit Annahme: es gibt ein $n>0$ ohen eindeutige Primfaktorzerlegung (PFZ)$\rightarrow$ es gibt ein kleinstes $n>0$ ohne eindeutige PFZ. Kommt eine Primzahl p in beiden Zerlegungen vor, so hat auch $\frac{n}{p}$ zwei versch. PFZen. Man erhält die PFZ von $n'=(1_1-p_1)*b$ aus den PFZen von $q_1-p_1$ und b.. -> Eindeutig bestimmbar. - -## Arithmetik im Restklassenring in $\Z$ -Sei $m>1$ gegeben, $a\equiv b mod m \leftrightarrow m|a-b$ def. Relation auf $\Z$. Die Äquivalenzklasse zu a wird mit $\bar{a}$ bezeichnet, d.h. $\bar{a}=[a]_{/mod m}={x\in \Z: x\equiv a mod m}$, $\Z_m={\bar{a}:a\in\Z}$. Sei dazu $\bar{a}\in\Z_m$ beliebig. - -Division mit Rest $\rightarrow$ es gibt eindeutig bestimmt q,r mit $a?q*m+r$ und $0\leq r < m \rightarrow a-r=q*m \rightarrow m| a-r \rightarrow a\equiv r mod m \rightarrow \bar{a}=\bar{r}$. Also tritt $\bar{a}$ in der Liste $\bar{0},\bar{1},...,\bar{m-1}$ auf. Aus $0\leq i < j \leq m-1$ folgt $\bar{i}\not=\bar{j}$. In der Liste $\bar{0},\bar{1},...,\bar{m-1}$ gibt es daher keine Wiederholungen $\rightarrow |\Z_M|=m$. - -Wir definieren Operationen +,* auf $\Z_m$ durch $\bar{a}+\bar{b}:= \bar{a+b}$ und $\bar{a}*\bar{b}:=\bar{a*b}$ für $a,b\in\Z$. -Wohldefiniert: aus $\bar{a}=\bar{a'}$ und $\bar{b}=\bar{b'}$ folgt $\bar{a+b}=\bar{a'+b'}$. Analog für Multiplikation. - -Eigenschaften von $\Z$ mit +,* werden auf $\Z$ mit +,* "vererbt", z.B. Distributivgesetz. - -Satz: Sei $m\geq 2$ dann ist $\Z_m$ mit +,* ein kommutativer Ring mit $\bar{1}\not=\bar{0}$. Genau dann ist $\Z_m$ sogar ein Körper, wenn m eine Primzahl ist. - -Satz: Genau dann gibt es einen Körper mit n ELementen, wenn n eine Primzahl ist. D.h.. wenn $n=p^a$ ist für eine Primzahl p und $a\geq 1$. - -## Konstruktion von $\mathbb{Q}$ aus $\Z$ -Sei $M=\Z x(\Z /{0}$ die Menge von Brüchen. Durch $(a,b)\sim (c,d)\leftrightarrow ad=bc$ wird Äquivalenzrelation auf M durchgefühert. Schreibweise für die Äquivalenzklassen $\frac{a}{b}$ Die Elemente von $\mathbb{Q} :{\frac{a}{b}:a,b\in\Z, b\not=0}$ heißten rationale Zahlen. -Definiere Operationen +,* auf $\mathbb{Q}$ wie folgt: -- $\frac{a}{b}+\frac{c}{d} = \frac{ad+bc}{b*d}$ (wohldefiniert) -- $\frac{a}{b}*\frac{c}{d} = \frac{a*c}{b*d}$ - -Satz: $\mathbb{Q}$ mit +,* ist ein Körper. -Durch $\frac{a}{b}\leq\frac{c}{d}$ wird eine totale Ordnung auf $\mathbb{Q}$ definiert. Konstruktion von $\R$ aus $\mathbb{Q}$ mit Dedchin-Schnitten. - -### Ring der formalen Potenzreihe -Sei k ein Körper (oder nur ein Ring mit 1+0). Eine Folge $(a_0, a_1,...,a:n)\in K^{\N}$ mit Einträgen aus K heißt formale Potenzreihe. Die Folge (0,1,0,0,...) wird mit x bezeichnet. Statt $K^{\N}$ schreibt man $K[[x]]$. $(0_0,a_1,a_2,...)$ heißt Polynom in x, falls es ein $d\in\N$ gibt mit $a_j=0$ f.a. $j0$, dann ist $p_B:B\rightarrow [0,1]; p_B(\omega)=\frac{p(\omega)}{p(B)}$ eine Verteilung auf B, denn $\sum p_b(\omega)=\sum \frac{p(\omega)}{p(B)}=\frac{1}{p(B)} \sum p(\omega)= \frac{1}{p(B)} p(B)= 1$. -$p_B$ ist die durch B bedingte Verteilung. Für $A\subseteq \Omega$ gilt $p_B(A\cap B)=\sum p_B(\omega)=\sum\frac{p(\omega)}{p(B)}= \frac{p(A\cap B)}{p(B)}:= p(A|B)$ ("p von A unter B") bedingte Wahrscheinlichkeit von A unter B. - -Satz (Bayer): $p(A|B)=\frac{p(B|A)*p(A)}{p(B)}$ wobei $p_A, p_B \geq 0$ - -Satz (Totale Wahrscheinlichkeit): Seien $A_1, ...,A_k$ paarweise disjunkt, $\bigcup A_j=\Omega, p(A_i)>0, B\subseteq \Omega$, dann gilt $p(B)=\sum p(B|A_i)*p(A_i)$. - -Satz (Bayer, erweitert): $A_1,...,A_k,B$ wie eben, $p(B)>0$. Für $i\in {1,...,k}$ gilt $p(A_i|B)=\frac{p(B|A_i)*p(A_i)}{\sum p(B|A_j)*p(A_j)}$ - -Bespiel: In einem Hut liegen drei beidseitig gefärbte Karten. Jemand zieht ("zufällig") eine Karte und leg sie mit einer ("zufälligen") Seite auf den Tisch. Karten rot/rot, rot/blau und blau/blau. Gegeben er sieht rot, wie groß ist die Wahrscheinlichkeit, dass die andere Seite auch rot ist? -p(unten rot | oben rot) = p(unten rot und oben rot)/p(oben rot) = $\frac{p\binom{r}{r}}{p(\binom{r}{r}\binom{r}{b})}=\frac{\frac{2}{6}}{\frac{3}{6}}=\frac{2}{3}$ - -Eine Funktion $X:\Omega \rightarrow \R$ heißt (reellwertige) Zufallsvariable. Weil $\Omega$ endlich ist, ist auch $X(\Omega)={X(\omega): \omega \in \Omega}\subseteq \R$ endlich. Durch $p_x(x):=p(X=x):=p({\omega \in \Omega: X(\omega)=x})$ wird ein Wahrscheinlichkeitsraum $(X(\Omega),p_x)$ definiert; denn $\sum p_x(x)=p(\Omega)=1$. $p_x$ heißt die von X induzierte Verteilung. $X(\Omega)$ ist meist erheblich kleiner als $\Omega$. -Beispiel: Augensumme beim Doppelwurf: $X:\Omega\rightarrow \R, X((i,j))=i+j \rightarrow X(\Omega)={2,3,4,...,12}$ - -Satz: Seien $(\Omega_1, p_1),(\Omega_2, p_2)$ Wahrscheinlichkeitsräume und $(\Omega, p)$ ihr Produktraum. Sei $X:\Omega_1\rightarrow\R,Y:\Omega_2\rightarrow \R$, fasse X,Y als ZVA in $\Omega$ zusammen $X((\omega_1,\omega_2))=X(\omega_1)$ und $Y((\omega_1,\omega_2))=Y(\omega_2)$; d.h. X,Y werden auf $\Omega$ "fortgesetzt". Dann sind X,Y stochastisch unabhängig in $(\Omega, p)$ (und $p(X=x)=p_1(X=x), p(Y=y)=p_2(Y=y)$). - -## Erwartungswert, Varianz, Covarianz -Sei $X:\Omega\rightarrow \R$ ZVA im Wahrscheinlichkeitsraum $(\Omega, p)$. $E(X)=\sum_{x\in X(\Omega)}x p(X=x)=\sum_{\omega in Omega} X(\omega)p(\omega)$ "E verhält sich wie Integral"; E(x) heißt Erwartungswert von x. - -Linearität des Erwartungswertes: $E(x+y)=E(x)+E(y)$ und $E(\alpha x)=\alpha E(x)$. -Ist $X:\Omega\rightarrow \R$ konstant gleich c, so ist $E(x)=\sum x*p(X=x)=c*p(X=x)=c*1=c$. - -Die Varianz von X: $Var(X)=E((X-E(X))^2)$ heißt Varianz von X (um E(X)). -Die Covarianz: $Cov(X,Y)=E((X-E(X))*(Y-E(Y)))$ heißt Covarianz von X und Y. -Der Verschiebungssatz: $Cov(X,Y)=E(X*Y)-E(X)*E(Y)$ -$Var(X)=Cov(X,X)=E(X*X)-E(X)E(X)=E(X^2)-(E(X))^2$ - -Seien X,Y stochastisch unabhängig ($\leftrightarrow p(X=x \wedge Y=y)=p(X=x)*p(Y=y)$) -$E(X)*E(Y)=\sum_{x\in X(\Omega)} x*p(X=x)* \sum_{y\in Y(\Omega)} y*p(Y=y)=\sum_{x\in X(\Omega)} \sum_{y\in Y(\Omega)} xy*p(X=x)p(Y=y)=\sum_{Z\in\R} z*p(X*Y=Z) = E(X*Y)$ -Sind X,Y stochastisch unanhängig ZVA, so ist $E(X)*E(Y)=E(X*Y)$; folglich $Cov(X,Y)=0$ - -Satz: Seien X,Y ZVA, dann gilt $Var(X+Y)=Var(x)+Var(Y)+2*Cov(X,Y)$. Sind insbesondere X,Y unabhängig gilt: $Var(X+Y)=Var(X)+Var(Y)$. - -Sei $(\Omega, p)$ Wahrscheinlichkeitsraum, $X:\Omega\rightarrow \R$ Zufallsvariable heißt Bernoulliverteilt im Parameter p falls $p(X=1)=p$ und $p(X=0)=1-p$, $p\in [0,1]$. $E(X)=\sum x*p(X=x)= 1*p(X=1)=p$ -Für $X:\Omega\rightarrow {0,1}$ ist $X^2=X$: $Var(X)=E(X^2)-E(X)^2 = p-p^2 = p(1-p)=p*q$ - -## Binominalkoeffizienten -Sei N eine Menge, dann ist $\binom{N}{k} := (x \subseteq N: \text{x hat genau k Elemente } (|x|=k) )$ für $k\in \N$. Für $n\in \N$ sei $\binom{n}{k}:=|(\binom{1,...,k}{k})$. - -Satz: $\binom{n}{0}={n}{n}=1$ f.a. $n\geq 0$ $\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}$ f.a. $n\geq 0,k\geq 1, k\geq n-1$ - -Jede n-elementige Menge N ist $\binom{N}{0}=(\emptyset), \binom{N}{n}={N}\rightarrow \binom{n}{0}=\binom{n}{n}=1$. Den zweiten Teil der Behauptung zeigt man induktiv über n. - - -## Binominalsatz -$(a+b)^n = \sum_{k=0}^n a^k b^{n-k}$ für $a,b\in \R$ -Für $n\in \N$ sei $n!=n(n-1)(n-2)...*3*2*1=\prod i$; für $n\in\N$ und $k\geq 0$ sei $[\binom{n}{k}]=\frac{n!}{k!(n-k)!}$ - -Satz: $\binom{n}{0}=\binom{n}{n}=1$ für jedes $n\in\N$, $\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}$ für $k\geq 1$ und $k\leq n-1$. -Zweiter Teil: $[\binom{n-1}{k}]+[\binom{n-1}{k-1}]=\frac{n!}{k!(n-k)!} = [\binom{n}{k}]$. Also stimmen die Rekursionsgleichungen von $\binom{n}{k}$ und $[\binom{n}{k}]$ überein sowie $\binom{n}{k}=[\binom{n}{k}]$. Folglich ist die Anzahl k-elementiger Teilmengen eine n-elementige Menge gleich $\frac{n!}{k!(n-k)!}. - -Seien $X_1,...,X_n$ unabhängige ZVAen, alle $X_i$ seien Bernoulli-Verteilt im Parameter $p[0,1]$, d.h. $p(X_1=1)=p$, $p(X_i=0)=(1-p)$. Dann ist $X_i=X_1+X_2+...+X_n$ ebenfalls reelwertige ZVA. Im Fall $X_i:\Omega\rightarrow {0,1}$ ist $X:\Omega\rightarrow {0,1,...,n}$. Die Verteilung von X ergibt sich wie folgt, für $k\in {0,1,...,n}$: $p(X=k)=\binom{n}{k}*p^k(1-p)^{n-k}$ - -Eine ZVA heißt binominalverteilt in den Parametern n und p falls gilt: $p(X=k)=\binom{n}{k}p^k (1-p)^{n-k}$ für $k\in{0,1,...,n}$; schreibe $X\sim L(n,p)$. Sonst ist X Bernoulliverteilt (genau dann wenn $X\sim L(1,p)$). - -## Erwartungswert und Varianz -Sei $X\sim L(n,p)$ OBdA $X=X_1,+...+X_n$ wobei $X_i$ unabhängig und Bernoulliverteilt. - -$E(X)=n*p$, $E(X_i)=p$ - -$Var(X)=nÜp*(1-p)$, $Var(X_i)=p*(1-p)$ - -## Multinominalverteilung -$\binom{N}{k_1,...,k_n}$ sei Menge der Abbildungen $f:N\rightarrow {1,...,r}$ mit $k1,...,k_r\geq 0$, $k_1+...+k_r=|\N|$ und $f^{-1}[{j}]=k_j \binom{n}{k_1,...,k_r} = |\binom{N}{k_1,...,k_r}$. - -## Hypergeometrische Verteilung -Beispiel: Urne mit zwei Sorten Kugeln; N Gesamtzahl der Kugeln, M Gesamtzahl Kugeln Sorte 1, N-M Gesamtzahl Kugeln Sorte 2, $n\leq N$ Anzahl Elemente einer Stichprobe. X Anzahl der Kugeln Sorte 1 in einer zufälligen n-elementigen Stichprobe. -$p(X=k)=\frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}} -Eine ZVA $X:\Omega\rightarrow \R$ heißt hypergeometrisch Verteilt in den Parametern M,N,n falls $p(X=k)$ für alle $k\geq 0, k\geq M$ gilt. - -$E(X)=\sum_{x=0}^M \frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}=...=n*\frac{M}{N}$ - -$Var(X)=E(X^2)-E(X)^2 =...= n*\frac{M}{N}(1-\frac{M}{N})(\binom{N-n}{N-1})$ - -# Elementare Graphentheorie -$G=(V,E)$ heißt Graph mit Eckenmenge $V(G)=V$ und Kantenmenge $E(G)=E\subseteq {{x,y}:x\not=y \in V}$. Veranschaulichung als Punkte in der Ebene (V) mit "Verknüpfungslinien" von x nach y. Bsp $G=({1,2,3,4},{12,13,14,15,16})$. - -$P=x_0,...,x_e$ Folge pw verschiedener Ecken mit $x_{i-1},...,x_i \in E(k)$ für $i\in{1,...,l}$ heißt ein Weg von $x_0$ nach $x_e$ der Länge l. Für $(a,b)\in V(G)$ heißt $d_G(a,b)=min{l: es_gibt_einen_a,b-Weg_der_Länge_l}$ Abstand von a nach b. Falls es keinen a,b-Weg gibt, definiere $d_G(a,b)=+\infty$. - -$a\sim b \leftrightarrow$ es gibt einen a,b-Weg in G wird eine Äquivalenzrelation auf V(G) definiert. DIe Äquivalenzklassen heißen (Zusammenhangs-) Komponenten von G. - -G heißt zusammenhängend, wenn G höchstens eine Komponente besitzt. $d_G: V(G) x V(G) \leftrightarrow \R_{\geq 0}$ ist eine Matrix -1. $d_G(x,y)=0 \leftrightarrow x=y$ f.a. $x,y \in V(G)$ -2. $d_G(x,y)=d_G(y,x)$ f.a. $x,y\in V(F)$ -3. $d_G(x,z)\leq d_G(x,y) + d_G(y,z))$ f.a. $x,y,z \in V(G)$ - -Für $A\subseteq V(G)$ sei $G[A]:= (A, {x,y\in E(G):x,y\in A})$. Für $F\subseteq E(G)$ sei $G[F]:=(V(G), F)$. $G[A]$ bzw $G[F]$ heißt von A bzw F induzierte Teilgraph. Ein Graph H mit $V(H)\subseteq V(G)$ und $E(H)\subseteq E(G)$ heißt Teilgraph von G, schreibweise $H\leq G$. $\leq$ ist Ordnung, denn: -1. $G\leq G$ -2. $H\leq G \wedge G\leq H \rightarrow H=G$ -3. $H\leq G \wedge G=L \rightarrow H\leq L$ - -Ist $P=x_0,...,x_p$ Weg, so heißt auch der Teilgraph ein Weg von $x_0$ nach $x_e$. -Graphen G, H heißen isomorph, falls es einen Isomorphismus von V(G) nach V(H) gibt. Das heißt eine Bijektion. -$V(G)\rightarrow V(H)$ mit $f(x)f(y)\in E(H)\leftrightarrow x,y \in E(G)$. Es gilt: -1. $G\cong G$ -2. $G\cong H \rightarrow H \cong G$ -3. $G\cong H \wedge H\cong L \rightarrow G\cong L$ - -Eine Folge $C=x_0,x_1,...,x_{l-1}$ von Ecken mit $x_i,x_{i+1}\in E(G)$ für $i\in {0,...,l-2}$ und $x_{l-1}x_0 \in E(G)$ heißt Kreis in G der Länge l, falls $x_0,...,x_{l-1}$ pw versceiden sind. Bsp: Kreis der Länge 5. - -EIn Teilgraph H des Graphen G (also $H\leq G$) heißt aufspannend, falls $V(H)=V(G)$. Für eine Ecke $x\in V(G)$ sei $d_G(x)=|{x,y\in E(G), y\in V(G)}|$ die Anzahl der mit x indizierten Kanten, der sogenannte Grad von x in G. - -Weiter $N_G(x):={x\in V(G): xy \in E(G)}$ die Menge der nachbarn von x in G. Hier gilt: $|N_G(x)=d_G(x)|$. - -In jedem Graph G gilt $\sum_{x\in V(G)} d_G(x)=2|E(G)|$. Der Durchschnittsgrad von G ist somit $\bar{d(G)}=\frac{1}{|V(G)|}\sum d_G(x)=\frac{2|E(G)|}{|V(G)|}$. - -Ein Graph ist ein Baum wenn G zusammenhängend und G-e nicht zusammenhängend für jedes $e\in E(G)$ "G ist minimal zusammenhängend" -Graph G ist ein Baum wenn G kreisfrei und Graph G+xy nicht kreisfrei für jedes $xy \not\in E(G)$ -G ist Baum, wenn -- G ist kreisfrei und zusammenhängend -- G kreisfrei und $|E(G)|=|V(G)|-1$ -- G zusammenhängend und $|E(G)|=|V(G)|-1$ - -Jeder Baum mit wenigstens einer Ecke besitzt eine Ecke vom Grad $\leq 1$, ein sog. Blatt ("jeder Baum besitzt ein Blatt"). -$\rightarrow E(G)=|V(G)|-1$ für jeden Baum also $d(G)=\frac{2|V(G)| -2}{|V(G)|}<2$. - -G Wald $\leftrightarrow$ die Komponenten von G sind Bäume - -G Baum $\leftrightarrow$ G ist zusammenhängender Wald - -Ein Teilgraph H von G heißt Teilbaum von G, falls H ein Baum ist. Ein aufspannender Teilbaum von G heißt Spannbaum von G. G zusammenhängend $\leftrightarrow$ G Spannbaum. - -Ein Spannbaum T von G heißt Breitensuchbaum von G bei $x\in V(G)$ falls $d_F(z,x)=d_G(z,x)$ f.a. $z\in V(G)$. - -Ein Spannbaum T von G heißt Tiefensuchbaum von G bei $x\in V(G)$ falls für jede Kante zy gilt: z liegt auf dem y,x-Weg in T oder y liegt auf dem z,t-Weg in T. - -Satz: Sei G zusammenhängender Graph $x\in V(G)$. -(X) sind $x_0,...,x_{e-1}$ schon gewählt und gibt es ein $+ \in {0,..., e-1}$ so, dass $x_+$ einen Nachbarn y in V(G)\{$x_0,...,x_{e-1}$}, so setze $x_e=y$ und $f(e):=t$; iteriere mit $e+1$ statt e. -Dann ist $T:=({x_0,...,x_e},{x_j*x_{f(j)}: j\in {1,...,e}})$ ein Spannbaum -- (X) wird in + stets kleinstmöglich gewählt, so ist T ein Breitensuchbaum -- wird in (X) + stets größtmöglich gewählt, so ist T ein Tiefensuchbaum - -## Spannbäume minimaler Gewichte -G Graph, $F \subseteq E(G)$ heißt kreisfrei, falls G(F) kreisfrei ist. - -Lemma (Austauschlemma für Graphen): -Seien F, F' zwei kreisfreie Kantenmengen in Graph G und $|F|<|F'|$, dann gibt es ein $e \in F'/F$ so, dass $F\vee {e}$ kreisfrei ist. - -G, $\omega:E(G)\rightarrow \R$ (Gewichtsfunktion an den Kanten). Für $F\subseteq E(G)$ sei $\omega (F)=\sum \omega (e)$, speziell $\omega (\emptyset)=0$. - -Für einen Teilgraphen H von G sei $\omega (G)=\omega (E(G))$. Ein Spannbaum minimalen Gewichts ist ein Spannbaum T von G mit $\omega (T)\leq \omega (S)$ für jeden Spannbaum S von G. - -Satz (Kruskal): Sei G zuständiger Graph, $\omega:E(G)\rightarrow \R$; Setze $F=\emptyset$. Solange es eine Kante $e\in E(G)\\F$ gibt so, dass $F \vee {e}$ kreisfrei ist, wähle e mit minimalem Gewicht $\omega(e)$, setzte $F=F\vee {e}$, iterieren. Das Verfahren endet mit einem Spannbaum $T=G(F)$ minimalen Gewichts. - -Beweis: Weil G endlich ist endet das Verfahren mit einem maximal kreisfreien Graphen T. Seien $e_1,...,e_n$ die Kanten von T in der Reihenfolge ihres Erscheinens, sei S Spannbaum minimalen Gewichts und $f_1,...,f_m$ die Kanten in Reihenfolge aufsteigenden Gewichts. Angenommen (redactio ad absurdum) $\omega(T)>\omega(S)$. Dann gibt es ein $i\in{1,...,m}$ mit $\omega(e_i)>\omega(f_i)$. Wähle i kleinstmöglich, dann ist $F={e_1,...,e_{i-1}}$ und $F'={f_1,...,f_i}$ kreisfrei. Nach Austaschlemma gibt es ein $f\in F'/F$ so, dass $F\vee {f}$ kreisfrei ist. Also ist f ein Kandidat bei der Auswahl von $e_i$ gewesen, also $\omega(e_i)\leq \omega(f)$ (Fehler!). Folglich ist $\omega(T)\leq \omega(S) \Rightarrow \omega(T)=\omega(S)$ also T und S Spannbaum mit minimalen Gewichten. - -## Das Traveling Salesman Problem -G sei Graph (vollständig) auf n Ecken, d.h. $xy\in E(G) \forall x\not =y$ aus V(G) und $\omega*E(G)\rightarrow \R$. Finde aufspannenden Kreis C von G minimalen Gewichts. Zusatzannahme (metrische TSP) $\omega(xz)\leq \omega(xy)+\omega(yz)$. -Finde einen aufspannenden Kreis C, der um einen Faktor von höchstens zwei von einem aufspannenden Kreis D minimalen Gewichts abweicht ($\omega(C)\leq 2 \omega(D)$) sog. Approximationsalgorithmus mit Gütefaktor $\leq$. - -Konstruiere eine Folge$x_0,...,x_m$ mit der Eigenschaft, dass jede Kante von T genau zweimal zum Übergang benutzt wird, d.h. zu $e\in E(T)$ existieren $i\not = j$ mit $e=x_i x_{i+1}$ und $e=x_j x_{j+1}$ und zu jedem k existieren $e\in E(T)$ mit $e=x_k x_{k+1}$. Das Gewicht dieser Folge sei $\sum \omega(x_i x_{i+1})= 2\omega(T)$. - -Eliminiere Mehrfachnennungen in der Folge. Gibt es $i\not= j$ mit $x_j=x_i$ so streiche x aus der Folge. Das Gewicht der neuen Folge ist maximal so groß wie das Gewicht der alten. Durch iteration erhält man einen aufspannenden Kreis mit $\omega(X) \leq 2 \omega(T)$. Sei e Kante von D $\rightarrow D-e=S$ ist aufspanndender Weg $\rightarrow \omega(T) \leq w(D-e) \leq \omega (D)$. - -G Graph, $k\geq 0$. Eine Funktion $f:V(G)\rightarrow C$ mit $|C|\leq k$ heißt k-Färbung, falls $f(x)\not = f(y)$ für $xy\in E(G)$. G heißt k-färbbar, falls G eine k-Färbung besitzt. Das kleinste $k\geq 0$ für das G k-färbbar ist heißt dramatische Zahl von G, Bezeichnung $X(G)$. - - - -Satz (Tuga): Sei $k\geq 2$ und G ein Graph ohne Kreise eine Lösung $l\equiv 1 mod k$, dann ist G k-faltbar. G 2-färbbar $\leftrightarrow$ G hat keine Kreise ungerader Länge. Ein Graph heißt bipartit mit den Klassen A,B falls $(x\in A \wedge y\in B)\vee (x\in B \wedge y\in A)$ für alle $xy \in E(G)$ gilt. Genau dann ist G bipoartit mit gewissen Klassen A,B wenn G 2-färbbar ist. - -Satz (Hall) "Heiratssatz": Sei G bipartit mit Klassen A,B. Dann gilt G hat ein Matching von A $\leftrightarrow |N_G(X)|\leq |X|$ für alle $X\subseteq A$. - -Satz: "$\rightarrow$" sei M Matching von A in G $\rightarrow |N_G(X)| \leq N_{G[M]}(X)=|X|$. "$\leftarrow$" Induktiv über $|V(G)|$. -Ein schneller Zeuge für die Existenz eines Matchings von A im bipartiten Graphen G mit Klassen A,B ist das Matching selbst. Ein schneller Zeuge für die nicht-existenz eines Matchings ist ein $X\subseteq A$ mit $|N_G(X)| < |X|$. - -Das Entscheidungsproblem "hat ein bipartiter Graph ein Matching?" ist im NP und zugleich in co-NP. Also ist auch Problem "ist ein Graph 2-färbbar?" in NP und co-NP. Das Problem "ist ein Graph 3-färbbar" ist in NP. Es ist sogar NP-vollständig, d.h. jedes Problem in NP (jedes Entscheidungsproblem mit schnellen Zeugen für Ja) lässt sich in Polynomalzeit in dieses Färbungsproblem überführen. - -Ein weiteres Problem in NP ist: aussagenlogische Formel gegeben $F=C_1 \wedge C_2 \wedge ... \wedge C_m$, jedes $C_b$ ist von der Form $P\vee Q \vee R$ mit $P=x_i; Q=x_j; R=x_2$ oder $P=\neg x_i; Q=\neg x_j; R=\neg x_2$. Auch dieses Problem ist NP-vollständig. -- SAT ist die "Mutter aller Probleme in NP" -- Färbbarkeit lässt sich darauf zurückführen und umgekehrt +--- +title: Grundlagen und diskrete Strukturen +--- +# Aussagen +Aussagen sind Sätze die wahr oder falsch sind, d.h. der Wahrheitswert ist wahr oder falsch. +> "5 ist prim" -> Aussage, wahr \ +> "dieser Satz ist falsch" -> keine Aussage + +Für keine natürliche Zahl n>3 ist die Gleichung x^n+y^n=z^n in positiven ganzen Zahl lösbar $\sim$ Fermatsche Ex-Vermutung + +## Verknüpfungen von Aussagen +Seien p und q Aussagen, dass sind folgende Sätze auch Aussagen +- $p \wedge q$ "und" +- $p \vee q$ "oder" +- $\neg p$ "nicht" +- $p \rightarrow q$ "impliziert" +- $p \leftrightarrow q$ "genau dann wenn" + +Der Wahrheitswert dieser Verknüpfung ergibt sich aus den Wahrheitswerten p,q wie folgt +| p | q | $p\wedge q$ | $p\vee q$ | $\neg q$ | $p\rightarrow q$ | $p\leftrightarrow q$ | +| -- | -- | -- | -- | -- | -- | -- | +| f | f | f | f | w | w | w | +| f | w | f | w | w | w | f | +| w | f | f | w | f | f | f | +| w | w | w | w | f | w | w | + +Aussagenlogische Variablen: Variable die den Wert w oder f annimmt + +Aussagenlogische Formel: Verknüpfung aussagenloser Variablen nach obrigen Muster + +Belegung: Zuordnung von w/f an jede Variable einer aussagenlogischer Formel + +Wahrheitswerteverlauf: Wahrheitswert der Aussagenformel in Abhängigkeit von der Belegung der Variable + +Tautologie: Formel deren Wahrheitswerteverlauf konstant w ist + +Kontradiktion: Formel deren Wahrheitswerteverlauf konstant f ist + +Kontraposition: $(p\rightarrow q)\leftrightarrow (\neg q \rightarrow p)$ ist eine Tautologie +Modus Potens: $(p\vee (p\rightarrow q))\rightarrow q$ ist eine Tautologie + +Äquivalenz: Zwei Formeln p,q sind äquivalent (bzw logisch äquivalent) wenn $p\leftrightarrow$ Tautologie ist. Man schreibt $p \equiv q$ + +Die Formel p impliziert die Formel q, wenn $p\rightarrow q$ eine Tautologie ist + +## Regeln +- $p\wedge q \equiv q \wedge p$ (Kommutativ) +- $p\vee q \equiv q \vee p$ (Kommutativ) +- $p\wedge (q \wedge r) \equiv (p \wedge q) \wedge r$ (Assoziativ) +- $p\vee ( q \vee r) \equiv (p \vee q) \vee$ (Assoziativ) +- $p\wedge (q\vee r) \equiv (p\wedge q) \vee (p\wedge r)$ (Distributiv) +- $p\vee (q\wedge r) \equiv (p\vee q) \wedge (p\vee r)$ (Distributiv) +- $\neg(\neg q) \equiv q$ (Doppelte Verneinung) +- $\neg(p\wedge q) \equiv (\neg p) \wedge (\neg q)$ (de Morgansche) + +Aussagenform über den Universen $U_1,...,U_n$: Satz mit Variablen $x_1,...,x_n$ der bei Ersetzung jedes x durch ein Objekt am $U_j$ stets zu einer Aussage wird. +Variablen können mehrfach auftreten, werden aber jeweils durch das gleiche Objekt (aus $U_j$) ersetzt. +- "x ist prim" ist eine Aussagenform über dem Universum $\N$ der natürlichen Zahlen +- "$x Eine Menge ist eine Zusammenfassung bestimmter, wohlunterschiedener Objekte unserer Anschauung oder unseres Denkens. (Cantor) +Von jedem Objekt steht fest, ob es zur Menge gehört oder nicht. + +Bsp: ${M,A,T,H,E,M,A,T,I,K} \approx {M,A,T,H,E,I,K}:$ Mengen der Buchstaben des Wortes Mathematik + +## Probleme der naiven Mathematik +### Wunsch 1 +"$x\in y$" soll Aussagenform über dem Universum U aller Mengen sein. D.h. für je zwei Mengen x und y ist entweder x ein Element von y oder nciht. D.h. "$x\in y$" ist ein 2-stelliges Prädikat über U. +### Wunsch 2 +Ist p(x) ein Prädikat über U, so soll es eine Menge geben, die aus genau denjenigen Mengen x besteht, für die p(x) wahr ist. Bezeichnung ${x:p(x) "ist-wahr" }$. +Danach gäbe es eine Menge M, die aus genau denjenigen Mengen x mit $x\not \in x$ besteht: $M={x:x\not \in x}$. +D.h. Wunsch 1 und 2 führen zu einem Widerspruch in der Mengenlehre!\ +Lösung: Aussonderung nur an bereits "gesicherten" Mengen\ +#### Wunsch 2': +Ist A eine Menge und p(x) ein Prädikat über U, dann gilt es eine Menge B die aus genau denjenigen Mengen x aus A besteht, für die p(x) wahr ist. Bezeichnung: $B={x\in A:p(x) wahr}$. +Folgerung: die Gesamtheit aller Mengen ist selbst keine Menge, sonst findet man einen Widerspruch wie oben. + +### Wunsch 3 +Zwei Mengen x,y sind genau dann gleich wenn sie diesselben Elemente enthalten. D.h. $x=y: \leftrightarrow \forall z:(z\in x \leftrightarrow z\in y)$. Somit gilt für zwei Prädikate p(x), q(x) über U und jede Menge A: ${x\in A: p(x) wahr} = {x\in A: q(x) wahr}$ genau dann, wen q(x), p(x) den gleichen Wahrheitswert für jedes x aus A haben. + +### Wunsch 0 +Es gibt eine Menge. Ist A irgendeine Menge, so ist ${x \in A: \neg (x=x)}$ eine Menge ohne Elemente, die sogenannte leere Menge $\emptyset$. + +### Wunsch 4 +Zu jeder Menge A gibt es eine Menge B, die aus genau denjenigen Mengen besteht, die Teilmengen von A sind. Dabei ist x eine Teilmenge von $y: \leftrightarrow \forall z:(z\in x \rightarrow z \in y) [x \subseteq y]$\ +$B={x:x\subseteq A}=\wp(A)$ B heißt Potentmenge von A\ +Bsp: $\wp({1,2,3}) = (\emptyset, (1),(2),(3),(1,2),(1,3),(2,3),(1,2,3))$ (Daraus lässt sich ein Hesse-Diagramm zeichnen). + +## Teilmengen +A Teilmenge von B $\leftrightarrow \forall x: (x\in A \rightarrow x \in B):\Rightarrow A\subseteq B$\ +A Obermenge von B $\leftrightarrow \forall x: (x\in B \rightarrow x \in A):\Rightarrow A\supseteq B$\ +Folglich $A=B \leftrightarrow A\subseteq B \wedge B\subseteq A$\ +Schnittmenge von A und B: $A\cap B = {x: x\in A \wedge x\in B}$\ +Vereinigungsmenge von A und B: $A\cup B = {x: x\in A \vee x\in B}$ + +Sei eine Menge (von Mengen) dann gibt es eine Menge die aus genau den Mengen besteht, die in jeder Menge von A enthalten sind (außer $A=\emptyset$). +Ebenso gibt es Mengen die aus genau den Mengen besteht, die in wenigstens einer Menge aus A liegen. Die Existenz dieser Menge wird axiomatisch gefordert in ZFC:$ UA = {x: \exists z \in A: x \in z}$\ + +Seien A,B Mengen, dann sei $A/B:={x\in A: x\not \in B } = A\bigtriangleup B$\ +De Moorgansche Regel: $\overline{A \cup B} = \overline{A} \cap \overline{B}$ und $\overline{A\cap B}=\overline{A}\cup \overline{B}$\ +Das geordnete Paar (x,y) von Mengen x,y ist definiert durch ${{x},{x,y}}:={x,y}$\ +A und B Mengen: $A x B:={(x,y):x\in A \wedge y \in B}$ + +# Relationen +$A={Peter, Paul, Marry}$ und $B={C++, Basic, Lisp}: $R\subseteq AxB$, etwa {(Peter,c++),(Paul, C++), (Marry,Lisp)}. Seien A,B Mengen: Eine Relation von A nach B ist eine Teilmenge R von AxB.\ +$(x,y)\in R:$ x steht in einer Relation R zu y; auch xRy\ +Ist A=B, so heißt R auch binäre Relation auf A + +## binäre Relation +1. Allrelation $R:=AxA \subseteq AxA$ +2. Nullrelation $R:=\emptyset \subseteq AxA$ +3. Gleichheitsrelation $R:={(x,y)... x=y} +4. $A=R$ $R:={(x,y)\in \R x \R, x \leq y}$ +5. $A=\Z$ $R:={(x,y)\in \Z x \Z: \text{x ist Teiler von y} }$ kurz: x|y + +## Eigenschaften von Relationen +Sei $R\in AxA$ binäre Relation auf A +1. Reflexiv $\leftrightarrow$ xRx $\forall x \in A$ +2. Symetrisch $\leftrightarrow xRy \rightarrow yRx$ +3. Antisymetrisch $\leftrightarrow xRy \wedge yRx \rightarrow x=y$ +4. Transitiv $\leftrightarrow xRy \wedge yRz \rightarrow xRz$ +5. totale Relation $\leftrightarrow xRy \vee yRx \forall x,y \in A$ + +- R heißt Äquivalenzrelation $\leftrightarrow$ R reflexiv, symetrisch und transitiv +- R heißt Ordnung $\leftrightarrow$ R reflexiv, antisymetrisch und transitiv +- R heißt Totalordnung \$leftrightarrow$ R Ordnung und total +- R heißt Quasiordnung $\leftrightarrow$ R reflexiv und transitiv + + +## Äqivalenzrelation +Sei A Menge, $C\wp (A)$ Menge von teilmengen von A. C heißt Partition von A, falls gilt: +1. $UC=A$ d.h. jedes $x\in A$ liegt in (wenigstens) einem $y\in C$ +2. $\emptyset \not \in C$ d.h. jedes $y\in C$ enthält (wenigstens) ein Element von A +3. $X \cap Y = \emptyset$ f.a. $X\not \in Y$ aus C + +Zwei Mengen $X\cap Y = \emptyset$ heißten disjunkt. +Die Elemente von C heißten Teile, Klassen oder Partitionen. +Satz: Sei \sim Äquivalenzrelation auf A. Für $x\in A$ betrachtet $[x]_{/\sim }:={y\in A: y\sim x}$. Dann ist {[x]_{/\sim }:x\in A}= C_{/\sim }$ Partition von A. Die Elemente $[x]_{/\sim }$ von $C_{/\sim }$ heißen Äquivalenzklassen. + +Wichtiges Bsp: Restklassen modulo m\ +$m\not \in \Z, m \geq 2$; Für $x,y \in \Z$ schreibe $x \equiv y$ mod m ("x konvergent y modulo m") falls $m | (x-y)$. $\equiv (mod m)$ ist eine binäre Relation auf $\Z$ +"$\equiv§ transitiv" aus $x=y mod m$ und $y\equiv z mod m$ folgt $\rightarrow m| x-z$ + +Somit ist $\equiv(mod m)$ eine Äquivalenzrelation. Ihre Äquivalenzklassen heißen Restklassen mod m + +Ein Graph $G=(V,E)$ ist ein Paar bestehend aus einer Menge V und $E\subseteq (x,y: x\not = y \text{ aus V} )$. +Zu $a,b\in V$ heißt eine Folge $P=x_1,..,x_n$ von paarweise verschiedenen Ebenen mit $a=x_0, b=x_j; x_{j-1},x_i \in E{a*i \in b*j}$ ein a,b-Weg der Länge l oder Weg a nach b. Durch a\sim b gibt es einen a,b-Weg in G, wird eine Äquivalenzrelation auf V definiert, denn: +- "$\sim$ reflexiv": es ist $x\sim x$, denn $P=x$ ist ein x,x-Weg in G +- "$\sim$ symetrisch": aus $x\sim y$ folgt, es gibt einen x,y-Weg $\rightarrow$ es gibt einen y,x-Weg $y\sim x$ +- "$\sim$ transitiv": aus $x\sim y$ und $y\sim x$ folgt, es gibt einen x,y-Weg und einen y,x-Weg +Die Äquivalenzklassen von $\sim _G$ erzeugen die Zusammenhangskomponenten von G + +Satz: Sei C eine Partition von A, dann wird durch $x\sim _G y \leftrightarrow$ es gibt ein $X\in C$ mit $x,y\in X$ eine Äquivalenzrelation auf A definiert. + +## (Halb) Ordnungen +Sei also $leq$ eine Ordnung auf X. Seo $A\subseteq X, b\in X$ +- b minimal in A $\leftrightarrow b\in A$ und $(c\leq b \rightarrow c=b f.a. c\in A)$ +- b maximal in A $\leftrightarrow b\in A$ und $(b\leq c \rightarrow b=c f.a. c\in A)$ +- b kleinstes Element in A $\leftrightarrow b\in A$ und $(b\leq c f.a. c\in A)$ +- b größtes Element in A $\leftrightarrow b\in A$ und $(c\leq b f.a. c\in A)$ +- b untere Schranke von A $\leftrightarrow b\leq c f.a. c\in A$ +- b obere Schranke von A $\leftrightarrow c\leq b f.a. c\in A$ +- b kleinste obere Schranke von A $\leftrightarrow$ b ist kleinstes Element von $(b'\in X: \text{b' obere Schranke von A})$ auch Supremum von A: $\lor A = b$ +- b größte untere Schranke von A $\leftrightarrow$ b ist das größte Element von $(b'\in X: \text{ b' untere Schranke von A} )$ auch Infinium von A; $\land A = b$ +kleinstes und größtes Element sind jew. eindeutig bestimmt (falls existent) + +Satz: Sei X Menge. $\subseteq$ ist Ordnung auf $\wp(X)$. Ist $O\subseteq \wp(X)$, so ist $sup O=\bigcup O$ und $inf O=\bigcap O$ + +Satz: Die Teilbarkeitsrelation | ist Ordnung auf den natürlichen Zahlen $\N$. Es gibt $sup(a,b)=kgV(a,b)$ (kleinstes gemeinsames Vielfaches) und $inf(a,b)=ggT(a,b)$ (größtes gemeinsames Vielfaches) + +## Hesse Diagramm +Darstellung einer Ordnung $\subseteq$ auf X +1. Im Fall $x\subseteq y$ zeichne x "unterhalb" von y in die Ebene +2. Gilt $x\subseteq y (x\not = y)$ und folgt aus $x \subseteq z \subseteq y$ stets $x=z$ oder $y=z$ so wird x mit y "verbunden" + +## Zoonsche Lemma +Zu jeder Menge und für jede Ordnung $\leq$ auf X mit der Eigenschaft, dass jede nicht-leere Kette nach der beschränkt ist, gibt es ein maximales Element. + +## Wohlordnungssatz +Jede Menge lässt sich durch eine Ordnung $\subseteq$ so ordnen, dass jede nichtleere Teilmenge von X darin ein kleinstes Element ist + +# Induktion +X ist eine Menge, $X:=X\vee {X}$\ +M Menge heißt induktiv $:\leftrightarrow \emptyset \in M \wedge \forall X \in M$ $X^+ \in M$. + +Ist O eine Menge von induktiven Mengen, $O\pm O$ dann ist auch $\bigcap O$ induktiv. Insbesondere ist der Durchschnitt zweier induktiver Mengen induktiv. Es gibt eine induktive Menge M: $M =\bigcap {A \in \wp(M): A induktiv}$. +Sei M' irgendeine (andere) induktive Menge $\rightarrow M \cap M'$ ist induktive Teilmenge von M. $\N_M$ ist der Durchschnitt über alle induktiven Teilmengen von M $\N_M \subseteq M\cap M' \subseteq M'$. Folglich ist $\N_m$ Teilmenge jeder induktiven Menge. + +## Satz I (Induktion I) +Sei p(n) ein Prädikat über $\N$. Gelte p(0) und $p(n)\rightarrow p(n^+)$ f.a. $n\in \N$ dann ist p(n) wahr f.a. $n\in N$. Schreibe $x=y:\leftrightarrow x\in y \vee x=y$ + +## Satz II (Induktion II) +Sei p(n) ein Prädikat über $\N$, gelte ($\forall x < n: p(x9))\rightarrow p(n)$ f.a. $n\in \N$. Damit ist p(n) wahr für alle $n\in \N$. + +# Funktionen +Seien A,B Mengen: Eine Relation $f\subseteq A x B$ heißt Funktion. A nach B ("$f:A\rightarrow B$") falls es zu jedem $x\in A$ genau ein $y\in B$ mit $(x,y)\in f$ gibt. Dieses y wird mit $f(x) bezeichnet. + +Satz: $f:A\rightarrow B, g:A\rightarrow B$; dann gilt $f=g \leftrightarrow f(x)=g(x)$. Sei $f:A\rightarrow B$ Funktion +1. f heißt injektiv $\leftrightarrow$ jedes y aus B hat höchstens ein Urbild +2. f heißt subjektiv $\leftrightarrow$ jedes y aus B hat wenigstens ein Urbild +3. f heißt bijektiv $\leftrightarrow$ jedes y aus B hat genau ein Urbild + +Ist $f:A\rightarrow B$ bijektive Funktion, dann ist auch $f^{-1}\subseteq BxA$ bijektiv von B nach A, die Umkehrfunktion von f. +Man nennt f dann Injektion, Surjektion bzw Bijektion +- f injektiv $\leftrightarrow (f(x)=f(y)\rightarrow x=y)$ f.a. $x,y\in A$ oder $(x\not = y \rightarrow f(x)\not = f(y))$ +- f surjektiv $\leftrightarrow$ Zu jedem $x\in B$ existiert ein $x\in A$ mit $f(x)=y$ +- f bijektiv $\leftrightarrow$ f injektiv und surjektiv + +Sind $f:A\rightarrow B$ und $g:B\rightarrow C$ Funktionen, so wird durch $(g \circ f)(x):=g(f(x))$ eine Funktion $g \circ f: A \rightarrow C$ definiert, die sog. Konkatenation/Hintereinanderschaltung/Verkettung/Verkopplung von f und g (gesprochen "g nach f"). + +Satz: $f:A\rightarrow B, g:B\rightarrow C$ sind Funktionen. Sind f,g bijektiv, so ist auch $g \circ f: A\rightarrow C$ bijektiv + +Satz: ist $f:A\rightarrow B$ bijektiv, so ist $f^{-1}$ eine Funktion B nach A. Mengen A,B, heißen gleichmächtig ($|A|=|B| \equiv A\cong B$) falls Bijektion von A nach B. $\cong$ ist auf jeder Menge von Mengen eine Äquivalenzrelation +- "$\cong$ reflexiv": $A\cong A$, denn $f:A\rightarrow A, f(x)=X$, ist Bijektion von A nach A +- "$\cong$ symetrisch": Aus $A\cong B$ folgt Bijektion von A nach B $\rightarrow B\cong A$ +- "$\cong$ transitiv": Aus $A\cong B$ und $B\cong C$ folgt $A\cong C$ + +$|A|=|A|:|A|$ ist die Kordinalität von A, d.h. die kleisnte zu A gleichmächtige Ordinalzahö. Eine Ordinalzahl ist eine e-transitive Menge von e-transitiven Mengen. Eine Menge X heißt e-transitiv, wenn aus $a\in b$ und $b\in c$ stets $a\in c$ folgt. +Sei $A:=\N$ und $B={0,2,4,...}={n\in \N: 2|n}$, dann sind A und B gleichmächtig, denn $f:A\rightarrow B, f(x)=2x$ ist Bijektion von A nach B. +Eine Menge A heißt endlich, wenn sie gleichmächtig zu einer natürlichen Zahl ist; sonst heißt A unendlich. +Eine Menge A heißt Deckend-unendlich, falls es eine Injektion $f:A\rightarrow B$ gibt die nicht surjektiv ist. + +Satz: A unendlich $\leftrightarrow$ A deckend-unendlich +A,B sind Mengen. A heißt höchstens so mächtig wie B, falls es eine Injektion von A nach B gibt. $|A|\leq |B|$ bzw $A\preceq B$. $\preceq$ ist Quasiordnung auf jeder Menge von Mengen. +- "$\preceq$ reflexiv": Injektion von A nach A +- "$\preceq$ transitiv": $A\preceq B$ und $B\preceq C$ folgt Injektion $f:A\rightarrow B$ und $g:B\rightarrow C$. Verkopplung $g \circ f \rightarrow A \preceq C$ + +Satz (Vergleichbarkeitssatz): +Für zwei Mengen A,B gilt $|A|\leq |B|$ oder $|B| \leq |A|$. Eine Relation f von A nach B heißt partielle Bijektion (oder Matching), falls es Teilmengen $A'\subseteq A$ und $B'\subseteq B$ gibt sodass f eine Bijektion von A' nach B' gibt. + +Sei M die Menge aller Matchings von A nach B und wie jede Menge durch $\subseteq$ geordnet. Sei $K\subseteq M$ eine Kette von Matchings. K besitzt eine obere Schranke ($\bigcup K$) in M. Seien $(x,y);(x',y')$ zwei Zuordnungspfeile aus $\bigcup K$, zeige $x\not = x'$ und $y\not = y'$ dann folgt Matching. +Jede Kette von Matchings benutzt eine obere Schranke, die ebenfalls ein Matching ist $\rightarrow$ es gibt ein maximales Matching von A nach B, etwa h. Im Fall ($x\in A, y\in B$ mit $(x,y)\in h$) ist h eine Injektion von A nach B, d.h. $|A| \subseteq |B|$ andernfalls $y\in B, x\in A$ mit $x,y\in h$ ist $h^{-1}$ eine Injektion von B nach A, d.h. $|B| \subseteq |A|$. + +## Satz - Cantor/Schröder/Bernstein +Für zwei Mengen A,B gilt: Aus $|A|\subseteq |B|$ und $|B| \subseteq |A|$ folgt $|A| = |B|$. + +Die Komponenten von f und g sind: +- endliche Kreise +- einseitig unendliche Wege +- beidseitig unendliche Wege + +## Satz Cantor +Für jede Menge X gilt: $|X|\leq \wp(X)$ und $|X|\not = |\wp (X)|$. Z.B. ist $|\N|<|\R|$; zu $|\N|$ gleichmächtige Mengen nennt man abzählbar; unendliche nicht-abzählbare Mengen nennt man überzählbar. + +## Kontinuitätshypothese +Aus $|\N|\leq |A| \leq |\R|$ folgt $|A|=|\N|$ oder $|A|=|\R|$ (keine Zwischengrößen) + +Seien M,I zwei Mengen. Eine FUnktion $f:I\rightarrow M$ von I nach M heißt auch Familie über der Indexmenge I auf M. Schreibweise $(m_i)_{i\in I}$ wobei $m_i=f(i)$. Damilien über $I=\N$ heißen Folgen (bzw. unendliche Folgen). +Eine (endliche) Folge ist eine Familie über einer endlichen Indexmenge I. Funktionen von ${1,...,n}$ in einer Menga A ($a_q,...,a_n\in A$) heißen n-Tupel. Für eine Mengenfamilie $(A_i)_{i\in A}$ sei ihr Produkt durch $\prod A_i=(f: \text{ Funktion von I nach}\bigcup A_i \text{ mit } f(i)\in A_i \text{ f.a. } i\in I)$. Ist allgemein $A_i=A$ konstant, so schreibe $\prod A_i=A^I={f:I\rightarrow R}$. Bezeichnung auch $2^{\N}$. + +# Gruppen, Ringe, Körper +Eine Operation auf eine Menge A ist eine Funktion $f:AxA\rightarrow A$; schreibweise $xfy$. EIne Menge G mit einer Operation $\circ$ auf G heißt Gruppe, falls gilt: +1. $a\circ (b\circ c) = (a\circ b)\circ c$ freie Auswertungsfolge +2. es gibt ein $e\in G$ mit $a\circ e=a$ und $e\circ a=a$ f.a. $a\in G$. e heißt neutrales Element von G und ist eindeutig bestimmt +3. zu jedem $a\in G$ existiert ein $b\in G$ mit $a\circ b=e$ und $b\circ a=e$; wobei e ein neutrales Element ist. b ist durch a eindeutig bestimmt, denn gäbe es noch ein $c\in G$ mit $a\circ c=e$ folgt $b=b\circ e$. Schreibweise für dieses eindeutig durch a bestimmte b: $a^{-1}$ + +Eine Gruppe G mit $\circ$ wird auch mit $(G, \circ)$ bezeichnet. Sie heißt kommutativ bzw abelsch, falls neben 1.,2. und 3. außerdem gilt: +4. $a\circ b = b\circ a$ f.a. $a,b \in G$ + +Das neutrale Element aus 2. wird mit 1 bezeichnet. Im Fall der abelschen Gruppe benutzt man gerne "additive Schreibung": "+" statt "$\circ$" und "0" statt "1" (Bsp: $1*a = a*1 = a$) + +Bsp: Sei X Menge und $S_X$ sei die Menge aller Bijektionen von X nach X. EIne Bijektion von X nach X heißt Permutation von X. $(S_X, \circ)$ ist eine Gruppe. + + +Zwei Gruppen $(G, \circ_G)$ und $(H,\circ_H)$ heißen isomorph, falls es einen Isomorphismus von $(G,\circ_G)$ nach $(H,\circ_H)$ gibt (bzw. von G nach H). Schreibweise $(G,\circ_G)\cong (H,\circ_H)$ +- "$\cong$ reflexiv": $G\cong G$, denn $id_G$ ist ein Isomorphismus +- "$\cong$ symetrisch": aus $G\cong G$ folt: es exisitert ein bijektiver Homomorphismus +- "$\cong$ transitiv": sei $G\cong H$ und $H\cong J \rightarrow$ es gibt einen Isomorphismus $\phi:G\rightarrow H$ und $\psi:H\rightarrow J \rightarrow \phi\circ \psi :G\rightarrow J \rightarrow$ J ist bijektiv. $\phi\circ G$ ist Homomorphismus von G nach J und bijektiv also Isomorph + +Satz: Jede Gruppe $(G,\circ)$ ist zu einer Untergruppe von $(S_G, \circ)$ isomorh + +## Arithmetik von $\N$ +$+: \N x \N \rightarrow \N$ wird definiert durch: +- $m+0:=m$ f.a. $m\in \N$ (0 ist neutral) +- $m+n$ sei schon definiert f.a. $m\in \N$ und ein gutes $n\in \N$ +- $m+n^+:=(m+n)^+$ f.a. $m,n \in \N$ +Satz: $m+n=n+m$ f.a. $m,n\in\N$ (Beweis induktiv über m) + +Satz: $l+(m+n)=(l+m)+n$ f.a. $l,m,n\in\N$ (Klammern sind neutral bzgl +) + +Satz (Streichungsregel): aus $a+n=b+n$ folgt $a=b$ f.a. $a,b,n\in\N$ + +## Analog: Multiplikation +$*: \N x \N \rightarrow \N$ wird definiert durch: +- $m*0:=0$ f.a. $m\in \N$ +- $m*n^+=m*n+m$ f.a. $n\in\N$ +Es gilt: +1. $m*n=n*m$ f.a. $n\in\N$ +2. $m*(n*l)=(m*n)*l$ f.a. $m,n\in\N$ +3. $m*1 = 1*m =m$ f.a. $m\in\N$ +4. $a*n=b*n \rightarrow a=b$ f.a. $a,b\in\N, n\in\N/{0}$ +5. $a*(b+c)=a*b+a*c$ (Distributivgesetz) + +## Die ganzen Zahlen $\Z$ +Durch $(a,b)\sim (c,d)\leftrightarrow a+d=b+c$ wird eine Äquivalenzrelation auf $\N x\N$ definiert. +Die Äquivalenzklassen bzgl \sim heißen ganze Zahlen (Bezeichnung $\Z$, Bsp $17=[(17,0)]_{/\sim }$). +Wir definieren Operationen +, * auf $\Z$ durch +- $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a+c, b+d)]_{/\sim }$ +- $[(a,b)]_{/\sim } * [(c,d)]_{/\sim } = [(ac+bd, ad+bc)]_{/\sim }$ +Zu zeigen ist: DIe auf der rechten Seite definierten Klassen hängen nicht von der Wahl der "Repräsentanten" der Klassen auf der linken Seite ab (Wohldefiniert). + +Formal (für +): $[(a,b)]_{/\sim } = [(a',b')]_{/\sim }$ und $[(c,d)]_{/\sim } = [(c',d')]_{/\sim }$ impliziert $[(a,b)]_{/\sim } + [(c,d)]_{/\sim } = [(a'+c', b'+d')]_{/\sim }$. Aus der Vss konstant kommt $a+b'=b+a'$ und $c+d'=c'+d$. Dann folgt $a+c+b'+d'=b+d+a'+c'$, also $(a+c, b+d)\sim (a'+c',b'+d')$. + +Satz: $\Z$ ist eine abelsche Gruppe (+ assoziativ, enhält neutrales Element, additiv Invers). +$[(a,0)]_{/\sim }$ wird als a notiert. $-[(a,0)]_{/\sim }=[(0,a)]_{/\sim }$ wird als -a notiert. +Anordnung: $[(a,b)]_{/\sim } \subseteq [(c,d)]_{/\sim } \leftrightarrow a+d\leq b+c$ + +Ein Ring R ist eine Menge mit zwei Operationen $+,*: \R x\R \rightarrow \R$ mit: +1. $a+(b+c) = (a+b)+c$ f.a. $a,b,c\in \R$ +2. Es gibt ein neutrales Element $O\in \R$ mit $O+a=a+O=O$ f.a. $a\in\R$ +3. zu jedem $a\in\R$ gibt es ein $-a\in \R$ mit $a+(-a)=-a+a=0$ +4. $a+b=b+a$ f.a. $a,b\in\R$ +5. $a*(b*c)=(a*b)*c)$ f.a. $a,b,c\in\R$ +6. $a*(b+c)=a*b+a*c$ f.a. $a,b,c\in\R$ +R heißt Ring mit 1, falls: +7. es gibt ein $1\in\R$ mit $a*1=1*a=a$ f.a. $a\in\R$ +R heißt kommutativ, falls: +8. $a*b=b*a$ f.a. $a,b\in\R$ +Ein kommutativer Ring mit $1\not=O$ heißt Körper, falls: +9. zu jedem $a\in\R$ gibt es ein $a^{-1}\in\R$ mit $a*a^{-1}=a^{-1}*a=1$ + +Bemerkung: $O$ kann kein multiplivativ inverses haben. + +- Ist $\R$ ein Körper, so ist $\R*=\R\\{0}$ mit $*$ eine abelsche Gruppe. +- $\Z$ mit + und * ist ein kommutativer RIng mit $1\not=0$ aber kein Körper +- $\mathbb{Q}, \mathbb{C}, \R$ mit + und * ist ein Körper + +## Division mt Rest in $\Z$ +Satz: Zu $a,b\in\Z, b\not=0$, gibt es eindeutig bestimmte $q,r\in\Z$ mit $a=q*b+r$ und $0\leq q <|b|$ (d.h. $\Z$ ist ein euklidischer Ring). (Beweis über Induktion) + +## Zerlegen in primäre Elemente +Satz: Jede ganze Zahl $n>0$ lässt sich bis auf die Reihenfolge der Faktoren eindeutig als Produkt von Primzahlen darstellen. + +Beweis-Existenz mit Annahme: Der Satz gilt nicht, dann gibt es eine kleinste Zahl n die sich nicht als Produkt von Primzahlen schreiben lässt $\rightarrow$ n weder Primzahl noch 1 $\rightarrow n=m*l$ für $m,l>1 \rightarrow$ m und l sind Produkte von Primzahlen $\rightarrow m*l=$ Produkt von Primzahlen. + +Eindeutigkeit mit Annahme: es gibt ein $n>0$ ohen eindeutige Primfaktorzerlegung (PFZ)$\rightarrow$ es gibt ein kleinstes $n>0$ ohne eindeutige PFZ. Kommt eine Primzahl p in beiden Zerlegungen vor, so hat auch $\frac{n}{p}$ zwei versch. PFZen. Man erhält die PFZ von $n'=(1_1-p_1)*b$ aus den PFZen von $q_1-p_1$ und b.. -> Eindeutig bestimmbar. + +## Arithmetik im Restklassenring in $\Z$ +Sei $m>1$ gegeben, $a\equiv b mod m \leftrightarrow m|a-b$ def. Relation auf $\Z$. Die Äquivalenzklasse zu a wird mit $\bar{a}$ bezeichnet, d.h. $\bar{a}=[a]_{/mod m}={x\in \Z: x\equiv a mod m}$, $\Z_m={\bar{a}:a\in\Z}$. Sei dazu $\bar{a}\in\Z_m$ beliebig. + +Division mit Rest $\rightarrow$ es gibt eindeutig bestimmt q,r mit $a?q*m+r$ und $0\leq r < m \rightarrow a-r=q*m \rightarrow m| a-r \rightarrow a\equiv r mod m \rightarrow \bar{a}=\bar{r}$. Also tritt $\bar{a}$ in der Liste $\bar{0},\bar{1},...,\bar{m-1}$ auf. Aus $0\leq i < j \leq m-1$ folgt $\bar{i}\not=\bar{j}$. In der Liste $\bar{0},\bar{1},...,\bar{m-1}$ gibt es daher keine Wiederholungen $\rightarrow |\Z_M|=m$. + +Wir definieren Operationen +,* auf $\Z_m$ durch $\bar{a}+\bar{b}:= \bar{a+b}$ und $\bar{a}*\bar{b}:=\bar{a*b}$ für $a,b\in\Z$. +Wohldefiniert: aus $\bar{a}=\bar{a'}$ und $\bar{b}=\bar{b'}$ folgt $\bar{a+b}=\bar{a'+b'}$. Analog für Multiplikation. + +Eigenschaften von $\Z$ mit +,* werden auf $\Z$ mit +,* "vererbt", z.B. Distributivgesetz. + +Satz: Sei $m\geq 2$ dann ist $\Z_m$ mit +,* ein kommutativer Ring mit $\bar{1}\not=\bar{0}$. Genau dann ist $\Z_m$ sogar ein Körper, wenn m eine Primzahl ist. + +Satz: Genau dann gibt es einen Körper mit n ELementen, wenn n eine Primzahl ist. D.h.. wenn $n=p^a$ ist für eine Primzahl p und $a\geq 1$. + +## Konstruktion von $\mathbb{Q}$ aus $\Z$ +Sei $M=\Z x(\Z /{0}$ die Menge von Brüchen. Durch $(a,b)\sim (c,d)\leftrightarrow ad=bc$ wird Äquivalenzrelation auf M durchgefühert. Schreibweise für die Äquivalenzklassen $\frac{a}{b}$ Die Elemente von $\mathbb{Q} :{\frac{a}{b}:a,b\in\Z, b\not=0}$ heißten rationale Zahlen. +Definiere Operationen +,* auf $\mathbb{Q}$ wie folgt: +- $\frac{a}{b}+\frac{c}{d} = \frac{ad+bc}{b*d}$ (wohldefiniert) +- $\frac{a}{b}*\frac{c}{d} = \frac{a*c}{b*d}$ + +Satz: $\mathbb{Q}$ mit +,* ist ein Körper. +Durch $\frac{a}{b}\leq\frac{c}{d}$ wird eine totale Ordnung auf $\mathbb{Q}$ definiert. Konstruktion von $\R$ aus $\mathbb{Q}$ mit Dedchin-Schnitten. + +### Ring der formalen Potenzreihe +Sei k ein Körper (oder nur ein Ring mit 1+0). Eine Folge $(a_0, a_1,...,a:n)\in K^{\N}$ mit Einträgen aus K heißt formale Potenzreihe. Die Folge (0,1,0,0,...) wird mit x bezeichnet. Statt $K^{\N}$ schreibt man $K[[x]]$. $(0_0,a_1,a_2,...)$ heißt Polynom in x, falls es ein $d\in\N$ gibt mit $a_j=0$ f.a. $j0$, dann ist $p_B:B\rightarrow [0,1]; p_B(\omega)=\frac{p(\omega)}{p(B)}$ eine Verteilung auf B, denn $\sum p_b(\omega)=\sum \frac{p(\omega)}{p(B)}=\frac{1}{p(B)} \sum p(\omega)= \frac{1}{p(B)} p(B)= 1$. +$p_B$ ist die durch B bedingte Verteilung. Für $A\subseteq \Omega$ gilt $p_B(A\cap B)=\sum p_B(\omega)=\sum\frac{p(\omega)}{p(B)}= \frac{p(A\cap B)}{p(B)}:= p(A|B)$ ("p von A unter B") bedingte Wahrscheinlichkeit von A unter B. + +Satz (Bayer): $p(A|B)=\frac{p(B|A)*p(A)}{p(B)}$ wobei $p_A, p_B \geq 0$ + +Satz (Totale Wahrscheinlichkeit): Seien $A_1, ...,A_k$ paarweise disjunkt, $\bigcup A_j=\Omega, p(A_i)>0, B\subseteq \Omega$, dann gilt $p(B)=\sum p(B|A_i)*p(A_i)$. + +Satz (Bayer, erweitert): $A_1,...,A_k,B$ wie eben, $p(B)>0$. Für $i\in {1,...,k}$ gilt $p(A_i|B)=\frac{p(B|A_i)*p(A_i)}{\sum p(B|A_j)*p(A_j)}$ + +Bespiel: In einem Hut liegen drei beidseitig gefärbte Karten. Jemand zieht ("zufällig") eine Karte und leg sie mit einer ("zufälligen") Seite auf den Tisch. Karten rot/rot, rot/blau und blau/blau. Gegeben er sieht rot, wie groß ist die Wahrscheinlichkeit, dass die andere Seite auch rot ist? +p(unten rot | oben rot) = p(unten rot und oben rot)/p(oben rot) = $\frac{p\binom{r}{r}}{p(\binom{r}{r}\binom{r}{b})}=\frac{\frac{2}{6}}{\frac{3}{6}}=\frac{2}{3}$ + +Eine Funktion $X:\Omega \rightarrow \R$ heißt (reellwertige) Zufallsvariable. Weil $\Omega$ endlich ist, ist auch $X(\Omega)={X(\omega): \omega \in \Omega}\subseteq \R$ endlich. Durch $p_x(x):=p(X=x):=p({\omega \in \Omega: X(\omega)=x})$ wird ein Wahrscheinlichkeitsraum $(X(\Omega),p_x)$ definiert; denn $\sum p_x(x)=p(\Omega)=1$. $p_x$ heißt die von X induzierte Verteilung. $X(\Omega)$ ist meist erheblich kleiner als $\Omega$. +Beispiel: Augensumme beim Doppelwurf: $X:\Omega\rightarrow \R, X((i,j))=i+j \rightarrow X(\Omega)={2,3,4,...,12}$ + +Satz: Seien $(\Omega_1, p_1),(\Omega_2, p_2)$ Wahrscheinlichkeitsräume und $(\Omega, p)$ ihr Produktraum. Sei $X:\Omega_1\rightarrow\R,Y:\Omega_2\rightarrow \R$, fasse X,Y als ZVA in $\Omega$ zusammen $X((\omega_1,\omega_2))=X(\omega_1)$ und $Y((\omega_1,\omega_2))=Y(\omega_2)$; d.h. X,Y werden auf $\Omega$ "fortgesetzt". Dann sind X,Y stochastisch unabhängig in $(\Omega, p)$ (und $p(X=x)=p_1(X=x), p(Y=y)=p_2(Y=y)$). + +## Erwartungswert, Varianz, Covarianz +Sei $X:\Omega\rightarrow \R$ ZVA im Wahrscheinlichkeitsraum $(\Omega, p)$. $E(X)=\sum_{x\in X(\Omega)}x p(X=x)=\sum_{\omega in Omega} X(\omega)p(\omega)$ "E verhält sich wie Integral"; E(x) heißt Erwartungswert von x. + +Linearität des Erwartungswertes: $E(x+y)=E(x)+E(y)$ und $E(\alpha x)=\alpha E(x)$. +Ist $X:\Omega\rightarrow \R$ konstant gleich c, so ist $E(x)=\sum x*p(X=x)=c*p(X=x)=c*1=c$. + +Die Varianz von X: $Var(X)=E((X-E(X))^2)$ heißt Varianz von X (um E(X)). +Die Covarianz: $Cov(X,Y)=E((X-E(X))*(Y-E(Y)))$ heißt Covarianz von X und Y. +Der Verschiebungssatz: $Cov(X,Y)=E(X*Y)-E(X)*E(Y)$ +$Var(X)=Cov(X,X)=E(X*X)-E(X)E(X)=E(X^2)-(E(X))^2$ + +Seien X,Y stochastisch unabhängig ($\leftrightarrow p(X=x \wedge Y=y)=p(X=x)*p(Y=y)$) +$E(X)*E(Y)=\sum_{x\in X(\Omega)} x*p(X=x)* \sum_{y\in Y(\Omega)} y*p(Y=y)=\sum_{x\in X(\Omega)} \sum_{y\in Y(\Omega)} xy*p(X=x)p(Y=y)=\sum_{Z\in\R} z*p(X*Y=Z) = E(X*Y)$ +Sind X,Y stochastisch unanhängig ZVA, so ist $E(X)*E(Y)=E(X*Y)$; folglich $Cov(X,Y)=0$ + +Satz: Seien X,Y ZVA, dann gilt $Var(X+Y)=Var(x)+Var(Y)+2*Cov(X,Y)$. Sind insbesondere X,Y unabhängig gilt: $Var(X+Y)=Var(X)+Var(Y)$. + +Sei $(\Omega, p)$ Wahrscheinlichkeitsraum, $X:\Omega\rightarrow \R$ Zufallsvariable heißt Bernoulliverteilt im Parameter p falls $p(X=1)=p$ und $p(X=0)=1-p$, $p\in [0,1]$. $E(X)=\sum x*p(X=x)= 1*p(X=1)=p$ +Für $X:\Omega\rightarrow {0,1}$ ist $X^2=X$: $Var(X)=E(X^2)-E(X)^2 = p-p^2 = p(1-p)=p*q$ + +## Binominalkoeffizienten +Sei N eine Menge, dann ist $\binom{N}{k} := (x \subseteq N: \text{x hat genau k Elemente } (|x|=k) )$ für $k\in \N$. Für $n\in \N$ sei $\binom{n}{k}:=|(\binom{1,...,k}{k})$. + +Satz: $\binom{n}{0}={n}{n}=1$ f.a. $n\geq 0$ $\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}$ f.a. $n\geq 0,k\geq 1, k\geq n-1$ + +Jede n-elementige Menge N ist $\binom{N}{0}=(\emptyset), \binom{N}{n}={N}\rightarrow \binom{n}{0}=\binom{n}{n}=1$. Den zweiten Teil der Behauptung zeigt man induktiv über n. + + +## Binominalsatz +$(a+b)^n = \sum_{k=0}^n a^k b^{n-k}$ für $a,b\in \R$ +Für $n\in \N$ sei $n!=n(n-1)(n-2)...*3*2*1=\prod i$; für $n\in\N$ und $k\geq 0$ sei $[\binom{n}{k}]=\frac{n!}{k!(n-k)!}$ + +Satz: $\binom{n}{0}=\binom{n}{n}=1$ für jedes $n\in\N$, $\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}$ für $k\geq 1$ und $k\leq n-1$. +Zweiter Teil: $[\binom{n-1}{k}]+[\binom{n-1}{k-1}]=\frac{n!}{k!(n-k)!} = [\binom{n}{k}]$. Also stimmen die Rekursionsgleichungen von $\binom{n}{k}$ und $[\binom{n}{k}]$ überein sowie $\binom{n}{k}=[\binom{n}{k}]$. Folglich ist die Anzahl k-elementiger Teilmengen eine n-elementige Menge gleich $\frac{n!}{k!(n-k)!}. + +Seien $X_1,...,X_n$ unabhängige ZVAen, alle $X_i$ seien Bernoulli-Verteilt im Parameter $p[0,1]$, d.h. $p(X_1=1)=p$, $p(X_i=0)=(1-p)$. Dann ist $X_i=X_1+X_2+...+X_n$ ebenfalls reelwertige ZVA. Im Fall $X_i:\Omega\rightarrow {0,1}$ ist $X:\Omega\rightarrow {0,1,...,n}$. Die Verteilung von X ergibt sich wie folgt, für $k\in {0,1,...,n}$: $p(X=k)=\binom{n}{k}*p^k(1-p)^{n-k}$ + +Eine ZVA heißt binominalverteilt in den Parametern n und p falls gilt: $p(X=k)=\binom{n}{k}p^k (1-p)^{n-k}$ für $k\in{0,1,...,n}$; schreibe $X\sim L(n,p)$. Sonst ist X Bernoulliverteilt (genau dann wenn $X\sim L(1,p)$). + +## Erwartungswert und Varianz +Sei $X\sim L(n,p)$ OBdA $X=X_1,+...+X_n$ wobei $X_i$ unabhängig und Bernoulliverteilt. + +$E(X)=n*p$, $E(X_i)=p$ + +$Var(X)=nÜp*(1-p)$, $Var(X_i)=p*(1-p)$ + +## Multinominalverteilung +$\binom{N}{k_1,...,k_n}$ sei Menge der Abbildungen $f:N\rightarrow {1,...,r}$ mit $k1,...,k_r\geq 0$, $k_1+...+k_r=|\N|$ und $f^{-1}[{j}]=k_j \binom{n}{k_1,...,k_r} = |\binom{N}{k_1,...,k_r}$. + +## Hypergeometrische Verteilung +Beispiel: Urne mit zwei Sorten Kugeln; N Gesamtzahl der Kugeln, M Gesamtzahl Kugeln Sorte 1, N-M Gesamtzahl Kugeln Sorte 2, $n\leq N$ Anzahl Elemente einer Stichprobe. X Anzahl der Kugeln Sorte 1 in einer zufälligen n-elementigen Stichprobe. +$p(X=k)=\frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}} +Eine ZVA $X:\Omega\rightarrow \R$ heißt hypergeometrisch Verteilt in den Parametern M,N,n falls $p(X=k)$ für alle $k\geq 0, k\geq M$ gilt. + +$E(X)=\sum_{x=0}^M \frac{\binom{M}{k}\binom{N-M}{n-k}}{\binom{N}{n}}=...=n*\frac{M}{N}$ + +$Var(X)=E(X^2)-E(X)^2 =...= n*\frac{M}{N}(1-\frac{M}{N})(\binom{N-n}{N-1})$ + +# Elementare Graphentheorie +$G=(V,E)$ heißt Graph mit Eckenmenge $V(G)=V$ und Kantenmenge $E(G)=E\subseteq {{x,y}:x\not=y \in V}$. Veranschaulichung als Punkte in der Ebene (V) mit "Verknüpfungslinien" von x nach y. Bsp $G=({1,2,3,4},{12,13,14,15,16})$. + +$P=x_0,...,x_e$ Folge pw verschiedener Ecken mit $x_{i-1},...,x_i \in E(k)$ für $i\in{1,...,l}$ heißt ein Weg von $x_0$ nach $x_e$ der Länge l. Für $(a,b)\in V(G)$ heißt $d_G(a,b)=min{l: es_gibt_einen_a,b-Weg_der_Länge_l}$ Abstand von a nach b. Falls es keinen a,b-Weg gibt, definiere $d_G(a,b)=+\infty$. + +$a\sim b \leftrightarrow$ es gibt einen a,b-Weg in G wird eine Äquivalenzrelation auf V(G) definiert. DIe Äquivalenzklassen heißen (Zusammenhangs-) Komponenten von G. + +G heißt zusammenhängend, wenn G höchstens eine Komponente besitzt. $d_G: V(G) x V(G) \leftrightarrow \R_{\geq 0}$ ist eine Matrix +1. $d_G(x,y)=0 \leftrightarrow x=y$ f.a. $x,y \in V(G)$ +2. $d_G(x,y)=d_G(y,x)$ f.a. $x,y\in V(F)$ +3. $d_G(x,z)\leq d_G(x,y) + d_G(y,z))$ f.a. $x,y,z \in V(G)$ + +Für $A\subseteq V(G)$ sei $G[A]:= (A, {x,y\in E(G):x,y\in A})$. Für $F\subseteq E(G)$ sei $G[F]:=(V(G), F)$. $G[A]$ bzw $G[F]$ heißt von A bzw F induzierte Teilgraph. Ein Graph H mit $V(H)\subseteq V(G)$ und $E(H)\subseteq E(G)$ heißt Teilgraph von G, schreibweise $H\leq G$. $\leq$ ist Ordnung, denn: +1. $G\leq G$ +2. $H\leq G \wedge G\leq H \rightarrow H=G$ +3. $H\leq G \wedge G=L \rightarrow H\leq L$ + +Ist $P=x_0,...,x_p$ Weg, so heißt auch der Teilgraph ein Weg von $x_0$ nach $x_e$. +Graphen G, H heißen isomorph, falls es einen Isomorphismus von V(G) nach V(H) gibt. Das heißt eine Bijektion. +$V(G)\rightarrow V(H)$ mit $f(x)f(y)\in E(H)\leftrightarrow x,y \in E(G)$. Es gilt: +1. $G\cong G$ +2. $G\cong H \rightarrow H \cong G$ +3. $G\cong H \wedge H\cong L \rightarrow G\cong L$ + +Eine Folge $C=x_0,x_1,...,x_{l-1}$ von Ecken mit $x_i,x_{i+1}\in E(G)$ für $i\in {0,...,l-2}$ und $x_{l-1}x_0 \in E(G)$ heißt Kreis in G der Länge l, falls $x_0,...,x_{l-1}$ pw versceiden sind. Bsp: Kreis der Länge 5. + +EIn Teilgraph H des Graphen G (also $H\leq G$) heißt aufspannend, falls $V(H)=V(G)$. Für eine Ecke $x\in V(G)$ sei $d_G(x)=|{x,y\in E(G), y\in V(G)}|$ die Anzahl der mit x indizierten Kanten, der sogenannte Grad von x in G. + +Weiter $N_G(x):={x\in V(G): xy \in E(G)}$ die Menge der nachbarn von x in G. Hier gilt: $|N_G(x)=d_G(x)|$. + +In jedem Graph G gilt $\sum_{x\in V(G)} d_G(x)=2|E(G)|$. Der Durchschnittsgrad von G ist somit $\bar{d(G)}=\frac{1}{|V(G)|}\sum d_G(x)=\frac{2|E(G)|}{|V(G)|}$. + +Ein Graph ist ein Baum wenn G zusammenhängend und G-e nicht zusammenhängend für jedes $e\in E(G)$ "G ist minimal zusammenhängend" +Graph G ist ein Baum wenn G kreisfrei und Graph G+xy nicht kreisfrei für jedes $xy \not\in E(G)$ +G ist Baum, wenn +- G ist kreisfrei und zusammenhängend +- G kreisfrei und $|E(G)|=|V(G)|-1$ +- G zusammenhängend und $|E(G)|=|V(G)|-1$ + +Jeder Baum mit wenigstens einer Ecke besitzt eine Ecke vom Grad $\leq 1$, ein sog. Blatt ("jeder Baum besitzt ein Blatt"). +$\rightarrow E(G)=|V(G)|-1$ für jeden Baum also $d(G)=\frac{2|V(G)| -2}{|V(G)|}<2$. + +G Wald $\leftrightarrow$ die Komponenten von G sind Bäume + +G Baum $\leftrightarrow$ G ist zusammenhängender Wald + +Ein Teilgraph H von G heißt Teilbaum von G, falls H ein Baum ist. Ein aufspannender Teilbaum von G heißt Spannbaum von G. G zusammenhängend $\leftrightarrow$ G Spannbaum. + +Ein Spannbaum T von G heißt Breitensuchbaum von G bei $x\in V(G)$ falls $d_F(z,x)=d_G(z,x)$ f.a. $z\in V(G)$. + +Ein Spannbaum T von G heißt Tiefensuchbaum von G bei $x\in V(G)$ falls für jede Kante zy gilt: z liegt auf dem y,x-Weg in T oder y liegt auf dem z,t-Weg in T. + +Satz: Sei G zusammenhängender Graph $x\in V(G)$. +(X) sind $x_0,...,x_{e-1}$ schon gewählt und gibt es ein $+ \in {0,..., e-1}$ so, dass $x_+$ einen Nachbarn y in V(G)\{$x_0,...,x_{e-1}$}, so setze $x_e=y$ und $f(e):=t$; iteriere mit $e+1$ statt e. +Dann ist $T:=({x_0,...,x_e},{x_j*x_{f(j)}: j\in {1,...,e}})$ ein Spannbaum +- (X) wird in + stets kleinstmöglich gewählt, so ist T ein Breitensuchbaum +- wird in (X) + stets größtmöglich gewählt, so ist T ein Tiefensuchbaum + +## Spannbäume minimaler Gewichte +G Graph, $F \subseteq E(G)$ heißt kreisfrei, falls G(F) kreisfrei ist. + +Lemma (Austauschlemma für Graphen): +Seien F, F' zwei kreisfreie Kantenmengen in Graph G und $|F|<|F'|$, dann gibt es ein $e \in F'/F$ so, dass $F\vee {e}$ kreisfrei ist. + +G, $\omega:E(G)\rightarrow \R$ (Gewichtsfunktion an den Kanten). Für $F\subseteq E(G)$ sei $\omega (F)=\sum \omega (e)$, speziell $\omega (\emptyset)=0$. + +Für einen Teilgraphen H von G sei $\omega (G)=\omega (E(G))$. Ein Spannbaum minimalen Gewichts ist ein Spannbaum T von G mit $\omega (T)\leq \omega (S)$ für jeden Spannbaum S von G. + +Satz (Kruskal): Sei G zuständiger Graph, $\omega:E(G)\rightarrow \R$; Setze $F=\emptyset$. Solange es eine Kante $e\in E(G)\\F$ gibt so, dass $F \vee {e}$ kreisfrei ist, wähle e mit minimalem Gewicht $\omega(e)$, setzte $F=F\vee {e}$, iterieren. Das Verfahren endet mit einem Spannbaum $T=G(F)$ minimalen Gewichts. + +Beweis: Weil G endlich ist endet das Verfahren mit einem maximal kreisfreien Graphen T. Seien $e_1,...,e_n$ die Kanten von T in der Reihenfolge ihres Erscheinens, sei S Spannbaum minimalen Gewichts und $f_1,...,f_m$ die Kanten in Reihenfolge aufsteigenden Gewichts. Angenommen (redactio ad absurdum) $\omega(T)>\omega(S)$. Dann gibt es ein $i\in{1,...,m}$ mit $\omega(e_i)>\omega(f_i)$. Wähle i kleinstmöglich, dann ist $F={e_1,...,e_{i-1}}$ und $F'={f_1,...,f_i}$ kreisfrei. Nach Austaschlemma gibt es ein $f\in F'/F$ so, dass $F\vee {f}$ kreisfrei ist. Also ist f ein Kandidat bei der Auswahl von $e_i$ gewesen, also $\omega(e_i)\leq \omega(f)$ (Fehler!). Folglich ist $\omega(T)\leq \omega(S) \Rightarrow \omega(T)=\omega(S)$ also T und S Spannbaum mit minimalen Gewichten. + +## Das Traveling Salesman Problem +G sei Graph (vollständig) auf n Ecken, d.h. $xy\in E(G) \forall x\not =y$ aus V(G) und $\omega*E(G)\rightarrow \R$. Finde aufspannenden Kreis C von G minimalen Gewichts. Zusatzannahme (metrische TSP) $\omega(xz)\leq \omega(xy)+\omega(yz)$. +Finde einen aufspannenden Kreis C, der um einen Faktor von höchstens zwei von einem aufspannenden Kreis D minimalen Gewichts abweicht ($\omega(C)\leq 2 \omega(D)$) sog. Approximationsalgorithmus mit Gütefaktor $\leq$. + +Konstruiere eine Folge$x_0,...,x_m$ mit der Eigenschaft, dass jede Kante von T genau zweimal zum Übergang benutzt wird, d.h. zu $e\in E(T)$ existieren $i\not = j$ mit $e=x_i x_{i+1}$ und $e=x_j x_{j+1}$ und zu jedem k existieren $e\in E(T)$ mit $e=x_k x_{k+1}$. Das Gewicht dieser Folge sei $\sum \omega(x_i x_{i+1})= 2\omega(T)$. + +Eliminiere Mehrfachnennungen in der Folge. Gibt es $i\not= j$ mit $x_j=x_i$ so streiche x aus der Folge. Das Gewicht der neuen Folge ist maximal so groß wie das Gewicht der alten. Durch iteration erhält man einen aufspannenden Kreis mit $\omega(X) \leq 2 \omega(T)$. Sei e Kante von D $\rightarrow D-e=S$ ist aufspanndender Weg $\rightarrow \omega(T) \leq w(D-e) \leq \omega (D)$. + +G Graph, $k\geq 0$. Eine Funktion $f:V(G)\rightarrow C$ mit $|C|\leq k$ heißt k-Färbung, falls $f(x)\not = f(y)$ für $xy\in E(G)$. G heißt k-färbbar, falls G eine k-Färbung besitzt. Das kleinste $k\geq 0$ für das G k-färbbar ist heißt dramatische Zahl von G, Bezeichnung $X(G)$. + + + +Satz (Tuga): Sei $k\geq 2$ und G ein Graph ohne Kreise eine Lösung $l\equiv 1 mod k$, dann ist G k-faltbar. G 2-färbbar $\leftrightarrow$ G hat keine Kreise ungerader Länge. Ein Graph heißt bipartit mit den Klassen A,B falls $(x\in A \wedge y\in B)\vee (x\in B \wedge y\in A)$ für alle $xy \in E(G)$ gilt. Genau dann ist G bipoartit mit gewissen Klassen A,B wenn G 2-färbbar ist. + +Satz (Hall) "Heiratssatz": Sei G bipartit mit Klassen A,B. Dann gilt G hat ein Matching von A $\leftrightarrow |N_G(X)|\leq |X|$ für alle $X\subseteq A$. + +Satz: "$\rightarrow$" sei M Matching von A in G $\rightarrow |N_G(X)| \leq N_{G[M]}(X)=|X|$. "$\leftarrow$" Induktiv über $|V(G)|$. +Ein schneller Zeuge für die Existenz eines Matchings von A im bipartiten Graphen G mit Klassen A,B ist das Matching selbst. Ein schneller Zeuge für die nicht-existenz eines Matchings ist ein $X\subseteq A$ mit $|N_G(X)| < |X|$. + +Das Entscheidungsproblem "hat ein bipartiter Graph ein Matching?" ist im NP und zugleich in co-NP. Also ist auch Problem "ist ein Graph 2-färbbar?" in NP und co-NP. Das Problem "ist ein Graph 3-färbbar" ist in NP. Es ist sogar NP-vollständig, d.h. jedes Problem in NP (jedes Entscheidungsproblem mit schnellen Zeugen für Ja) lässt sich in Polynomalzeit in dieses Färbungsproblem überführen. + +Ein weiteres Problem in NP ist: aussagenlogische Formel gegeben $F=C_1 \wedge C_2 \wedge ... \wedge C_m$, jedes $C_b$ ist von der Form $P\vee Q \vee R$ mit $P=x_i; Q=x_j; R=x_2$ oder $P=\neg x_i; Q=\neg x_j; R=\neg x_2$. Auch dieses Problem ist NP-vollständig. +- SAT ist die "Mutter aller Probleme in NP" +- Färbbarkeit lässt sich darauf zurückführen und umgekehrt diff --git a/LICENSE b/LICENSE index f288702..3877ae0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,674 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Neurobiologische Informationsverarbeitung.md b/Neurobiologische Informationsverarbeitung.md index a5c1e0f..5e27bb6 100644 --- a/Neurobiologische Informationsverarbeitung.md +++ b/Neurobiologische Informationsverarbeitung.md @@ -1,232 +1,232 @@ ---- -title: Neurobiologische Informationsverarbeitung ---- - -| | hormonal | nerval | -| -- | -- | -- | -| Informations Träger | chem. Substanz = Hormon | Potentialunterschied mit max 130 m/s, Leiter 2.Ordnung (Ionen) | -| Transport | Blut | in abgegrenzten Nervenbahnen | -| Einfluss | diffus, auf viele Empfänger gleichzeitig, Selektion durch Empfindlichkeit (broadcasting) | zu bestimmten genetisch bed. Empfängerzellen | -| Natur der Signale | sehr spezifisch, nur eine bestimmte Information wird vermittelt (Wachstumshormon) | unspezifisch, Spezialität entsteht durch Transport in def. Bahnen (Seh-/Hörbahn) | - -# Rezeptoren (Sinneszellen) -Definition: Zelle, die zur Perzeption von Reizen und zur Weiterleitung der Reizinformation befähigt ist. Sie liefert Informationen über den physikalisch-chemischen Zustand der Umwelt. - -Sinneszelle = Spezifiziert Nervenzelle -- primäre Sinneszelle (mit eigenem Axon) -- sekundäre Sinneszelle (ohne eigenes Axon) - -# On/Off-Zentrum Nerven - -!TODO - -# Def: Rezeptives Feld -Das rezeptive Feld ist eine Fläche mit Rezeptoren, die bei Reizung zur Reaktion eines Neurons führen => Erzeugung Generatorpotential - -# Def: Adaption -Effekt der Verminderung der Rezeptorantwort bei konstantem Reiz -- tonische Verhalten: gleichbleibende AP-Frequenz bei konst. Reiz -- phasisches Verhalten: Starker Anstieg der AP-Frequenz bei Reizänderung -- tonische Rezeptoren: nicht gewöhnend (Schmerz, Kälte) -- phasische Rezeptoren: Tastsinn, Druckrezeptoren - -# Geschmacksqualitäten -süß, salzig, sauer, bitter, !!!!!!umami!!!!! - -# Neuron -kann Informationen leiten und verarbeiten (empfangen können auch andere) -- Dendriten: Hauptansatz für Synapsen, räumliche und Zeitliche Summation - - räumlich: Ankommende Potentiale verschiedener Synapsen - - zeitlich: Nacheinander ankommende Potentiale an einer Synapse -- Soma: Synapsen am Soma meist hemmend -- Axon: myelinisiert oder nicht-myelinisiert - -# Synapsen -chemisch <=> elektrisch (= gap junctions)\ -- elektrisch: - - sehr schnell, z.B. Herzmuskelzellen - - kleiner als chemisch - - stammgeschichtlich älter - - dienen auch anderem Stoffaustausch -- chemisch: - - keine unmittelbare Weiterleitung des Aktionspotentials an einer Synapse (mehrere müssen gleichzeitig aktiv sein) - - unidirektional - - Verzögerung - - Blockierbar durch chem. Substanzen - -# Gliazellen -- Astrozyten (Makroglia): Regulierung der verschiedenen Substanzkonzentrationen (z.B. Transmitterkonzentration), Zwischenspeicher, Versorgung der Nervenzellen -- Oligodentrozyten (Makroglia): Bilden Myelin im Zentralnervensystem (in der peripherie schwammscher Zellen) -- Microglis: - - wandeln sich nach Hirnverletzung zu Rekrophagen (Fresszellen) -> Abbau abgestorbener Bestandteile durch Produktion einer Mydroxilgruppe - - Leitgewebe bei Hinentwicklung - - Starke Verzweigung zur Überwachung - - -# Entstehung Membranpotential -Ruhepotential: ~70-90mV (Zellinneres negativ)\ -1. Diffusionspotential - passiv - - Im Ruhezustand Membran permeabel für K⁺ - - Gleichgewicht aus Konzentrationsgradient und Ladungsgradient - -!TODO zeichnung - - -2. Ionenpumpen - aktiv - - Na⁺ K⁺ Pumpen - - 3Na⁺ aus der Zelle, 2K⁺ in die Zelle, jeweils gegen den Konzentrationsgrad, Verbrauch von 1 ATP zu ADP+P - - Das Ruhepotential wird aktiv aufrechterhalten -> Life-Zero-System - -# Potentialänderung -- Depolarisation: Verminderung des Aktionspotentials (positiver) (Erregung, Excitation) -- Hyperpolarisation: Erhöhung des Aktionspotetials (negativer) (Hemmung, Inhibition) - -Bei Erregung steigt Permeabilität für Na+ an; E_{Na⁺} angestrebt => +55mV - -# gradierte Potential Änderung -- depolarisierender Reiz erhöht Permeabilität für K⁺, Na⁺, Cl⁻ -- Na+ größer Antrieb nach innen aber Ionenpumpen fordern Na⁺ nach außen, solange Schranke nicht überschritten - -# nicht gradierte potential Änderung -- einige Membranstrukturen reagieren auf Reiz über der Schwelle mit nicht abgestelltem Potentialsprung => AP für 1ms -- Axome, Muskelfasern, Drüsen = konduktive Membran -- "Alles oder nichts"-Gesetz: Bei Überschreitung der Schwelle AP gleicher Form und Größe, Lawineneffekt des Einstroms von Na⁺, wird gebremst von Leitfähigkeitserhöhung von K⁺ (Ausstrom) - -Bedingung für AP: g_Na⁺ > g_K⁺ - -# Adaption -Abnahme der Spikefrequenz bei konst. Repolarisation -- ZNS: sehr schnelle Adaption, oft nur ein AP -- Peripherie: mehrere AP - -# Akkomodation -Ausbleiben eines AP bei sehr langsam ansteigender Depolarisation. Na⁺ Kanäle werden inaktiv bevor g_Na⁺ > g_K⁺ - -# Elektrotonische Weiterleitung -passiv, mit Dekrement -- Verlust abhängig von Wiederstand - - Innen: 20-200 Ohm-cm - - Außen: 1,5-3x geringer - - Membran: 10¹⁰ Ohm-cm -- spezifischer Widerstand: !TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -- Membran verhält sich wie Kondensator => bei Ausbreitung des Potentials muss der Kondensator ungeladen werden -> Zeitkonstante $\tau = R_m * C_m$ -- Dendriten (nur elektrotonische Ausbreitung, hohe Na+ Kanäle) werden zur Peripherie dünner, R_i steigt, \lambda sinkt -- Kabeltheorie nach Rall: Einteilung in Kompartimente mit gleichem \lambda - -# Weiterleitung von APs -- konduktile Leitung ohne Dekrement -- An jeder Membranstelle neuer Erregungsvorgang mit alles oder nichts Prinzip -- Ausbreitung durch Refraktärzeit unidirektional von Reizort weg - -Saltatorische Erregungsleitung: erleichterte Auslösung eines AP an den ranvierschen Schnürringen, Potential "springt" von Ring zu Ring => Raumeinsparung, Geschwindigkeitserhöhung - -# Weiterleitung an Synapsen -- Na⁺ Kanäle unterliegen keiner Deaktivierung, solange aktiv wie Transmitter vorhanden ist -- Second Messenger Systeme: längerfristige Wirkung - -## Ableitung -1. AP an Präsynapse -2. Ca²⁺ strömt in die Zelle -> Vesikel zu präsynaptischer Membran -3. Transmitterfreisetzung ~ AP-Folge -4. Diffusion durch den Spalt -5. Wirkung des Transmitters auf Rezeptor (Na⁺ Kanäle) der postsynaptischen Membran -6. Permeabilitätsänderung in der postsynaptischen Membran - - Na⁺, K⁺: EPSP - - K⁺, CL⁻: IPSP -7. Weiterleitung EPSP/IPSP über elektronische Leitung entlang Dendrit -8. Inaktivierung und Recykling des TP - -# Beeinflussung von Synapsen -- Agomisten: gleiche Wirkung wie Transmitter, aber veränderte Eigenschaften (z.B. kein second-messenger Effekt) -- partielle Agomisten: Bindung an Rezeptor aber nur geringe Leitfähigkeitsänderung -- Antagomisten: Bindug an Rezeptor (Ionenkanal) ohne Leitfähigkeitsänderung - -# Interaktion von Synapsen -- räumliche + zeitliche Integration - - räumlich: EPSP/IPSP verschiedener Synapsen, die z.B. Dendritenbaum ansetzten werden an der postsynaptischen Membran addiert - - zeitlich: die von einer oder mehreren Präsynapsen kurz nacheinander eingehenden Erregungen führen in der postsynaptischen Zelle zu EPSP/IPSP die addiert werden -- prä- und postsynaptische Hemmung - - prä: Synapse: eig. aktiv -> wird gehemmt - - hemmende Synapse ansonsten -- Bahnung: mehrere Synapsen an einem Dendriten; alle gleichzeitig aktiv, fehlt aber ein Dendrit => kein AP = Synapse bahnt Eingang der anderen - -# Veränderung der Effektivität von Synapsen -- tetanische Potenzierung: - - Aktivierung einer Präsynaptische mit Reizserien führt zu einem zunehmend vergrößertem EPSP (syn. Potenzierung), der auch nach längeren Reizserien über alle Enden hinaus festbestehen kann (posttetamische Pot.) (Kurzzeitgedächtnis) -- Langzeitpotenzierung: - - Strukturelle Anpassung während des Lernens - - Prozess besteht auf Wandlungsfähigkeit der Dornen: durch Formänderung, Ab-und Aufbau werden Verb. zu reaktives Axonen gelöst und zu aktiven Fasern hergestellt -- heterosynaptische Potenzierung - - !TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -# Neuronale Verschaltungsprinzipien -## Divergenz & Konvergenz -- Divergenz: Zur Überschreitung der Schwelle ist ein erregender Eingang nötig -- Konvergenz: Zur Überschreitung der Schwelle sind drei erregende Eingänge nötig -- Divergenz und Konvergenz: gleiche Struktur, Umschaltung zwischen D. und K. über Zentralnervöse Vorgänge - -## Neuronale Erregungskreis -funktionierende Einheit von miteinander verbundenen Neuronen, die sich in ihrer Aktivität gegenseitig beeinflussen - -## neuronale Hemmung -- Schutz vor Informationsüberflutung -- prä- und postsynaptische Hemmung -- Vorwärtshemmung !TODO -- Rückwärtshemmung !TODO -- Streuung !TODO -- laterale Inhibition: Verschaltungsprinzip von Neuronen, bei denm Freiverschaltete Neuronen benachbarte Neuronen hemmen => Kontrastverstärkung - - TODO - - Änderung der Hemmung mit zunehmendem Abstand von benachbarten Neuron -> rezeptive Felder - -# Mexican Hat - -!TODO zeichnung - -Übertragungsfunktion: $g(i)=m_1 e^{\frac{-r²}{B_1²} } - m_2 e^{\frac{-r²}{B_2²}}$ -r: Radius RF; m: max Amplitude; B: breite Gauß; $B_2=k*B_1$ - -| Pass | Beschreibung | Vorraussetzung | -| -- | -- | -- | -| Tiefpass | Grenzfrequenz umso höher je kleiner B¹ | $m_2=0$ $m_1\not=0$ $B_1\not=0$ | -| Hochpass | Grenzfrequenz umso höher je kleiner B² | $m_2\not=0$ $B_1\rightarrow 0$ $B_2\not=0$ | -| Bandpass | Mittelwertunterdrückung, On-Zentrum | $K>1$, $m_1>m_2$, $m_1B_1 = m_2B_2$ | -| Bandpass | Off-Zentrum | $k>1$, §m_1< m_2$ | - -$y_i=\sum_{j=1}^N K_{Sij}*x_j + \sum_{j=1}^N K_{Hij}*x_j$ -$K_{Sij} \in [0,1]$ Streuung -$K_{Hij} \in [-1,1]$ Hemmung - -# Neuronenmodelle -## Statische Modelle -### McCulloch & Pitts -$y=\sum_{j=1}^N \omega_j x_j -s = z$ -kein Lernen, keine Erklärung für Fehlertoleranz - -### statisches Neuronenmodell -$y=f(\sum_{j=1}^N \omega_jx_j -s) = f(z)$ -Modellvereinfachung: Ratenmodell: Impulsfrequenz als analoge mittlere Feuerrate (keine Spikes) - -## Dynamische Modelle -Approximation der Gewichtsfunktion als Alpha-Funktion, Trägheitsverhalten realisiert. -Vereinfachung der Alphafunktion: Anstieg nicht wichtig, nur verzögerter Abfall eventuell mit Überlagerung -$g(i)=\frac{t*e}{t_{peak}} e^{\frac{-t}{t_{peak}}} \Rightarrow g(i)=\frac{1}{\tau}e^{\frac{-t}{\tau}}$ - -## Integrate & Fire Modelle -Eingänge werden summiert, mit Schwelle verglichen und bei Überschreiten wird Spike erzeugt -- Zeit zwischen Stimulus und 1. Spike von Interesse -- Phasenlage zwischen ............. und Hintergrund-Oszillation -- Korrelation/Synchronität: Spikes anderer Neuronen als Referenz - -# Lernen und Gedächtnis -## phyletisches Gedächtnis -Artgedächtnis, angeborenes, primär sensorische und motorische Bereiche der Hirnrinde, in grober Verschaltung des stammgeschichtlich älteren Teils schon bei der Geburt als Essenz der wichtigsten Erfahrungen angelegt - Extrakt der Anpassungsleistung der Art - -## individuelles Gedächtnis -Baut auf phyletischem Gedächtnis auf, Sitz im Assoziationscortex, evolutionär spätere, höhere Komplexität der Netzwerke, entwickelt sich während der ganzen Kindheit und auch noch bei Erwachsenen - -## prozedurales Wissen -Erwerb von Verhaltensweisen "gewusst wie" sensomotorische Intelligenz - -## deklaratives Wissen +--- +title: Neurobiologische Informationsverarbeitung +--- + +| | hormonal | nerval | +| -- | -- | -- | +| Informations Träger | chem. Substanz = Hormon | Potentialunterschied mit max 130 m/s, Leiter 2.Ordnung (Ionen) | +| Transport | Blut | in abgegrenzten Nervenbahnen | +| Einfluss | diffus, auf viele Empfänger gleichzeitig, Selektion durch Empfindlichkeit (broadcasting) | zu bestimmten genetisch bed. Empfängerzellen | +| Natur der Signale | sehr spezifisch, nur eine bestimmte Information wird vermittelt (Wachstumshormon) | unspezifisch, Spezialität entsteht durch Transport in def. Bahnen (Seh-/Hörbahn) | + +# Rezeptoren (Sinneszellen) +Definition: Zelle, die zur Perzeption von Reizen und zur Weiterleitung der Reizinformation befähigt ist. Sie liefert Informationen über den physikalisch-chemischen Zustand der Umwelt. + +Sinneszelle = Spezifiziert Nervenzelle +- primäre Sinneszelle (mit eigenem Axon) +- sekundäre Sinneszelle (ohne eigenes Axon) + +# On/Off-Zentrum Nerven + +!TODO + +# Def: Rezeptives Feld +Das rezeptive Feld ist eine Fläche mit Rezeptoren, die bei Reizung zur Reaktion eines Neurons führen => Erzeugung Generatorpotential + +# Def: Adaption +Effekt der Verminderung der Rezeptorantwort bei konstantem Reiz +- tonische Verhalten: gleichbleibende AP-Frequenz bei konst. Reiz +- phasisches Verhalten: Starker Anstieg der AP-Frequenz bei Reizänderung +- tonische Rezeptoren: nicht gewöhnend (Schmerz, Kälte) +- phasische Rezeptoren: Tastsinn, Druckrezeptoren + +# Geschmacksqualitäten +süß, salzig, sauer, bitter, !!!!!!umami!!!!! + +# Neuron +kann Informationen leiten und verarbeiten (empfangen können auch andere) +- Dendriten: Hauptansatz für Synapsen, räumliche und Zeitliche Summation + - räumlich: Ankommende Potentiale verschiedener Synapsen + - zeitlich: Nacheinander ankommende Potentiale an einer Synapse +- Soma: Synapsen am Soma meist hemmend +- Axon: myelinisiert oder nicht-myelinisiert + +# Synapsen +chemisch <=> elektrisch (= gap junctions)\ +- elektrisch: + - sehr schnell, z.B. Herzmuskelzellen + - kleiner als chemisch + - stammgeschichtlich älter + - dienen auch anderem Stoffaustausch +- chemisch: + - keine unmittelbare Weiterleitung des Aktionspotentials an einer Synapse (mehrere müssen gleichzeitig aktiv sein) + - unidirektional + - Verzögerung + - Blockierbar durch chem. Substanzen + +# Gliazellen +- Astrozyten (Makroglia): Regulierung der verschiedenen Substanzkonzentrationen (z.B. Transmitterkonzentration), Zwischenspeicher, Versorgung der Nervenzellen +- Oligodentrozyten (Makroglia): Bilden Myelin im Zentralnervensystem (in der peripherie schwammscher Zellen) +- Microglis: + - wandeln sich nach Hirnverletzung zu Rekrophagen (Fresszellen) -> Abbau abgestorbener Bestandteile durch Produktion einer Mydroxilgruppe + - Leitgewebe bei Hinentwicklung + - Starke Verzweigung zur Überwachung + + +# Entstehung Membranpotential +Ruhepotential: ~70-90mV (Zellinneres negativ)\ +1. Diffusionspotential - passiv + - Im Ruhezustand Membran permeabel für K⁺ + - Gleichgewicht aus Konzentrationsgradient und Ladungsgradient + +!TODO zeichnung + + +2. Ionenpumpen - aktiv + - Na⁺ K⁺ Pumpen + - 3Na⁺ aus der Zelle, 2K⁺ in die Zelle, jeweils gegen den Konzentrationsgrad, Verbrauch von 1 ATP zu ADP+P + - Das Ruhepotential wird aktiv aufrechterhalten -> Life-Zero-System + +# Potentialänderung +- Depolarisation: Verminderung des Aktionspotentials (positiver) (Erregung, Excitation) +- Hyperpolarisation: Erhöhung des Aktionspotetials (negativer) (Hemmung, Inhibition) + +Bei Erregung steigt Permeabilität für Na+ an; E_{Na⁺} angestrebt => +55mV + +# gradierte Potential Änderung +- depolarisierender Reiz erhöht Permeabilität für K⁺, Na⁺, Cl⁻ +- Na+ größer Antrieb nach innen aber Ionenpumpen fordern Na⁺ nach außen, solange Schranke nicht überschritten + +# nicht gradierte potential Änderung +- einige Membranstrukturen reagieren auf Reiz über der Schwelle mit nicht abgestelltem Potentialsprung => AP für 1ms +- Axome, Muskelfasern, Drüsen = konduktive Membran +- "Alles oder nichts"-Gesetz: Bei Überschreitung der Schwelle AP gleicher Form und Größe, Lawineneffekt des Einstroms von Na⁺, wird gebremst von Leitfähigkeitserhöhung von K⁺ (Ausstrom) + +Bedingung für AP: g_Na⁺ > g_K⁺ + +# Adaption +Abnahme der Spikefrequenz bei konst. Repolarisation +- ZNS: sehr schnelle Adaption, oft nur ein AP +- Peripherie: mehrere AP + +# Akkomodation +Ausbleiben eines AP bei sehr langsam ansteigender Depolarisation. Na⁺ Kanäle werden inaktiv bevor g_Na⁺ > g_K⁺ + +# Elektrotonische Weiterleitung +passiv, mit Dekrement +- Verlust abhängig von Wiederstand + - Innen: 20-200 Ohm-cm + - Außen: 1,5-3x geringer + - Membran: 10¹⁰ Ohm-cm +- spezifischer Widerstand: !TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +- Membran verhält sich wie Kondensator => bei Ausbreitung des Potentials muss der Kondensator ungeladen werden -> Zeitkonstante $\tau = R_m * C_m$ +- Dendriten (nur elektrotonische Ausbreitung, hohe Na+ Kanäle) werden zur Peripherie dünner, R_i steigt, \lambda sinkt +- Kabeltheorie nach Rall: Einteilung in Kompartimente mit gleichem \lambda + +# Weiterleitung von APs +- konduktile Leitung ohne Dekrement +- An jeder Membranstelle neuer Erregungsvorgang mit alles oder nichts Prinzip +- Ausbreitung durch Refraktärzeit unidirektional von Reizort weg + +Saltatorische Erregungsleitung: erleichterte Auslösung eines AP an den ranvierschen Schnürringen, Potential "springt" von Ring zu Ring => Raumeinsparung, Geschwindigkeitserhöhung + +# Weiterleitung an Synapsen +- Na⁺ Kanäle unterliegen keiner Deaktivierung, solange aktiv wie Transmitter vorhanden ist +- Second Messenger Systeme: längerfristige Wirkung + +## Ableitung +1. AP an Präsynapse +2. Ca²⁺ strömt in die Zelle -> Vesikel zu präsynaptischer Membran +3. Transmitterfreisetzung ~ AP-Folge +4. Diffusion durch den Spalt +5. Wirkung des Transmitters auf Rezeptor (Na⁺ Kanäle) der postsynaptischen Membran +6. Permeabilitätsänderung in der postsynaptischen Membran + - Na⁺, K⁺: EPSP + - K⁺, CL⁻: IPSP +7. Weiterleitung EPSP/IPSP über elektronische Leitung entlang Dendrit +8. Inaktivierung und Recykling des TP + +# Beeinflussung von Synapsen +- Agomisten: gleiche Wirkung wie Transmitter, aber veränderte Eigenschaften (z.B. kein second-messenger Effekt) +- partielle Agomisten: Bindung an Rezeptor aber nur geringe Leitfähigkeitsänderung +- Antagomisten: Bindug an Rezeptor (Ionenkanal) ohne Leitfähigkeitsänderung + +# Interaktion von Synapsen +- räumliche + zeitliche Integration + - räumlich: EPSP/IPSP verschiedener Synapsen, die z.B. Dendritenbaum ansetzten werden an der postsynaptischen Membran addiert + - zeitlich: die von einer oder mehreren Präsynapsen kurz nacheinander eingehenden Erregungen führen in der postsynaptischen Zelle zu EPSP/IPSP die addiert werden +- prä- und postsynaptische Hemmung + - prä: Synapse: eig. aktiv -> wird gehemmt + - hemmende Synapse ansonsten +- Bahnung: mehrere Synapsen an einem Dendriten; alle gleichzeitig aktiv, fehlt aber ein Dendrit => kein AP = Synapse bahnt Eingang der anderen + +# Veränderung der Effektivität von Synapsen +- tetanische Potenzierung: + - Aktivierung einer Präsynaptische mit Reizserien führt zu einem zunehmend vergrößertem EPSP (syn. Potenzierung), der auch nach längeren Reizserien über alle Enden hinaus festbestehen kann (posttetamische Pot.) (Kurzzeitgedächtnis) +- Langzeitpotenzierung: + - Strukturelle Anpassung während des Lernens + - Prozess besteht auf Wandlungsfähigkeit der Dornen: durch Formänderung, Ab-und Aufbau werden Verb. zu reaktives Axonen gelöst und zu aktiven Fasern hergestellt +- heterosynaptische Potenzierung + - !TODO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +# Neuronale Verschaltungsprinzipien +## Divergenz & Konvergenz +- Divergenz: Zur Überschreitung der Schwelle ist ein erregender Eingang nötig +- Konvergenz: Zur Überschreitung der Schwelle sind drei erregende Eingänge nötig +- Divergenz und Konvergenz: gleiche Struktur, Umschaltung zwischen D. und K. über Zentralnervöse Vorgänge + +## Neuronale Erregungskreis +funktionierende Einheit von miteinander verbundenen Neuronen, die sich in ihrer Aktivität gegenseitig beeinflussen + +## neuronale Hemmung +- Schutz vor Informationsüberflutung +- prä- und postsynaptische Hemmung +- Vorwärtshemmung !TODO +- Rückwärtshemmung !TODO +- Streuung !TODO +- laterale Inhibition: Verschaltungsprinzip von Neuronen, bei denm Freiverschaltete Neuronen benachbarte Neuronen hemmen => Kontrastverstärkung + - TODO + - Änderung der Hemmung mit zunehmendem Abstand von benachbarten Neuron -> rezeptive Felder + +# Mexican Hat + +!TODO zeichnung + +Übertragungsfunktion: $g(i)=m_1 e^{\frac{-r²}{B_1²} } - m_2 e^{\frac{-r²}{B_2²}}$ +r: Radius RF; m: max Amplitude; B: breite Gauß; $B_2=k*B_1$ + +| Pass | Beschreibung | Vorraussetzung | +| -- | -- | -- | +| Tiefpass | Grenzfrequenz umso höher je kleiner B¹ | $m_2=0$ $m_1\not=0$ $B_1\not=0$ | +| Hochpass | Grenzfrequenz umso höher je kleiner B² | $m_2\not=0$ $B_1\rightarrow 0$ $B_2\not=0$ | +| Bandpass | Mittelwertunterdrückung, On-Zentrum | $K>1$, $m_1>m_2$, $m_1B_1 = m_2B_2$ | +| Bandpass | Off-Zentrum | $k>1$, §m_1< m_2$ | + +$y_i=\sum_{j=1}^N K_{Sij}*x_j + \sum_{j=1}^N K_{Hij}*x_j$ +$K_{Sij} \in [0,1]$ Streuung +$K_{Hij} \in [-1,1]$ Hemmung + +# Neuronenmodelle +## Statische Modelle +### McCulloch & Pitts +$y=\sum_{j=1}^N \omega_j x_j -s = z$ +kein Lernen, keine Erklärung für Fehlertoleranz + +### statisches Neuronenmodell +$y=f(\sum_{j=1}^N \omega_jx_j -s) = f(z)$ +Modellvereinfachung: Ratenmodell: Impulsfrequenz als analoge mittlere Feuerrate (keine Spikes) + +## Dynamische Modelle +Approximation der Gewichtsfunktion als Alpha-Funktion, Trägheitsverhalten realisiert. +Vereinfachung der Alphafunktion: Anstieg nicht wichtig, nur verzögerter Abfall eventuell mit Überlagerung +$g(i)=\frac{t*e}{t_{peak}} e^{\frac{-t}{t_{peak}}} \Rightarrow g(i)=\frac{1}{\tau}e^{\frac{-t}{\tau}}$ + +## Integrate & Fire Modelle +Eingänge werden summiert, mit Schwelle verglichen und bei Überschreiten wird Spike erzeugt +- Zeit zwischen Stimulus und 1. Spike von Interesse +- Phasenlage zwischen ............. und Hintergrund-Oszillation +- Korrelation/Synchronität: Spikes anderer Neuronen als Referenz + +# Lernen und Gedächtnis +## phyletisches Gedächtnis +Artgedächtnis, angeborenes, primär sensorische und motorische Bereiche der Hirnrinde, in grober Verschaltung des stammgeschichtlich älteren Teils schon bei der Geburt als Essenz der wichtigsten Erfahrungen angelegt - Extrakt der Anpassungsleistung der Art + +## individuelles Gedächtnis +Baut auf phyletischem Gedächtnis auf, Sitz im Assoziationscortex, evolutionär spätere, höhere Komplexität der Netzwerke, entwickelt sich während der ganzen Kindheit und auch noch bei Erwachsenen + +## prozedurales Wissen +Erwerb von Verhaltensweisen "gewusst wie" sensomotorische Intelligenz + +## deklaratives Wissen Erwerb von Wissen "gewusst was" kognitive Intelligenz \ No newline at end of file diff --git a/Neuroinformatik.md b/Neuroinformatik.md index 2b7280c..1d787ce 100644 --- a/Neuroinformatik.md +++ b/Neuroinformatik.md @@ -1,881 +1,881 @@ -# NeuroInformatik -Die Lehrveranstaltung vermittelt das erforderliche Methodenspektrum aus theoretischen Grundkenntnissen und praktischen Fähigkeiten zum Verständnis, zur Implementierung und zur Anwendung neuronaler und probabilistischer Techniken des Wissenserwerbs durch Lernen aus Erfahrungsbeispielen sowie zur Informations- und Wissensverarbeitung in massiv parallelen Systemen. Sie vermittelt sowohl Faktenwissen, begriffliches und algorithmisches Wissen. - -Inhaltsübersicht -- Intro: Begriffsbestimmung, Literatur, Lernparadigmen, Haupteinsatzgebiete, Historie -- Neuronale Basisoperationen und Grundstrukturen: - - Neuronenmodelle - - Netzwerkmodelle -- Lernparadigmen und deren klassische Vertreter: - - Unsupervised Learning - - Reinforcement Learning - - Supervised Learning -- Moderne Verfahren für große Datensets - - Deep Neural Networks - -Exemplarische Software-Implementationen neuronaler Netze für unüberwachte und überwachte Lern- und Klassifikationsprobleme (Fokus auf Python). Die Studierenden erwerben somit auch verfahrensorientiertes Wissen, indem für reale Klassifikations- und Lernprobleme verschiedene neuronale Lösungsansätze theoretisch behandelt und praktisch umgesetzt werden. Im Rahmen des Pflichtpraktikums werden die behandelten methodischen und algorithmischen Grundlagen der neuronalen und probabilistischen Informationsverarbeitungs- und Lernprozesse durch die Studierenden mittels interaktiver Demo-Applets vertieft und in Gesprächsgruppen aufgearbeitet. - - -[comment]: <> (Vorlesung 1) -# Intro -## Was ist Künstliche Intelligenz (KI) ? -- Künstliche Intelligenz (KI, englisch Artificial intelligence - AI) ist ein Teilgebiet der Informatik, welches sich mit der Automatisierung intelligenten Verhaltens und dem Maschinellen Lernen befasst. Der Begriff ist nicht eindeutig abgrenzbar, da es bereits an einer genauen Definition von „Intelligenz“ mangelt. (Quelle: Wikipedia) - -bezeichnet den Versuch, bestimmte Entscheidungsstrukturen des Menschen nachzubilden, indem z. B. ein Computer so programmiert wird, dass er relativ eigenständig komplexe Probleme bearbeiten kann. -- Begriff wurde erstmals 1956 vom amerikanischen Informatiker John McCarthy verwendet, der ihn im Projektantrag für die Dartmouth-Konferenz 1956 gebrauchte (Präsentation von Programmen, die Schach und Dame spielten, Theoreme bewiesen sowie Texte interpretierten) - -## Starke vs. Schwache KI -- Schwache KI (Narrow AI): - - zielt darauf ab, konkrete Anwendungsprobleme des menschlichen Denkens und Handelns zu lösen - - Fähigkeit aus Beobachtungen zu lernen ist integraler Bestandteil - - zielt auf die Simulation intelligenten Verhaltens mit Mitteln der Mathematik & Informatik, aber NICHT auf die Schaffung von Bewusstsein oder auf ein tieferes Verständnis von Intelligenz -- Starke KI: - - zielt auf die Schaffung von eigenständigem, maschinellem Bewusstsein und Gewinnung eines Verständnisses von Intelligenz - - muss nicht Gemeinsamkeiten mit dem Menschen haben, wird vermutlich eine andersartige kognitive Architektur aufweisen (Quelle: Wikipedia) - -## Wesentliche Methoden / Konzepte: -- Symbolische Verfahren: Top-down Ansatz (von begrifflicher Ebene): expertenwissen in system packen -- Subsymbolische/Neuronale Verfahren: Bottom-up Ansatz von Daten: nutzt daten in denen "wissen" steckt und lasst durch viele daten richtige entscheidungen (beobachten) enstehen -- Simulationsmethode: simuliert kognitive Prozesse des Menschen -- Phänomenologische Methode: arbeitet rein ergebnisorientiert - -## Techniken der KI -1. **Suchverfahren** z.B. zur Wegfindung (Dijkstra, A*, D*, E*, …) -2. **Planungsverfahren** zur Erstellung optimaler Aktionsfolgen zum Ziel -3. **Optimierungsverfahren** z.B. Hill Climbing, Evolutionäre Algorithmen, Partikelschwarmoptimierung -4. **Logisches Schließen** - − formalisiertes menschliches Wissen (z.B. in Ontologien) - − Induktion: Verallgemeinerung von Beispielen zu Regeln, häufig mit Maschinellem Lernen - - In symbolischen Systeme: Beispiele als auch die induzierten Regeln sind explizit repräsentiert - - In subsymbolischen Systemen: berechenbares Verhalten wird „antrainiert“, erlaubt jedoch keinen/nur schwer Einblick in die erlernten Lösungswege -5. **Approximationsmethoden** aus einer Menge von Daten eine allgemeine Regel ableiten (z.B. Neuronale Netze, Deep Learning) - -## Was ist Maschinelles Lernen? -- Oberbegriff für die „künstliche“ Generierung von Wissen aus Erfahrung - - Ein künstliches System lernt dabei aus Trainingsbeispielen und kann nach Beendigung der Lernphase verallgemeinern. - - Es lernt also nicht einfach die Beispiele auswendig, sondern erkennt Gesetzmäßigkeiten (Regularitäten) in den Lerndaten. - - So kann das System dann auch unbekannte Daten beurteilen. -- Breites Spektrum möglicher Anwendungen in: Diagnoseverfahren, Aktienkursanalyse, Bild- und Sprachverarbeitung, Robotik, Spielstrategien,… -- Art und Mächtigkeit der Wissensrepräsentation: - - symbolisch: Wissen (Beispiele, induzierten Regeln) explizit repräsentiert - - subsymbolisch: Wissen implizit repräsentiert - berechenbares Verhalten wird antrainiert, erlaubt aber kaum Einblick in die erlernten Lösungswege - -## Wichtige Paradigmen des Maschinellen Lernens -Informationsverarbeitungsniveau zu Systemwissen -| \ | **symbolisch** | **subsymbolisch (numerisch)** | -| -------------------------------------------- | :------------: | :---------------------------: | -| explizit strukturiert (regelbasiert) | KI-Systeme | Fuzzy Systeme | -| implizit unstrukturiert (durch lernprozesse) | - | Neuronale Systeme | - - -## Was ist Neuroinformatik -Neuroinformatik – das interdisziplinäre Forschungsgebiet zu den -- am biologischen Vorbild orientierten, -- nicht explizit programmierten aber -- lernfähigen und sich adaptierenden Systemen, die -- ihre eigenen, internen „Algorithmen“ -- in Reaktion auf und in Wechselwirkung mit ihrer sensorisch (visuell, taktil, akustisch, usw.) vermittelten Umwelt entwickeln. -= Neural Computing, Konnektionismus, New AI, Brain-like Computing, Deep Learning -*Ziel*: Entwicklung von Maschinenintelligenz durch Nachbildung biologischer Informationsverarbeitungs- und Lernprozesse auf neuronalem Niveau - -[comment]: <> (Vorlesung 2) -## Erste wichtige Grundlagen -### Lernparadigmen -#### Unsupervised Learning (Unüberwachtes Lernen) -Für eine gegebene Menge von Daten wird ohne Lehrer ein Modell, gelernt, das die Daten in kompakter Weise beschreibt . Wichtiges Teilgebiet: Cluster-Verfahren, die die Daten in mehrere Kategorien einteilen, die sich durch charakteristische Muster unterscheiden. - -#### Reinforcement Learning (Verstärkungslernen) -Algorithmus lernt durch Belohnung und Bestrafung eine Taktik, wie in potenziell auftretenden Situationen zu handeln ist, um den Nutzen für den Agenten (Steuerung, Roboter, Spielprogramm) zu maximieren. - -#### Supervised Learning (Lernen mit Lehrer) -Erlernen einer Abbildungsfunktion aus gegebenen Paaren von Ein- und Ausgaben. Während des Lernens stellt ein „Lehrer“ den korrekten -Sollwert zu einer Eingabe bereit. Wichtiges Teilgebiet: automatische Steuerung oder Klassifizierung - -### Einsatzgebiete -#### Klassifikation/Kategorisierung -Zweck: auf Basis von diskret gelabelten Trainingsdaten $x = {(x_1, y_1), (x_2,y_2), ...,(x_n, y_n)}$ soll eine unbekannte, meist nichtlineare Beziehung zwischen den Inputdaten $x_i$ und den Klassenlabeln $y_i$ gelernt werden. Daten entstammen einer unbekannten, Daten generierenden Funktion, deren Funktionsoutput nur diskrete Werte annehmen kann. - Zu beachten! prinzipielle Separierbarkeit des Klassifikationsproblems linear nichtlinear nicht separabel - Einsatzfelder: -- Detektionprobleme (Personen, Gesichter, ...) -- Klassifikationsprobleme (Handschrift, Posen, Gesten, Mimik, Krankheiten, Pflanzen, Tiere, ...) -- Übung: Schwertlilie - -#### Funktionsapproximation / Regression -- Zweck: auf Basis von reelwertig gelabelten Trainingsdaten $x = {(x_1, y_1), (x_2,y_2), ...,(x_n, y_n)}$ soll eine unbekannte, Daten generierende Funktion approximiert werden, deren Funktionsoutput kontinuierlich (reell) ist. -- Lösungsansatz (Idee): jede stetige, mehrdimensionale und nichtlineare Funktion ist durch Überlagerung von Aktivierungsfunktionen mehrerer Neuronen beliebig genau approximierbar -- Einsatzfelder: - - Abbildung hochdimensionaler Inputs auf niedrig-dimensionale kontinuierliche Outputs (z.B. Navigation bei ALVINN) - - Zeitreihenprognose - - Neurocontrol - - Übung: Regression von Wohnhauspreisen - - Trainingsziel: Erlernen der durchschnittlichen Wohnungspreise aus 13 hinterlegten Merkmalen - - Grundlage bildet Sinusfunktion mit überlagertem Rauschen - - 40 Datenpunkte aus Sinusfunktion y=sin x; diese wurden mit Rauschen überlagert y=sin x + noise - - nach Training: reellwertige Ausgabe für beliebige Inputs x möglich - -#### Clusterung bzw. Clusteranalyse -Zweck: strukturentdeckende Analyseverfahren zur Ermittlung von Gruppen (Clustern) von Daten, deren Eigenschaften markante Ähnlichtkeiten aufweisen. Variante des Klassifikationsproblems, nur schwieriger, da die Trainingsdaten hierbei ungelabelt sind. -Hauptanwendungsfelder: -- Gruppenbildung über Daten allgemein -- Datenvisualisierung -- Suche in Datenbanken und Web -- Bildsegmentierung (Video, CT, MRI, …) -- Clustering von Genom Daten -Typ. Vertreter: -- k-Means Algorithmus -- SOFM, Neural Gas -- Expectation-Maximization (EM)-Algorithmus -- Fuzzy C-Means, Mean Shift - -### Einordnung in das Mustererkennungsparadigma -Wichtiger Hinweis: Dies ist das klassische Mustererkennungsparadigma. -Messdaten (Signale, Bilder) aus Sensorik kommt in Problemabhängige und Netzwerkbezogene Datenaufbereitung: -1. Problemspezifische - - Vorverarbeitung - -Schwellwertoperationen - - Filterung - - Inter- /Extrapolation - - Normierungen & Korrekturen - - Segmentierung -2. Merkmalsextraktion - - Merkmalsgewinnung - - Merkmalstransformation - - Skalierung/Normierung - - Unterraumprojektion (Dimensionsreduktion) - - Quellenseparierung - - Merkmalsselektion - - Signifikanzanalyse -3. Netzwerkein- und ausgabekodierung -Die Ausgabe wird auf Klassifikation, Funktionsapproximation oder Clusterung übertragen - -## Historische Entwicklungen -### Nachweis von Einzelneuronen (1905) -Der spanische Neuroanatom Santiago Ramon y Cajal konnte mittels der Golgi-Färbung erstmals nachweisen, dass das Gehirn aus einzelnen, getrennten Zellen (Neuronen) besteht. -Danach wurde eine strukturelle Vielfalt der Neuronentypen entdeckt (30-40 versch Zelltypen), unter anderem Purkinje-, Pyramiden- oder spindelförmige Zellen. - -### Das Hebb'sche Korrelationslernen (1949) -Die synaptische Kopplung zwischen zwei Neuronen ist plastisch und ändert sich proportional zur Korrelation der Aktivitäten des Sender- und des Empfängerneurons, d.h. der prä- und postsynaptischen Aktivitäten. - -$w_{ij}(t+1) = w_{ij}(t) + \Delta w_{ij}(t)$ (Lernen über die Zeit) -$\Delta w_{ij} = \eta * y_i(t)*x_{ij}(t)$ (Das $x_ij$ ist Aktivität des Eingangsneuron, $y_i$ die Aktivität des Empfängerneurons) - -| $y_i/y_j$ | 0 | 1 | -| 0 | 0 | 0 | -| 1 | 0 | + | - -### Erste einfache Neuronenmodelle -In Knoten laufen Informationsprozesse verschiedener Synapsen ein. Diesen Synapsen sind Gewichtungen vorgegeben. Der Knoten bildet aus den gewichteten Eingängen über eine Gesamteingabe und Transferfunktion die Ausgabeakivitäten. Synapsen können Signale nicht verstärken, nur schwächen! - -### Grundstruktur und Lernprinzip eines Multi Layer Perzeptons (MLP) -- Input Layer nehmen Grundfunktion hne Bias auf -- Hidden Layer (1.Schicht) verknüpfen die Input Layer und bewerten mit Bias (bildet Scalarprodukt seiner gewichteten Eingangsinputs). Ermöglicht mathematische Operationen. Wird als Synaptische Matrix bezeichnet -- Output-Layer (2. Schicht) verknüft Ausgangsprodukte der Hidden Layer mit einem eigenem Bias und erstellt selbst Vektoren - -Bsp: 5 Hidden Neuronen + 1 Hidden Bias Neuron + 2 Output Neuronen + 1 Output Bias Neuron = 12 Neuronen/Gewichte -Teach Vektor t: $d = t -y$ -Abbildungsfelder (als skalare Größe): $E=||d||^2$ wird verwendet um Fehler zu minimieren oder zu verhindern -Skalarer Abbildungsfehler (Loss Funktion) wird nach fälschlichen Gewichten abgeleitet: $\frac{\delta E}{\delta w_{ij}} \rightarrow \Delta W^1$ - -### Erlernen der Navigation mittels Expert Cloning -- Kopieren der situationsabhängigen Fahrstrategie eines/mehrerer geübter Fahrer in ein Neuronales Netz -- Nutzung der Approximations und Verallgemeinerungsfähigkeit des Netzes zur Navigation in unbekannten Situationen -- realisiert eine hochkomplexe, nicht explizit algorithmisch fassbare neuronale Funktionsapproximation $\rightarrow$ End-to-End Learning - -$\phi = f(x(t))$ - -#### ALVINN – Prinzipielle Vorgehensweise -1. Vorführphase: - - Experte(n) steuert Fahrzeug entlang einer Anzahl repräsentativer Trajektorien, die die gewünschte Fahrstrategie implizit beschreiben (Beachte: nur mittels der Kamerabilder) $\rightarrow$ bei untersch. Witterungs-, Beleuchtungs- & Straßenverhältnissen - - Synchrone Aufzeichnung der aktuellen Szenenansichten $x(t)$ und des vom Experten gewählten Lenkwinkels $\phi(t)$ - - Vorteil: Datensatz enthält auch die durch Fahrzeugkinematik und sonstige Einflüsse (Straßen-/Reifenzustand) bestimmten Restriktionen während der Fahrt -2. Trainingsphase: - - Approximation der Abbildungsfunktion $\phi (t)=f(x(t))$ mittels Supervised Learning - - Generalisierung von bekannten Trainingssituationen auch auf unbekannte neue Straßenverläufe -3. Recallphase: - - Nachahmung der vom Experten in der Vorführphase verfolgten Fahrweise $\rightarrow$ Experten-Cloning - - topologische Ausgabekodierung $\rigtharrow$ Fuzzyfikation des Lenkwinkels - -- Neuronen fungieren als Detektoren für ganze Straßenverläufe mit verschiedenen Orientierungen oder für die linke bzw. rechte Straßenkante. -- Ein Einzelneuron allein kann die Lenkung nicht korrekt steuern, erst die kollektive Aktivierung aller Neuronen (mit richtigen und falschen lokalen Hypothesen) ermöglicht die feinabgestimmte Steuerung des Fahrzeugs. - -### Überwachtes Lernen als Optimierungsproblem – die „Support Vector Machine“ -- aus der statistischen Lerntheorie hervorgegangenes Lernverfahren -- zur Lösung von Klassifikationsproblemen entwickelt (Vapnik, 1995) -- später auch für Funktionsapproximation/Regression eingesetzt (Vapnik et al., 1997) -- allgemein bessere Generalisierungsfähigkeiten als damals bekannte neuronale Netze, weil ... - -| Neuronales Netz | Support Vector Machine (SVM) | -| ------------------------------------------------------- | ---------------------------------------------------------------------------------------- | -| Training – als Gradientenabstieg über dem Fehlergebirge | Training – als Lösung eines quadratischen Optimierungsproblems mit konvexer Zielfunktion | -| $\rightarrow$ kann in lokalem Minimum enden | $\rightarrow$ sichert Konvergenz zum globalen Minimum | - -#### SVM Grundidee -- Trainingsmuster in Form von Vektoren, die einer von zwei Klassen angehören -- Ermittlung einer optimalen Hyperebene H (Trenngerade, Trennebene), so dass diese - 1. die Trainingsmuster korrekt trennt und dabei - 2. einen möglichst großen Abstand zu den äußeren Datenpunkten der jeweiligen Klasse aufweist -- Der minimale Abstand zwischen der Trennebene und dem nächsten Trainingssample wird als Margin bezeichnet und soll maximal werden $\rigtharrow$ Forderung zur Erzielung guter Generalisierungsleistungen -- Ziel des Algorithmus: Finden einer optimal gelegenen Hyperebene H, bei der der Margin maximal wird $\rightarrow$ erfordert Lösung eines Optimierungsproblems - -[comment]: <> (Vorlesung 3) -### Deep Learning -Konzept und Lernverfahren, das seit etwa 2010 alle Rekorde (Computervision, Sprachverstehen, Robotik, Spielstrategien) in der künstlichen Intelligenz bricht. Kombiniert eigentlich alte Verfahren (neuronale Netze) mit -1. gewaltigen Datenmengen und -2. massiv paralleler Rechenpower $\rightarrow$ Schlüssel zum Erfolg -Im Kern ein unüberwachtes Verfahren für tiefe neuronale Netze zum Lernen von hierarchischen Features der Eingabedaten für schwierigste Klassifikationsaufgaben. - -#### Typische Netzwerkstruktur -Neuronales Netzwerk für Schadstellendetektion -- bis zu 1000 Schichten -- mehrere Mio. freie Parameter (Gewichte), die alle zu trainieren sind -- Einsatz neuartiger Techniken beim Training: Regularisierung, Dropout, Weight Decay, Batch Normalization, usw. - -#### Motivation für Deep Learning -> „Hunderte von Entwicklern und Studenten verbrachten Jahrzehnte damit, per Hand all -die Regeln einzutippen, die Computer brauchen könnten, um Gegenstände anhand ihrer -Merkmale zu unterscheiden“ -> „Sich Merkmalssätze auszudenken, ist schwierig, zeitaufwändig und verlangt nach viel -Fachwissen, da muss man sich natürlich die Frage stellen: Gibt es keinen besseren -Weg?„ (A. Ng, Stanford Univ. / Baidu Research / Coursera ) - -Probleme: -- Design des Merkmalsraumes per Hand: - - erfordert viel Hintergrundwissen über das Klassifikationsproblem und ist zeitintensiv - - Wiederkehrendes Problem: neue Objektklassen benötigen eventuell neue Merkmalsräume -- Meist nur ungelabelte Bilder verfügbar: - - viele Anwendungen haben keine oder kaum gelabelte Daten (z.B. Facebook-Fotos) - - Bilder haben hohen Informationsgehalt $\rightarrow$ auch ohne Label ist viel Information über die betreffende Klasse enthalten - -Ausweg: Deep Learning -- Wesen: - - Lernen von hierarchischen Features der Eingabedaten - - Jede Schicht lernt immer komplexere Features ausgehend von den Features der letzten Schicht -- Vorab-Design der Features ist damit nicht mehr erforderlich -- Direkte Ausnutzung von ungelabelten Daten durch unüberwachtes Lernen -- Bekannte Netzwerkarchitekturen: - - Covolutional Neural Networks (CNN) - - Stacked Auto-Encoder (SAE), Long Short-term Memories (LSTM), ... -- Netzwerkarchitekturen unterstützen auch überwachtes Lernen $\rightarrow$ damit auch Kombination von unüberwachtem mit überwachtem Lernen möglich - -#### Grundidee von Deep Learning -- Phase 1: Unüberwachtes Lernen der Feature-Hierarchie über den Bildern aller Kategorien (unüberwacht – da noch ohne Klassenlabels!) -- Phase 2: Überwachtes Fein-Tuning des Netzes – nun mit gelabelten Daten - -- erste Schicht: orientierte Kanten -- zweite Schicht: Objektteile -- Höhere Schichten: Ganze Objekte - -#### Deep Learning auf GPUs -- CPU: spezialisierte Kerne, für serielle Verarbeitung optimiert -- GPU: einfache Kerne, für parallele Verarbeitung optimiert -- Deep-Learning-Operationen sind meist einfache und leicht parallelisierbare Rechenoperationen (Add. und Mult.) -$\rightarrow$ Nutzung der GPU (z.B. Faltungen in CNN) -Beschleunigung des Lernens um Faktor 20-100 (statt 4 Wochen auf CPU $\rightarrow$ 1 Tag) - -#### “Challenges” beim Deep Learning -- Rolle der verwendeten Daten - gelernte Modelle können “biased” sein - - Beispiel: Gesichtserkenner von Microsoft, IBM, Face++ - - Männl. Gesichter (8,1 % Fehlerrate (FR)) besser erkannt als weibliche (20,6 % FR); Gesichter mit heller Hautfarbe besser erkannt (11,8 % FR) als Personen mit dunkler (19,2 % FR) $\rightarrow$ funktionierten am besten mit männl. Personen heller Haut - - Vermutung: Trainingsdatensatz bestand überproportional aus männlichen Gesichtern mit heller Hautfarbe -- Instabilität bei speziellen Rauschmustern - ”Adversarial Attacks” - - Adversarial Examples sind manipulierte Eingaben (Bilder, Sprache) mit der Fähigkeit, ein Deep Neural Network (DNN) zu täuschen, so dass das DNN die Eingabe falsch kategorisiert. - - Manipulation der Eingabe erfolgt meist durch spezielle Rauschmuster. - - Für den menschlichen Betrachter ist das Rauschen aber völlig irrelevant, hat keinen Einfluss auf die Erkennung. - -##### Adversial Attacks -Motivation: korrekt klassifizierte Bilder so verändern, dass das DNN das veränderte Bild einer falschen Klasse zuordnet, die Veränderung aber für einen Menschen nicht sichtbar ist. Böswilliger Einsatz: -- Täuschung sicherheitskritischer Systeme -- Google Bildersuche: Platzieren von eigenen Angeboten bei beliebten Suchbegriffen -- Manipulation von Assistenzsystemen beim Autonomen Fahren (z.B. Stoppschild als Vorfahrtsschild erkannt) - -# Neuronale Basisoperationen und Grundstrukturen -## Wichtige Neuronenmodelle -### Vorbild: Biologisches Neuron -Neuron: Erregungserzeugender, -leitender und –verarbeitender Grundbaustein des Nervensystems $\rightarrow$ elementarer cortikaler Prozessor. Kommunikation mittels elektr. Impulse (Aktionspotentiale, Spikes), die an Synapsen (Kontaktstellen zwischen zwei Neuronen) in Form chemischer Signale ( Neurotransmitter) weitergeleitet werden. -Wesentliche Informationen sind in -- der Spikerate (Dichte) -- dem Spikezeitpunkt (Phasenlage) -- der Effektivität der synaptischen Verbindung - -#### Struktur und Funktion der wesentlichen Neuronenabschnitte -| Neuronenabschnitte | Informationstechnische Funktion | -| ------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| 1. Synapsen | Gerichtete Informationsübertragung & -speicherung
(Adaptive Analogschalter; D/A-Wandlung der präsynaptischen Spikefolgen in analoge Membranpotentiale) | -| 2. Dendrit | Räumlich-zeitliche Integration & Weiterleitung
(Nichtlineare räumlich-zeitliche Überlagerung der lokalen dendritischen Membranpotentiale; Weiterleitung der lokalen Membranpotentiale (mit Verlusten, Verzögerungen und Laufzeiteffekten)) | -| 3. Soma | Globale räumlich-zeitliche Integration
(Integration aller dendritischen Potentiale zum Soma-Membranpotential) | -| 4. Axonhügel | Störsichere Umkodierung
(A/D-Wandlung des Somapotentials in Spikefolgen; Informationskodierung in Spikerate & Spikezeitpunkt) | -| 5. Axon | Informationsweiterleitung & -verteilung
(sichere, verlustfreie und energieoptimale Weiterleitung; aktive räuml.-zeitliche Umkodierung) | - -#### Das biologische Neuron aus informationstechnischer Sicht -Räumliche Kodierung (Position) $\rightarrow$ Kodierung von Qualitäten (Reizarten) - -Zeitliche Kodierung (Spikedichte, -phase) $\rightarrow$ Kodierung von Quantitäten (Reizintensität) und Synchronisation - -| Axonendigung | Synapse/Dendrit | Soma | Axonhügel/Axon | -| ------------------ | ------------------ | ------------------ | ------------------ | -| zeitkontinuierlich | zeitkontinuierlich | zeitkontinuierlich | zeitkontinuierlich | -| wertediskret | werteanalog | werteanalog | wertediskret | - -#### Abgeleitete Neuronenmodelle -- bislang zahlreiche Neuronenmodelle mit unterschiedlicher Biologietreue und Komplexität entwickelt -- wichtigste Vertreter mit abnehmendem Biologiebezug ↓ aber zunehmender Praxisrelevanz ↑ sind: - 1. Compartment Modell Neuronen (hier nicht weiter behandelt) - 2. Integrate & Fire Neuronen - 3. Dynamische Ratenneuronen (Leaky Integrator) - 4. Statische Ratenneuronen -- bei diesen Neuronenmodelle Vernachlässigung verschiedener biologisch relevanter Aspekte, wie z.B.: - - reale Geometrie des Neurons (mit seinen Verästelungen im Dendriten/Axon) - - Leitungsverzögerungen an den Synapsen und im Dendriten - - nichtlineare Wechselwirkungen zwischen den postsynaptischen Potentialen (PSP) - - der realen Form der präsynaptischen Aktionspotentiale $\rightarrow$ Annahme von Dirac-Impulsen ( δ(t)=1, wenn t = t spike ; δ(t)=0, wenn t ≠ t spike ) - - der realen zeitlichen Funktionalität des Neurons $\rightarrow$ wird komplett in die Synapse verlagert - -### Das Integrate & Fire (I&F) Neuron -- Kommunikation zwischen Neuronen erfolgt über Spikes (zeitkontinuierlich, wertediskret) -- Verarbeitung innerhalb des Neurons erfolgt analog auf Potentialniveau (zeitkontinuierlich, wertekontinuierlich) -- Spikekodierung stellt die Zeit als zusätzliche Kodierungsdimension für neuronale Wahrnehmungsprozesse zur Verfügung: - 1. zeitlicher Abstand von Ereignissen in Bezug zu anderen Ereignissen $\rightarrow$ Phasenlage - 2. Häufigkeit der Ereigniswiederholung $\rightarrow$ Frequenz - 3. Zeitverlauf der Änderung von Aktivitätsparametern $\rightarrow$ Frequenzänderung - -Zeitliche Synchronisation mit I&F-Neuronen -- Gehirn scheint zeitliche Synchronisationsprozesse von Einzelspikes oder Bursts (Spikepakete) als ein Attributierungsmittel zu nutzen -- „virtuelle“ Kopplung zusammengehöriger Neuronen durch zeitliche Phasensynchronisation ihrer Aktivitäten auch über große räumliche Entfernungen -- damit Kennzeichnung der Neuronen eines „Perzepts“ durch synchrones, korreliertes Feuern – Neuronen anderer „Perzepte“ feuern zu diesen unkorreliert $\rightarrow$ „Correlation Theory of Brain Function“ - -Technische Umsetzung von I&F-Neuronen -- präsynaptische Spikes erzeugen gewichtete postsynaptische Potentiale (PSP) -- PSPs werden zeitlich und räumlich integriert $\rightarrow$ Somapotential -- wenn Somapotential >= Schwelle $\rightarrow$ Generierung eines Spike (Aktionspotential) -- Afterhyperpolarisation (AHP) hemmt für bestimmte Zeit weiteres Feuern - -Typische Einsatzfelder von I&F-Neuronen -- in der Computational Neuroscience, wo sie zur systematischen Untersuchung von Gehirnfunktionen verwendet werden -- oft auch für mathematische Analysen von Gehirnfunktionen verwendet -- oft in Simulationen von Neuronalen Netzwerken eingesetzt, da sie durch ihre Einfachheit auch bei großen Netzen mit vielen Neuronen nur wenig Rechenzeit verbrauchen - -[comment]: <> (Vorlesung 4) -### Das formale dynamische Ratenneuron (Leaky Integrator) -- Ein- und Ausgänge werden interpretiert als zeitveränderliche mittlere Spikefrequenzen bzw. Spikeraten -> dynamisches Ratenneuron -- „Leaky Integrator“ steht für einen verlustbehafteten Integrator -- Approximation der Vorgänge an der Synapse (Gewichtsfunktion) als einfache Exponentialfunktion - -#### Aktivierungs- bzw Zustandsfunktion $z(t)$ -- zeitliche Summationseffekte werden vollständig in die Synapsen verlagert -- Annahme identischer Gewichtsfunktionen g(t) in allen Synapsen -- Somapotential (Aktivierung/Zustand) z(t) ergibt sich durch räumliche Summation aller lokalen PSPs $z_i(t)=\sum_{j=1}^1 w_{ij}(x_j(t)*g(t))$ -- Zeitverhalten des Neurons kann im einfachsten Fall beschrieben werden durch eine lineare DGL 1. Ordnung (ohne Herleitung hier): $\tau * z'_i(t)=-z_i(t) + \sum_{j=1}^1 w_{ij}x_j(t)$ - -#### Die Ausgabefunktion $y = f(z)$: -- dient der Umsetzung der internen Aktivierung zi(t) in eine mittlere Output-Spikefrequenz yi(t) -- erfolgt meist in einem nichtlinearen Zusammenhang, da Nachbildung - - einer unteren Schwelle erforderlich, die überschritten werden muss, um ein Neuron überhaupt zum Feuern zu veranlassen - - einer oberen Schwelle erforderlich, die eine maximale Spikefrequenz wegen der vorhandenen Refraktärzeiten modelliert -- Zusammenhänge werden durch nichtlineare Ausgabefunktionen, berücksichtigt, wie z.B. die Fermifunktion (-> Ausgabefunktionen) - -#### Typeische Einsatzfelder -- **Neuronale Oszillatoren** zur zeitlichen Synchronisation von Erkennungsvorgängen -- **Rekurrente Neuronale** Netze zur Speicherung und Erkennung zeitlicher Zusammenhänge - -### Das formale statische Ratenneuron -- Abgeleitet vom dynamischen Ratenmodell - vollständige Vernachlässigung der zeitlichen Funktionalität des Neurons, insbes. der dynamischen Übergangsvorgänge an den Synapsen -- formales statisches Neuron ist dynamisches Neuron im stationären Zustand, d.h. Vernachlässigung der zeitlichen Übergänge infolge Änderungen des Inputs -- Ein- und Ausgänge werden interpretiert als statische mittlere Spikefrequenzen bzw. Spikeraten -> Ratenneuron - $$z_i = \sum_{j=1}^n w_{ji}*x_j$$ -- Einsatz in vielen neuronalen Standardnetzen (z.B. Multilayer Perzeptron - MLP) -- Modell ist für eine biologienahe Modellierung allerdings zu grob - -#### Die Aktivierungs- bzw. Zustandsfunktion -Definition: Lineare oder nichtlineare Abbildungsvorschriften des Eingabevektors x über den Gewichtsvektor $w_i$ auf die Aktivierung $z-i$ des Neurons i - -##### Distanzbasierte Aktivierungen - lokal operierende Aktivierungsfunktionen -Vektornormen: - - Allgemeine p- bzw L-Norm von d: $||d||_p = (\sum_{j=1}^n |d_j|^p)^{\frac{1}{p}}$ - - Betragssummennorm bzw. Manhatten-Norm (L = p = 1): $||d||_1 = \sum_{j=1}^n |d_i|$ - - Euklidische Norm (L = p = 2): $||d||_2 = \sqrt{\sum_{j=1}^n |d_j|^2}$ - - Maximumnorm (L = p = $\infty$): $||d||_{\infty} = max |d_j|$ - -- Euklidische Distanz $z_i(w_i,x)=||x-w_i||$ -- Maximum Norm $z_i(w_i,x)=max|x_j - w_{ij}|$ -- Minimum Norm $z_i(w_i,x)=min|x_j - w_{ij}|$ -- Mahalanobis Distanz $z_i(x,w_i,C_i)= \sqrt{(x-w_i)^T * C_i^{-1} * (x-w_i)}$ mit $w_i=\frac{1}{N}\sum_{p=1}^N x^{(p)}$ und $C_i= \frac{1}{N}\sum_{p=1}^N (x^{(p)} - w_i)(x^{(p)}- w_i)^T$ - -**Mahalanobis Distanz** -- statistisch korrigierte Euklidische Distanz des Vektors x von einem Schätzmodell der Klasse (beschrieben durch w und C) -- w: Mittelwertvektor aller N zur Klasse gehörenden Inputvektoren x(p) der Lernstichprobe -- C: Kovarianzmatrix aller N zur Klasse gehörenden Inputvektoren x(p) der Lernstichprobe, (für mittelwertfreie Inputvektoren wird aus der Kovarianzmatrix die Korrelationsmatrix) - -**Zusammenfassung** Wichtige Aktivierungsfunktionen für Neuronale Netze -- Skalarprodukt $z(x,w)=\sum_{j=1}^n x_jw_j$ -- Euklidische Distanz $z(x,w)=\sum_{j=1}^n \sqrt{\sum_{j=1}^n |x_j - w_j|^2}$ -- Maximum Distanz $z(x,w)=max|x_j-w_j|$ -- Minimum Distanz $z(x,w)=min|x_j-w_j|$ -- Mahalanobis Distanz $(x,w)=\sqrt{(x-w)^T * C^{-1} * (x-w)}$ -- Manhatten Distanz $z(x,w)=\sum_{j=1}^n |x_j - w_j|$ - -#### Die Ausgabefunktion -Grundidee: Wie verhält sich die Ausgangsaktivität $y_i=f(x,w_i)$ (mittlere Spikerate) in Abhängigkeit von der internen Aktivierung $z_i$? - -1. Identitätsfunktion $y_i=z_i$ -2. Stufenfunktion $y_i = f(z_i) = \begin{cases} 0: z_i \leq T \\ 1: z_i > T \end{cases}$ -3. Sigmoid Funktionen (Squashing functions, S-shaped functions) - - Klasse nichtlinearer, kontinuierlicher, stetiger und stetig differenzierbarer Abbildungsfunktionen - - modellieren gut neurophysiologisch beobachtbare Sättigungseffekte - - erlauben parametrische Steuerung der Ausgabefunktion (Schwelle, Steilheit) - - Fermifunktion $y_i=f(z_i,c)= \frac{1}{1+e^{-c*z_i}}$ - - Gut durch maximale Spikerate des biologischen Neurons motiviert -> bis vor wenigen Jahren sehr verbreitet - - für $c > 0$ ist $f(z)$ im gesamten DB monoton wachsend - - Vorteil - + f(z) im gesamten Definitionsbereich $z \in (-\infty, \infty)$ stetig - + f(z) ist stetig differenzierbar - - Nachteil - - Gradienten werden im "Sättigungsbereich" extrem klein - - Ausgabefunktion ist nicht 0-zentriert -> bei nicht zentrierten Daten werden Gradienten der Eingabegewichte immer alle positiv oder alle negativ - - Berechnung der e-Funktion ist rechenaufwändig - - Hyperbol. Tangens $y_i=tanh(z_i)=\frac{e^{z_i}-e^{-z_i}}{e^{z_i}+e^{-z_i}}$ - - f(z) im gesamten DB monoton wachsend - - Vorteile - + f(z) im gesamten Definitionsbereich $z \in (-\infty, \infty)$ stetig - + f(z) ist stetig differenzierbar - + Funktion ist 0-zentriert - - Nachteil - - Gradienten werden im „Sättigungsbereich“ extrem klein - - Berechnung rechenaufwändig -4. Rectified Linear Unit (ReLU) $y_i = f(z_i) = max(0,z_i)$ - - Aktivierung z wird bei 0 gekappt - - Effektive Berechnung: $y_i = f(z_i) = 0,5*z_i + 0,5 * |z_i|$ - - Vorteil - + differenzierbar - + beschleunigt die Konvergenz des Gradientenabstiegs im Vergleich zu Fermi-Funktionen um den Faktor 6 -> wegen des linearen, nicht gesättigten Verlaufs - + lässt sich sehr leicht implementieren und schnell berechnen - - Nachteil - - Ausgabefunktion ist nicht 0-zentriert - - ReLU Neuronen können während des Trainings “sterben” infolge eines starken Gradientenflusses, der zu einem solchen Gewichtsupdate führt, dass das Neuron durch keinen Input mehr aktiviert werden kann -> Ausgabe für alle Inputs 0 -> Lernen nicht mehr! - 4.1 Leaky ReLU $y_i=f(z_i)=max(0,01z_i,z_i)$ - + Neuronen können nicht „sterben“ -5. Gaußfunkion $y_i=f(z_i)=e^{-\frac{z_i^2}{2\sigma ^2}}$ Ableitung: $/frac{dy_i}{dz_i}=-\frac{1}{\sigma ^2}* z_i * y_i$ -6. Radiale Basisfunktion (RBF) $y_i=f_i(x,w_i,\sigma_i)= exp(-\frac{||x-w_i||^2}{2\sigma_i^2})=exp(-\frac{z_i^2}{2\sigma_i^2})$ - - $\sigma_i$: Breite (Standardabweichung) der Gaußverteilung des Neurons - - $w_i^T$: Mittelwertvektor von i - - Jede einzelne Radiale Basis Funktion $f_i$ definiert ein sphärisches rezeptives Feld im Merkmalsraum $R^n$ - - $w_i$ zentriert das rezeptive Feld - - $\sigma_i^2$ lokalisiert das rezeptive Feld -7. Ellipsiodale Basisfunktion (EBF) $y_i=f_i(x,w_i,C_i)=exp(-\frac{1}{2}(x-w_i)^T * C_i^{-1} * (x-w_i))$ - - für beliebige Kovarianzmatrizen des Inputdatensatzes X - - basiert auf der Mahalanobis-Distanz $d_m^2(x, w_i, C_i)$ - -[comment]: <> (Vorlesung 5) -### Das formale statische Neuron als linearer Klassifikator -**Ziel**: -1. Suche nach einer Trenngeraden (Klassengrenze), die Punktemengen trennt -2. Automatische Klassifikation unbekannter Datenpaare durch Bestimmung ihrer Lage bezüglich der Klassengrenze - -**Vorraussetzung**: Trennung der Klassen durch Gerade möglich -> lineare Seprarierbarkeit - -**Bestimmung der Trenngeraden**: -1. Geometrische Bestimmung aus der Datenverteilung -2. Belehrung des Neurons mit kategorisierten Trainingsdaten -> Lernen - -**Implementierungstrick**: zur Verschiebung der Trenngeraden aus dem Ursprung -> Einführung einer variablen Schwelle, die durch ein Bias-Neuron realisiert wird - -**Begrifflichkeit**: -- für $R^2$ -> Trenngeraden -- für $R^3$ -> Trennebenen -- für $R^4$ -> Hyperebenen -- für $R^n$ -> (n-1)-dim. Hyperebenen - -## Wesentliche Neuronentypen und deren Einsatz -1. Statisches Ratenneuron (-> Adaline Netz) - - Skalaproduktaktivierung - - Lineare Ausgabe -2. Statisches Ratenneuron (-> binäres Hopfielnetz) - - Skalaproduktaktivierung - - Binäre Ausgabe -3. Statisches Ratenneuron (-> MLP-Netzwerk) - - Skalaproduktaktivierung - - Ausgabe: Sigmoidfunktion -4. Statisches Ratenneuron (-> RBF-Netzwerk) - - Distanz- /Normaktivierungsfunktion - - Ausgabe: Gaussfunktion -5. Statisches Ratenneuron mit Zeitfenster (-> TDNN-Netzwerk) - - Skalaproduktaktivierung - - Ausgabe: Sigmoidfunktion -6. Dynamisches Ratenneuron (-> Jordan Netz) - - Skalarproduktaktivierung - - Leaky Integrator (PT1 - Verhalten) - - Ausgabe: Sigmoidfunktion -7. Integrate-and-Fire (Spiking) Neuron - - Skalarproduktaktivierung - - Leaky Integrator (PT1 - Verhalten) - - Ausgabe: Delta-Impulse (Spikes) -8. ReLu Neuron (-> Deep Neural Networks) - - Skalarproduktaktivierung - - ReLU Ausgabe - -# Neuronale Netzwerkmodelle -**Aufgabe**: Verbinde die vorhandenen Neuronen in geeigneter Weise, um ein neuronales Netz zu erzeugen -## Typische Netzwerk-Topologien und Begriffe -- homogene oder strukturierte Netzwerke -- vollständige oder partiell-verkoppelte Netzwerke -- feed-forward oder rekurrente Netzwerke -- Netzwerke mit fester oder variabler Neuronenzahl - -Fan-In: mittlere Anzahl der auf ein Neuron konvergierenden Verbindungen\ -Fan-Out: mittlere Anzahl der von einem Neuron abgehenden (divergierenden) Verbind. - -## Homogene vs. Strukturierte Netze -| Homogene Netze | Strukturierte Netze | -| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| sehr formaler und gleichmäßiger Aufbau | erlauben Integration von strukturellem Wissen über spezifische lokale Verschaltungen und lokale räumliche Zusammenhänge (z.B. bei Bildinformationen) | -| reguläre Netzwerkstruktur | zeigen damit einen stark strukturierten Aufbau | -| als feed-forward oder als rekurrente Netze | Gibt es als feed-forward oder auch als rekurrente Netze | -| spezielles strukturelles Wissen über lokale Verschaltungen wird darin nicht berücksichtigt | | -| es gibt kaum biologische Entsprechungen | | - -## Vollständig vs partiell rekurrente Netze -| Vollständig rekurrente Netze | Partiell rekurrente Netze | -| :---------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| jedes Neuron ist mit jedem anderen Neuron des Netzes verschaltet | ein Teil der Neuronen des Netzes koppelt Aktivität in das Netz zurück | -| Einsatz als Autoassoziativspeicher (siehe Kap. B-3) zur Speicherung von Mustern | typischerweise Einsatz zur Repräsentation und Verarbeitung zeitlicher Zusammenhänge in Datensequenzen (z.B. Signalverläufe, Videosequenzen) | -| erlaubt Wiedererkennung (Rekonstruktion) verrauschter oder unvollständiger Eingangsmuster | Einsatz von dynamischen Neuronen als Kontextneuronen | -| | Beispiele: Jordan/Elman Netzwerk | - -## Netze mit fester oder variabler Neuronenzahl -| Feste Neuronenzahl | Variable Neuronenzahl | -| :----------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | -| Netztopologie (Anzahl Schichten, Neuronen, Verbindungen) vorab definiert | Netztopologie (Anzahl Neuronen und Verbindungen) vorab unbekannt | -| sehr formaler Aufbau mit typischer Schichtabfolge | Netzwerk erhöht oder reduziert die Anzahl der Neuronen und Verbindungen in Abhängigkeit von datenabhängigen internen Repräsentationsfehlern | -| als feed-forward oder als rekurrente Netze | meist als als feed-forward Netze | - -## Das Multi-Layer Perzeptron (MLP) als typisches vollständig verschaltetes Feed-forward Netz - -siehe Bild - -## Convolutional Neural Network (CNN) als typisches strukturiertes Netz -- Neuronen sind so angeordnet, dass sie auf überlappende Bereiche reagieren -> realisieren Faltungen (Convolutions) -- Jede Schicht eines Volumens basiert auf gelernten Faltungskernen -> bildet sogenannte Feature Maps -- Häufig Verwendung von Subsampling-Layern (Pooling (Bündelung)), die die Dimension des Outputs reduzieren und Invarianzleistungen realisieren - -Was sind Faltungsoperationen zwischen den Schichten? -- Neuronen sind lokal verschaltet und teilen sich Gewichte - - reagieren auf überlappende Bereiche des Inputs - - kann als diskrete Faltung interpretiert werden - - Faltung ersetzt Skalarproduktaktivierung -- bilden State-of-the-Art für viele Herausforderungen im Umgang mit Bildern, dafür: - - Erweiterung auf dreidimensionale Datenstrukturen (Farbkanal, Höhe, Breite eines Bildes) - -> lokaler Zusammenhang im Bild bleibt erhalten - -### 1. Faltungs-Schichten -- Neuronen des Volumens (l) sind lokal begrenzt mit dem Vorgängervolumen (l-1) verschaltet -- Skalarproduktaktivierung -> Summe der Faltungsergebnisse über Volumen (l-1) -- Gewichte zwischen Neuronen der Feature-Map -> in Volumen (l) sind geteilt (shared) -- -> identische Verknüpfung für alle Neuronen in einer Feature-Map p -$$z^{l}(p,u,v)= \sum_{k=0}^{m^{l-1}} \sum_{i=0}{d_1-1} \sum_{j=0}^{d_2-1} o^{l-1} (k,u + i,v + j) * w^{(l)} (p,k,i,j)$$ -$$Z^{(l)}(p)= \sum_{k=0}{m^{l-1}} O^{l-1}(k)** W^l(p,k)$$ -"Teilbild I * Filter W" - - -Beispiel für Berechnung einer kompletten Output-Feature-Map -- in CNN: Summation einzelner Faltungsergebnisse -- zusätzlich: gemeinsames Bias-Gewicht 􀡮 für alle Elemente der gleichen Output-Feature-Map und lineare Ausgabe - -**Padding**: Erweitern der Input-Feature-Maps um p Randpixel (z.B. Nullen) - -### 2. Pooling-Schicht -- dient der Bündelung von mehreren semantisch ähnlichen Features zur: - - Verbesserung der Robustheit der gelernten Repräsentationen (Invarianzen) - - Reduzierung des Rechenaufwandes in den anschließenden Schichten -- Output-Volume wird sequentiell über die Ausgaben der einzelnen Feature-Maps bestimmt -- Ausgabe $O_p$ der p-ten Output-Feature-Map: $O^l_p = downsample(O_p^{l-1}, g_l)$ -> Reduktion erfolgt ohne zu lernende Parameter - -Arten Pooling-Schichten -- Max-Pooling: Bestimmung des Maximums pro Pooling-Bereich -- Average-Pooling: Bestimmung der Mittelwerte des Pooling-Bereiches - -- **Stride**: Größe der vertikalen bzw. horizontalen Verschiebung während Bündelung -- **Padding**: Erweitern des Input-Feature-Maps um p Randpixel (z.B. Nullen) - - -# Lernparadigmen und deren klassische Vertreter -## Unsupervised Learning -[comment]: <> (Vorlesung 6) -Wesen: -- Lernen ohne externe Überwachung, d.h. kein expliziter Lehrer -- Lernen erfolgt rein datengetrieben in Abhängigkeit von der Statistik der Inputdaten in der Lernstichprobe -- Beim Lernen wird der kontinuierliche Eingaberaum in eine endliche Anzahl von Zuständigkeitsgebieten (-> Voronoi-Regionen) unterteilt / geclustert. -- Dies erfolgt nicht uniform sondern in Abhängigkeit von der Wahrscheinlichkeitsdichteverteilung (WDV) der Inputdaten -$\rightarrow$ Vektorquantisierung des Eingaberaums - -Ziel des Lernens: fehlerminimale Quantisierung des kontinuierlichen Eingaberaums mittels geeignet platzierter Referenzvektoren $w_r$ in eine endliche Anzahl von diskreten Zuständigkeitsgebieten - -### Vektorquantisierung bzw. Voronoizerlegung -- Anzahl der über den Inputdaten zu positionierenden Referenzvektoren -- dichtere Platzierung in Gebieten mit hoher Inputdichte -> statistischer Lernprozess -- Verbindungslinien zwischen benachbarten Referenzvektoren -> Delaunay-Triangulation -- Regionengrenzen werden durch die Mittelsenkrechten auf diesen Verbindungslinien gebildet -> Voronoi-Tesselation -- Jedes Voronoi-Gebiet bildet eine konvexe Zuständigkeitsregion (abgeschlossen oder unbeschränkt) für den betreffenden Referenzvektor - -#### Optimale Vektorquantisierung -Im $\R^2$ erlaubt nur ein hexagonales Raster fehlerminimale Quantisierung! Suche nach den optimal platzierten Referenzvektoren $w_r$ mit ihren zugehörigen Voronoi-Regionen, die eine Quantisierung des Eingaberaumes mit minimalem Quantisierungsfehler E ermöglichen -$E = \frac{1}{N} \sum_{p=1}^{N} || x-w_{r} ||$ mit r als zuständiges Neuron - -Ermittlung der Lage der Referenzvektoren und der zugehörigen Voronoi-Regionen über unüberwachte Lernprozesse in Neuronalen Netzwerken und mit statistischen Algorithmen. - -#### Typische Vertreter -- Self-Organizing Feature Maps (SOFM) bzw. Kohonen-Maps -– Neural Gas -– Growing Neural Gas (U) -– Learning Vector Quantization (U) -– k-Means-Algorithmus - -### Topografische Merkmalskarten – wichtige Organisationsstrukturen des Gehirns -- Wesentliche Cortexregionen (visuell, auditorisch, somatosensorisch, sensomotorisch) zeigen topografische, d.h. nachbarschaftserhaltende Organisationsprinzipien, z.B. - - Abbildung benachbarter Rezeptoren auf der Retina -> auf benachbarte Neuronen im primären visuellen Cortex - - Abbildung benachbarter Rezeptoren auf der Basilarmembran des Innenohres -> auf benachbarte Neuronen im auditorischen Cortex - - Abbildung benachbarter Rezeptoren auf der Hautoberfläche auf benachbarte Neuronen im somatosensorischen Cortex -- Wesen: räumlich benachbarte Rezeptoren sind mit räumlich benachbarten Neuronen im Cortex verbunden -- Grundprinzip topologischer Abbildungen: Umsetzung von Signalähnlichkeiten im Eingaberaum in Lagenachbarschaften der Neuronen des Ausgaberaumes - -#### Die somatosensorische Projektion – Beispiel einer topologieerhaltende Abbildungen -- Darstellung der Somatotopie im somatosensorischen Cortex SI. -- eingezeichnete Symbole und Beschriftung sollen die räumliche Zuordnung zwischen Körperoberfläche und Cortex verdeutlichen, wie sie mit lokaler elektrischer Hirnreizung bei wachen Patienten ermittelt wurde. -- Das Grundprinzip einer topolgieerhaltenden Abbildung, die Nachbarschaftserhaltung, wird deutlich: Lagenachbarschaften auf der Körperoberfläche werden auf räumliche Nachbarschaften in den zuständigen cortikalen Bereichen abgebildet. - -#### Vorteile nachbarschaftserhaltender Abbildungen -- Lagenachbarschaft ist ein Optimalitätsprinzip der Informationsverarbeitung - - erzeugt den geringsten Kommunikationsaufwand - - garantiert geringste Signallaufzeiten - - damit ist räumliche Kooperation zwischen benachbarten Neuronen möglich -> Robustheit, kollektives, verteiltes „Rechnen“ -- Optimale Ressourcenverteilung bei der Abbildung vom Ein- in den Ausgaberaum -- Ermöglichen bei begrenzten neuronalen Ressourcen eine optimale Quantisierung des Eingabesignalraumes (-> Voronoi-Parzellierung) -- Zuordnung der Voronoi-Regionen erfolgt durch unüberwachte, d.h rein datengetriebene Lernprozesse, die die Wahrscheinlichkeitsdichteverteilung der Inputdaten berücksichtigen. - -### Self-Organizing Feature Maps (SOFM) -Ziel: Selbstorganisation einer topologieerhaltenden Abbildung des n-dimensionalen Eingangsraumes $R^n$ auf eine m-dimensionale neuronale Kohonenkarte $R^m$ mit einer vorgegebenen Gitterstruktur - -#### Der Kohonen-Lernalgorithmus -- Bereitstellung des Trainingsdatensatzes $X = (x^{1}, x^p, ..., x^N)$ -- Festlegung der Netztopologie und der Dimensionalität des Kohenengitters zur Abbildung $R^n \rightarrow R^m$, bestimmt Art der Gewichtsmatrix $W= (w_{rs})$ zwischen Eingangsraum und Kohonenkarte - - a Empfänger-Sender-Schreibweise - - r - Positionsvektor des Neurons in der Kohonenkarte (response) - - s - Positionsvektor des Inputs im Eingangsraum (stimulus) - - b Probleme durch Dimensionsreduktion  Topologiedefekte infolge falsch dimensionierter Kohonengitter (siehe später) -- Festlegung der Präsentationsart der Trainingsdaten (zufällig/ zyklisch) -- Bei Bedarf geeignete Neuzusammenstellung des Trainingsdatensatzes (Reihenfolge, Häufigkeit) -- Festlegung der maximalen Anzahl von Lernzyklen tzyk (bei vollständigen X-Präsentationen) bzw. von Lernschritten $t_{max} =N * t_{zyk}$ -- Festlegung der Lernparameter und Abbruchkriterien - -Ablauf: -1. Gewichtsinitialisierung der $w_rs$: - - ohne a-priori-Wissen über Problem und Eingangsraum meist zufällige Anfangswerte, z.B. $w_{rs}\in [-0.1,+0.1]$ - - mit a-priori-Wissen definierte Anfangswerte (siehe späteres Beispiel TSP) -2. Stimulusauswahl: - - Auswahl eines Inputvektors $x^p$ aus dem Inputdatensatz X -3. Response - - Bestimmung des Best-maching Neurons r´ mit der geringsten euklidischen Distanz zwischen $w_{r´}$ und $x^p$ - $||w_{r'}-x^p|| = min||w_r-x^p||$ - - Festlegung des B-M-Neuron r´ als Zentrum einer lokalen Lernumgebung $h_{rr´}$, beschrieben durch eine geeignete Nachbarschaftsfunktion, z.B. $h_{rr'}=h_0 exp(\frac{||r-r'||^2}{2\sigma^2(t)})$ -4. Stimulusgetriebene Adaption der Gewichte des B-M-Neurons und der Neuronen aus seiner lokalen Nachbarschaft: $w_r(t+1)=w_r(t)+\eta(t) * h_{rr'}(t)(x^p -w_r(t))$ -5. Zeitliche Veränderung der Lernrate $\eta(t)$ und des Nachbarschaftsradius $\sigma(t)$ der Nachbarschaftsfunktion $h_{rr´}(t)$. - Zwei Varianten gebräuchlich: - - konstante Lernrate $\eta(t)=konst.$ - - Verringerung der Lernrate (über Abkühlungsprozess) - rekursives Verfahren sinnvoll: $\sigma(t)=\sigma(t-1)*\alpha$ mit $\alpha=(\frac{\sigma_E}{\sigma_A})^{\frac{1}{t_max}}$ -6. Datensatz X vollständig präsentiert? Nein: next p($p=p+1$ oder $p=rand(N)$) => 2. -7. Abbruchkriterium $t\geq t_{max}$ erfüllt? Nein: next p ($p=1$ oder $p=rand(N)$) => 2. -8. Ende - -Geometrisch interpretiert ist eine 1-D Kohonenkarte zum Ring geschlossen. -Die Neuronen des Kohonengitters sind auf einer 2D-Karte angeordnet. Sie sind mit ihren lokalen Nachbarschaften auch über Kartengrenzen hinweg voll vernetzt, indem die Verbindungen an den Enden umschlagen. Dadurch ergibt sich die Topologie eines Torus. - -##### Visualisierung des SO-Prozesses -- Gewichtungen $w_{rs}$ jedes Neurons (Referenzvektoren) werden als Punkte im Inputraum $R^n$ interpretiert -- unmittelbar im Kohonen-Gitter benachbarte Neuronen können ihre Referenzvektoren im Inputraum durch eine Gerade verbinden -- Abbildungsprobleme bei Dimensionsreduktion $R^n \rightarrow R^m$ mit $m (Vorlesung 7) -##### Einsatzgebiete topologieerhaltender SOFM -Lösung von Optimierungsproblemen – das Traveling Salesman Problem (TSP) - - Gesucht: kürzeste geschlossene Tour durch M vorgegebene Städte - - bei M Städten – durch Permutation (Anordnung der Städte innerhalb der Tour unter Beachtung der Reihenfolge) -> maximal M! verschiedene Touren - - da - - a jede Stadt Ausgangspunkt einer Tour sein kann und - - b jede Tour in zwei verschiedenen Richtungen zurückgelegt werden kann - ergeben sich 2*M Touren mit gleicher Weglänge - - $(M-1)/2$ verschiedene geschlossene Routen - - Rechenaufwand: steigt mit der Fakultät der Problemgröße (Anzahl der Städte) -> wächst damit noch viel stärker als exponentieller Rechenaufwand (für n>6), z.B. - - bei 10 Städten: 181 440 Touren - - bei 20 Städten: 6,08 1016 Touren (selbst auf einer 1 GFLOPS Maschine ca. 35 Tage) - - bei 30 Städten: 4,4 1030 Touren (auf einer 1 GFLOPS Maschine ca. 4000 Mrd. Jahre) (Core i7, 3.4 GHz, 4 Kerne ca. 100 GFLOPS) - - Fazit: TSP ist ein NP-vollständiges Problem, da es exponentiell wachsenden Rechenaufwand hat, für eine Beispiellösung aber schnell, d.h. mit polynomialem Rechenaufwand verifiziert werden kann - - Lösungsansatz mit SOFM: - - Suche nach kürzester Route durch selbstorganisierende Platzierung der Referenzvektoren einer zu einem Ring verschalteten 1D-Neuronenkette im 2D-Inputraum - - Städte fungieren als Inputdaten, die die Verteilung der Voronoi-Regionen sowie der zugehörigen Referenzvektoren bestimmen - - Grundprinzip und Ablauf: - - Jedes Neuron mit 2 Gewichten -> Ortskoordinaten in der Ebene - - Initialisierung der Gewichtsvektoren mit definierten Anfangswerten (Kreisring) mit Anzahl der Neuronen - $$w_{rx}=0,35*cos(\frac{2\pi r}{N})+0,5$$ - $$w_{ry}=0,35*cos(\frac{2\pi r}{N})+0,5$$ - - pro Lernschritt zufällige Auswahl einer Stadt als Input - - Selektion des B-M-Neurons -> Gewichtsadaption für B-M-Neurons & Nachbarn - -Visualisierung semantischer Beziehungen – die semanto-topografische Abbildung - - Grundidee: Nachbildung kognitiver Fähigkeiten durch Erzeugung von neuronalen Karten, die auch semantische Beziehungen zwischen Objektbegriffen widerspiegeln können - - Beispiel: - - Erlernen von Ähnlichkeitsbeziehungen zwischen Tierarten - - Eingabekodierung: Beschreibung der Tierarten über charakteristische Merkmale mittels einer Merkmalsmatrix - - Probleme der SOFM - - Kriterium: Optimalität der Verteilung der Gewichtsvektoren im Eingangssignalraum - Quantisierungsfehler: $E=\frac{1}{N}\sum_{p=1}{N}||x-w_{r'}||$ - - Nachteile des Algorithmus - 1. Lernphase erfordert zunächst erhebliche Zahl von Lernschritten zur Entfaltung des Kohonengitters – Herausbildung einer topologischen Grundordnung des Netzwerkes (-> Zeitaufwand, Kosten) - 2. Topologische Struktur des Kohonengitters muss der topologischen Struktur der zu repräsentierenden „Untermannigfaltigkeit“ des Eingabesignalraumes entsprechen - -> erfordert a priori Informationen (nicht immer vorhanden) über Verteilung der Eingabesignale, z.B. in Häufungsgebieten - -> Struktur des Eingabesignalsraumes kann topologisch derart kompliziert sein, dass Netzdesign praktisch unmöglich ist - - Repräsentationsprobleme bei inhomogen strukturierter Untermannigfaltigkeit des Inputraumes (Verknüpfung von voneinander separierten Unterräumen verschiedener Dimensionalität) - - tritt auf, wenn Topologie des Kohonennetzes von der Topologie der Datenpunktmannigfaltigkeit abweicht -> erzeugt suboptimale Verteilung der Referenzvektoren - - wegen Gitterorganisation des Kohonennetzes ist Positionierung im Raum zwischen den Teilmannigfaltigkeiten möglich -> damit ungenutzte Kodierungsressourcen - - Abbildung weit vom Optimum entfernt, da unvollständige Verwendung des verfügbaren Satzes von Referenzvektoren - -### Das "Neural Gas" Lernparadigma -Unterschiede zum Kohonen-Lernalgorithmus: -- anstatt Verwendung der Nachbarschaftsrelationen der Gewichtsvektoren im externen Kohonengitter – Verwendung der Nachbarschaftsrelationen der Gewichtsvektoren im Eingangssignalraum zur Adjustierung der $w_i$ -- anstatt Verwendung der Distanz des Gewichtsvektors $w_i$ zum Input $x^p$–Bestimmung des „Distanzranges“ des Gewichtsvektors $w_i$ unter Berücksichtigung aller anderen Gewichtsvektoren $w_j$ -Grundprinzip: -- ausschließliche Berücksichtigung von Nachbarschaftsrelationen im Eingangssignalraum -> „gasähnliche“ Dynamik der Gewichtsvektoren (ohne Verankerung in einem festen Gitter) -- Bestimmung einer Distanz- oder Nachbarschaftsrangfolge -- Adjustierung des dem Input ähnlichsten Gewichtsvektors $w_{i0}$ sowie der in der Distanzrangfolge nächsten Gewichtsvektoren -> ergibt eine wesentlich effizientere Quantisierung des Eingabesignalraumes -- Wertung: ermöglicht Generierung einer perfekt topologieerhaltenden Gewichtsverteilung zur Vektorquantisierung des Eingangssignalraumes - -#### "Neural Gas" Lernalgorithmus -1. Initialisierung der Gewichtsvektoren $w_i(i = 1, ..., m)$ -2. Stimulusauswahl: Auswahl eines Inputvektors $x^p$ aus X -3. Response: - Bestimmung der Distanz- oder Nachbarschaftsrangfolge aller m Gewichtsvektoren wi bezüglich des aktuellen $x^p$ - \rightarrow $k_i(x^p, W)$ – Distanzrang von $w_i$ bezüglich $x^p$ ($k_i = 0$ für $w_i^0; k_i = 1$ für $w_i^1$) - \rightarrow jedes $k_i(x^p, W)$ hängt neben $x^p$ von allen anderen aktuellen Referenzvektoren $w_i$ ab -> während des Lernens damit ständige Umordnung der Rangfolge (auch bei gleichen Inputs) -4. Adaption der Referenzvektoren - $$\delta w_i = \eta(t)* h_{\lambda}*(x^p - w_i)$$ -5. Datensatz X vollständig präsentiert? Nein: next $p(p=p+1$ oder p=rand(N)) => 2. -6. Abbruchkriterium $t\geq t_{max\$ erfüllt? Nein: next $p(p=1$ oder p=rand(N)) => 2. -7. Ende - -##### Quantisierung komplexer Inputräume mit NG -Wesen: Lernvorgang zeigt eine gasähnliche Dynamik, d.h. ein Verhalten wie das von Molekülen im Schwerefeld der Untermannigfaltigkeiten mit untereinander abstoßender Kraftwirkung - -Vorteil: gridfreie Netzwerkstruktur und topologische Struktur der Untermannigfaltigkeit passen optimal zusammen -> ergibt eine optimale Verteilung der Referenzvektoren, kein Referenzvektor bleibt ungenutzt - -#### Vergleich zwischen SOFM- und Neural Gas Lernverfahren - -| Kriterien | SOFM | Neural Gas | -| :----------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------: | -| Definition der Nachbarschaften | innerhalb des vordefinierten Neuronengitters (n-dim.) | innerhalb des Eingaberaumes | -| Einschränkungen | Dimensionalität des Grids | Keine | -| Probleme bei der Dimensionsreduktion | möglich, recht häufig | prinzipiell keine | -| Wertung | adaptiver Vektorquantisierer, der eine Abbildung von Inputähnlichkeiten auf das Neuronengitter (n-dim.) erzeugt (-> Visualisierung) | perfekter adaptiver Vektorquantisierer, der direkt im Eingaberaum arbeitet (ohne eine Projektion) | - -### Der k-Means Algorithmus als klassischer VQ -Ziel: den Datensatz so in k Partitionen zu teilen, dass die Summe der quadrierten Abweichungen von den Cluster-Schwerpunkten minimal ist. Mathematisch entspricht dies der Optimierung der Funktion $J = \sum_{i=1}^k \sum_{x\in S} || x_j - \mu_i ||^2$ -- Diese Zielfunktion basiert auf der Methode der kleinsten Quadrate, man spricht auch von Clustering durch Varianzminimierung, da die Summe der Varianzen der Cluster minimiert wird. -- Da zudem die quadrierte Euklidische Distanz ist, ordnet k-Means effektiv jeden Datenpunkt dem nächstgelegenen (nach Euklidischer Distanz) Clusterschwerpunkt zu. -- Da die Suche nach der optimalen Lösung schwer ist (NP-schwer), wird im Normalfall ein approximativer Algorithmus verwendet. -- Der am häufigsten verwendete approximative k-Means-Algorithmus ist der Lloyd-Algorithmus, der oft als "der" k-means Algorithmus bezeichnet wird, obwohl Lloyd diesen Namen nicht verwendet hat. -- Lloyd’s Algorithmus besteht aus drei Schritten: - 1. Initialisierung: Wähle k zufällige Mittelwerte (Means) $m_1,..., m_k$ aus dem Datensatz. - 2. Zuordnung: Jedes Datenobjekt $x_j$ wird demjenigen Cluster $S_j$ zugeordnet, bei dem die Cluster-Varianz am wenigsten erhöht wird. - $S_i^{(t)}= {x_j: ||x_j -m_i^{(t)}||^2 \leq ||x_j - m_{i*}^{(t)}||^2 }$ für alle $i*=1,...,k$ - 3. Aktualisierung: Berechne die Mittelpunkte der Cluster neu: - - Die Schritte 2-3 werden dabei so lange wiederholt, bis sich die Zuordnungen nicht mehr ändern. - - -## Reinforcement Learning -[comment]: <> (Vorlesung 8) -### Einordnung und Wesen -- Überbegriff für eine Reihe von Methoden des Maschinellen Lernens, bei denen ein Agent den Nutzen von Aktionsabfolgen in einer Welt bestimmt -- dient dem völlig selbständigen Erlernen komplexer Wahrnehmungs-Handlungs-Zusammenhänge auf Basis einer Handlungsbewertung nur durch ein unspezifisches Leistungsbewertungssignal (Belohnung/Bestrafung) -- zwischen überwachtem und unüberwachtem (datengetrieben) Lernen -- Unterschied zum Supervised Learning: Leistungsbewertungssignal ist nicht instruktiv (spezifisch mit konkreten Hinweisen zur Verbesserung der Abbildung), sondern ausschließlich evaluativ (bewertend) - -$\rightarrow$ „Learning with critic instead of learning with teacher.“ - -Haupteinsatzgebiete: Robotik, optimale Steuerungen, Spielsteuerungen, .... - -### Grundidee -- Entscheidungsmodul (Agent) muss wiederholt Aktionen auswählen, um ein System in gewünschter Weise zu beeinflussen und in einen Zielzustand zu überführen. -- Bei jeder Entscheidung erhält der Agent eine direkte Belohnung / Bestrafung (Reinforcement), wobei sich die erhaltenen Belohnungen über die Zeit akkumulieren. -- Reinforcement Lernen (RL) beschäftigt sich mit dem Problem, durch Lernen solche Entscheidungsstrategien zu finden, die bezüglich dieser akkumulierten Reinforcements optimal sind. -- Ziel ist es, nur mittels lokal optimaler Entscheidungen eine global optimale Strategie zu erhalten. - -### Wo steckt das Wissen im RL-Agenten ? -- In so genannten State-Action Values (Q-Werten), die kodieren, welches long-term Return R erhalten werden kann, wenn man in einem bestimmten State s j eine bestimme Aktion a i ausführt -- Einfachste Form: Tabelle Q( s , a ) -- Fragen und Probleme: - 1. Woher bekommt man die Q-Werte? -> Lernverfahren - 2. Exponentielles Wachstum der Tabellengröße mit der Anzahl der Dimensionen d des State Spaces - -## Q-Learning – der bekannteste RL Algorithmus -On-line Lernverfahren nach [Watkins and Dayan, 1992], das auf einer inkrementellen Verbesserung der Schätzung Q(s,a) mittels “stochastischer Approximation” basiert - - -## Supervised Learning -### Kurzcharakteristik -- Lernverfahren, bei dem gelabelte Daten-Samples $X = {(x_1 , y_1 ), (x_2 ,y_2 ), ...,(x_n , y_n )}$ bzw. $X = {(x_1 , t_1 ), (x_2 ,t_2 ), ...,(x_n , t_n )}$ zur Approximation einer unbekannten, Daten generierenden Funktion genutzt werden. -- Das Labeln der Trainingsdaten erfolgt durch Lehrer meist offline. -- Soll eine unbekannte Funktion approximiert werden, deren Funktionsoutput y nur diskrete Klassen/Kategorien besitzt, dann müssen die Daten-Samples diskret gelabelt werden mit t. -> Klassifikation / Kategorisierung -- Soll eine unbekannte, Daten generierende Funktion approximiert werden, deren Funktionsoutput y kontinuierlich (reell) ist, dann müssen die Daten Samples auch reellwertig gelabelt werden mit t -> Funktionsapproximation / Regression - -### Erlernen von Abbildungen – Das Konzept der Assoziativspeicher -- Wesen: Erlernen von Abbildungen zwischen zu assoziierenden Musterpaaren (x, t) aus der Lernstichprobe -- Wesen: $t=x(Vorr. m=n)$ -- Zweck: Ausgabe des korrekten, ungestörten Inputs (Outputs) x bei Präsentation eines gestörten oder unvollständigen Inputs X* -- Einsatz: Mustervervollständigung, Rauschunterdrückung, Feature Learning in Deep Neural Nets -- Einfachstes Lernverfahren: Hebb‘sches Lernen (Steinbuch‘sche Lernmatrix - -### Der Error-Backpropagation Algorithmus -- Erlaubt eine Verallgemeinerung der auf einschichtige Netze beschränkten Delta-Lernregel auf mehrschichtige Netze mit beliebiger Anzahl von Schichten. -- Problem: Ein direktes Fehlersignal zwischen Teach-Vektor und Output-Vektor des Netzes existiert nur für die Output-Schicht. -- Für alle Hidden-Schichten muss das Fehlersignal von der Output-Schicht zurückpropagiert und rückwirkend aufakkumuliert werden (daher der Name Error-Backpropagation) -> fungiert dann als „internes Fehlersignal“ -- Fehlerakkumulation erfolgt gewichtet mit den vorhandenen „alten“ Gewichten der betreffenden Verbindung. -- erlaubt damit eine rekursive Berechnung der notwendigen Gewichtsänderungen vom Output zum Input. -- Implementierung: damit stets 2 Sätze von Gewichtsparametern erforderlich: - - Satz „alter Gewichte“ zum Generieren der aktuellen, internen Netzaktivität und zum Zurückpropagieren der Fehlersignale - - Satz „neuer Gewichte“, die die Gewichte nach dem Lernschritt kodieren; kommen erst im nächsten Zyklus zum Einsatz, dann wieder als „alte Gewichte“ - -## Verallgemeinerte Delta-Lernregel -### der Error Backpropagation Algorithmus -1. Betrachtung für die Ausgabeschicht L (entspricht Betrachtung nach Delta-Regel) -2. Betrachtung für zwei beliebige Schichten l und l-1 - -> erlaubt rekursive Berechnung für l-schichtige Netze vom Ausgang auf den Eingang - -### Fazit -- verallgemeinerte Delta-Lernregel lässt sich auf beliebige Anzahl von Schichten erweitern -- Fehlerterme berechnen sich rekursiv aus der gewichteten Summe der Delta-Fehler der nachfolgenden Schicht l, multipliziert mit der Ableitung der Ausgabefunktion der aktuellen Schicht l-1 -> ist gut vektorisierbar -- Die zwei prinzipiellen Trainingsmodi können auch hier unterschieden werden: - - Direct Learning: berechnete Gewichtsänderung wird sofort nach der Verarbeitung des Trainingsmusterpaares ausgeführt - - Batch Learning: berechnete Gewichtsänderung wird über alle Musterpaare des Trainingssets akkumuliert und erst nach Verarbeitung aller Musterpaare ausgeführt - -## Ausgabekodierung bei der Klassifikation -- Häufig verwendet: Bei Klassifikationsproblemen Umwandlung der reelwertigen Netzausgaben in eine binäre Ausgabe durch einfache Bestimmung des Maximums zur Markierung der am stärksten aktivierten (und damit erkannten) Klasse/Kategorie -- Häufig benötigt: Klassenzugehörigkeiten, die nicht nur die einzelne Ausgabe (Klasse) sondern auch alle anderen Ausgaben (Klassen) mit berücksichtigen --> Softmax Ausgabe - -### Softmax Ausgabe -- Spezielle Ausgabefunktion der ganzen Ausgabeschicht statt der bisherigen Ausgabefunktion pro Einzelneuron -- ermöglicht die Schätzung von Klassenzugehörigkeiten -- dazu Abbildung (“Quetschen”) eines N-dimensionalen Vektors von beliebigen reelwertigen Ausgabeaktivitäten auf einen N-dimensionalen Vektor von positiv reelwertigen Ausgaben im Bereich (0, 1), die sich alle zu 1 addieren. - -# Moderne Verfahren für große Datensets - -## Deep Neural Networks - -## Anwendungsbeispiele - - -[comment]: <> (Vorlesung 9) -[comment]: <> (Vorlesung 10) -[comment]: <> (Vorlesung 11) +# NeuroInformatik +Die Lehrveranstaltung vermittelt das erforderliche Methodenspektrum aus theoretischen Grundkenntnissen und praktischen Fähigkeiten zum Verständnis, zur Implementierung und zur Anwendung neuronaler und probabilistischer Techniken des Wissenserwerbs durch Lernen aus Erfahrungsbeispielen sowie zur Informations- und Wissensverarbeitung in massiv parallelen Systemen. Sie vermittelt sowohl Faktenwissen, begriffliches und algorithmisches Wissen. + +Inhaltsübersicht +- Intro: Begriffsbestimmung, Literatur, Lernparadigmen, Haupteinsatzgebiete, Historie +- Neuronale Basisoperationen und Grundstrukturen: + - Neuronenmodelle + - Netzwerkmodelle +- Lernparadigmen und deren klassische Vertreter: + - Unsupervised Learning + - Reinforcement Learning + - Supervised Learning +- Moderne Verfahren für große Datensets + - Deep Neural Networks + +Exemplarische Software-Implementationen neuronaler Netze für unüberwachte und überwachte Lern- und Klassifikationsprobleme (Fokus auf Python). Die Studierenden erwerben somit auch verfahrensorientiertes Wissen, indem für reale Klassifikations- und Lernprobleme verschiedene neuronale Lösungsansätze theoretisch behandelt und praktisch umgesetzt werden. Im Rahmen des Pflichtpraktikums werden die behandelten methodischen und algorithmischen Grundlagen der neuronalen und probabilistischen Informationsverarbeitungs- und Lernprozesse durch die Studierenden mittels interaktiver Demo-Applets vertieft und in Gesprächsgruppen aufgearbeitet. + + +[comment]: <> (Vorlesung 1) +# Intro +## Was ist Künstliche Intelligenz (KI) ? +- Künstliche Intelligenz (KI, englisch Artificial intelligence - AI) ist ein Teilgebiet der Informatik, welches sich mit der Automatisierung intelligenten Verhaltens und dem Maschinellen Lernen befasst. Der Begriff ist nicht eindeutig abgrenzbar, da es bereits an einer genauen Definition von „Intelligenz“ mangelt. (Quelle: Wikipedia) + -bezeichnet den Versuch, bestimmte Entscheidungsstrukturen des Menschen nachzubilden, indem z. B. ein Computer so programmiert wird, dass er relativ eigenständig komplexe Probleme bearbeiten kann. +- Begriff wurde erstmals 1956 vom amerikanischen Informatiker John McCarthy verwendet, der ihn im Projektantrag für die Dartmouth-Konferenz 1956 gebrauchte (Präsentation von Programmen, die Schach und Dame spielten, Theoreme bewiesen sowie Texte interpretierten) + +## Starke vs. Schwache KI +- Schwache KI (Narrow AI): + - zielt darauf ab, konkrete Anwendungsprobleme des menschlichen Denkens und Handelns zu lösen + - Fähigkeit aus Beobachtungen zu lernen ist integraler Bestandteil + - zielt auf die Simulation intelligenten Verhaltens mit Mitteln der Mathematik & Informatik, aber NICHT auf die Schaffung von Bewusstsein oder auf ein tieferes Verständnis von Intelligenz +- Starke KI: + - zielt auf die Schaffung von eigenständigem, maschinellem Bewusstsein und Gewinnung eines Verständnisses von Intelligenz + - muss nicht Gemeinsamkeiten mit dem Menschen haben, wird vermutlich eine andersartige kognitive Architektur aufweisen (Quelle: Wikipedia) + +## Wesentliche Methoden / Konzepte: +- Symbolische Verfahren: Top-down Ansatz (von begrifflicher Ebene): expertenwissen in system packen +- Subsymbolische/Neuronale Verfahren: Bottom-up Ansatz von Daten: nutzt daten in denen "wissen" steckt und lasst durch viele daten richtige entscheidungen (beobachten) enstehen +- Simulationsmethode: simuliert kognitive Prozesse des Menschen +- Phänomenologische Methode: arbeitet rein ergebnisorientiert + +## Techniken der KI +1. **Suchverfahren** z.B. zur Wegfindung (Dijkstra, A*, D*, E*, …) +2. **Planungsverfahren** zur Erstellung optimaler Aktionsfolgen zum Ziel +3. **Optimierungsverfahren** z.B. Hill Climbing, Evolutionäre Algorithmen, Partikelschwarmoptimierung +4. **Logisches Schließen** + − formalisiertes menschliches Wissen (z.B. in Ontologien) + − Induktion: Verallgemeinerung von Beispielen zu Regeln, häufig mit Maschinellem Lernen + - In symbolischen Systeme: Beispiele als auch die induzierten Regeln sind explizit repräsentiert + - In subsymbolischen Systemen: berechenbares Verhalten wird „antrainiert“, erlaubt jedoch keinen/nur schwer Einblick in die erlernten Lösungswege +5. **Approximationsmethoden** aus einer Menge von Daten eine allgemeine Regel ableiten (z.B. Neuronale Netze, Deep Learning) + +## Was ist Maschinelles Lernen? +- Oberbegriff für die „künstliche“ Generierung von Wissen aus Erfahrung + - Ein künstliches System lernt dabei aus Trainingsbeispielen und kann nach Beendigung der Lernphase verallgemeinern. + - Es lernt also nicht einfach die Beispiele auswendig, sondern erkennt Gesetzmäßigkeiten (Regularitäten) in den Lerndaten. + - So kann das System dann auch unbekannte Daten beurteilen. +- Breites Spektrum möglicher Anwendungen in: Diagnoseverfahren, Aktienkursanalyse, Bild- und Sprachverarbeitung, Robotik, Spielstrategien,… +- Art und Mächtigkeit der Wissensrepräsentation: + - symbolisch: Wissen (Beispiele, induzierten Regeln) explizit repräsentiert + - subsymbolisch: Wissen implizit repräsentiert - berechenbares Verhalten wird antrainiert, erlaubt aber kaum Einblick in die erlernten Lösungswege + +## Wichtige Paradigmen des Maschinellen Lernens +Informationsverarbeitungsniveau zu Systemwissen +| \ | **symbolisch** | **subsymbolisch (numerisch)** | +| -------------------------------------------- | :------------: | :---------------------------: | +| explizit strukturiert (regelbasiert) | KI-Systeme | Fuzzy Systeme | +| implizit unstrukturiert (durch lernprozesse) | - | Neuronale Systeme | + + +## Was ist Neuroinformatik +Neuroinformatik – das interdisziplinäre Forschungsgebiet zu den +- am biologischen Vorbild orientierten, +- nicht explizit programmierten aber +- lernfähigen und sich adaptierenden Systemen, die +- ihre eigenen, internen „Algorithmen“ +- in Reaktion auf und in Wechselwirkung mit ihrer sensorisch (visuell, taktil, akustisch, usw.) vermittelten Umwelt entwickeln. += Neural Computing, Konnektionismus, New AI, Brain-like Computing, Deep Learning +*Ziel*: Entwicklung von Maschinenintelligenz durch Nachbildung biologischer Informationsverarbeitungs- und Lernprozesse auf neuronalem Niveau + +[comment]: <> (Vorlesung 2) +## Erste wichtige Grundlagen +### Lernparadigmen +#### Unsupervised Learning (Unüberwachtes Lernen) +Für eine gegebene Menge von Daten wird ohne Lehrer ein Modell, gelernt, das die Daten in kompakter Weise beschreibt . Wichtiges Teilgebiet: Cluster-Verfahren, die die Daten in mehrere Kategorien einteilen, die sich durch charakteristische Muster unterscheiden. + +#### Reinforcement Learning (Verstärkungslernen) +Algorithmus lernt durch Belohnung und Bestrafung eine Taktik, wie in potenziell auftretenden Situationen zu handeln ist, um den Nutzen für den Agenten (Steuerung, Roboter, Spielprogramm) zu maximieren. + +#### Supervised Learning (Lernen mit Lehrer) +Erlernen einer Abbildungsfunktion aus gegebenen Paaren von Ein- und Ausgaben. Während des Lernens stellt ein „Lehrer“ den korrekten +Sollwert zu einer Eingabe bereit. Wichtiges Teilgebiet: automatische Steuerung oder Klassifizierung + +### Einsatzgebiete +#### Klassifikation/Kategorisierung +Zweck: auf Basis von diskret gelabelten Trainingsdaten $x = {(x_1, y_1), (x_2,y_2), ...,(x_n, y_n)}$ soll eine unbekannte, meist nichtlineare Beziehung zwischen den Inputdaten $x_i$ und den Klassenlabeln $y_i$ gelernt werden. Daten entstammen einer unbekannten, Daten generierenden Funktion, deren Funktionsoutput nur diskrete Werte annehmen kann. + Zu beachten! prinzipielle Separierbarkeit des Klassifikationsproblems linear nichtlinear nicht separabel + Einsatzfelder: +- Detektionprobleme (Personen, Gesichter, ...) +- Klassifikationsprobleme (Handschrift, Posen, Gesten, Mimik, Krankheiten, Pflanzen, Tiere, ...) +- Übung: Schwertlilie + +#### Funktionsapproximation / Regression +- Zweck: auf Basis von reelwertig gelabelten Trainingsdaten $x = {(x_1, y_1), (x_2,y_2), ...,(x_n, y_n)}$ soll eine unbekannte, Daten generierende Funktion approximiert werden, deren Funktionsoutput kontinuierlich (reell) ist. +- Lösungsansatz (Idee): jede stetige, mehrdimensionale und nichtlineare Funktion ist durch Überlagerung von Aktivierungsfunktionen mehrerer Neuronen beliebig genau approximierbar +- Einsatzfelder: + - Abbildung hochdimensionaler Inputs auf niedrig-dimensionale kontinuierliche Outputs (z.B. Navigation bei ALVINN) + - Zeitreihenprognose + - Neurocontrol + - Übung: Regression von Wohnhauspreisen + - Trainingsziel: Erlernen der durchschnittlichen Wohnungspreise aus 13 hinterlegten Merkmalen + - Grundlage bildet Sinusfunktion mit überlagertem Rauschen + - 40 Datenpunkte aus Sinusfunktion y=sin x; diese wurden mit Rauschen überlagert y=sin x + noise + - nach Training: reellwertige Ausgabe für beliebige Inputs x möglich + +#### Clusterung bzw. Clusteranalyse +Zweck: strukturentdeckende Analyseverfahren zur Ermittlung von Gruppen (Clustern) von Daten, deren Eigenschaften markante Ähnlichtkeiten aufweisen. Variante des Klassifikationsproblems, nur schwieriger, da die Trainingsdaten hierbei ungelabelt sind. +Hauptanwendungsfelder: +- Gruppenbildung über Daten allgemein +- Datenvisualisierung +- Suche in Datenbanken und Web +- Bildsegmentierung (Video, CT, MRI, …) +- Clustering von Genom Daten +Typ. Vertreter: +- k-Means Algorithmus +- SOFM, Neural Gas +- Expectation-Maximization (EM)-Algorithmus +- Fuzzy C-Means, Mean Shift + +### Einordnung in das Mustererkennungsparadigma +Wichtiger Hinweis: Dies ist das klassische Mustererkennungsparadigma. +Messdaten (Signale, Bilder) aus Sensorik kommt in Problemabhängige und Netzwerkbezogene Datenaufbereitung: +1. Problemspezifische + - Vorverarbeitung + -Schwellwertoperationen + - Filterung + - Inter- /Extrapolation + - Normierungen & Korrekturen + - Segmentierung +2. Merkmalsextraktion + - Merkmalsgewinnung + - Merkmalstransformation + - Skalierung/Normierung + - Unterraumprojektion (Dimensionsreduktion) + - Quellenseparierung + - Merkmalsselektion + - Signifikanzanalyse +3. Netzwerkein- und ausgabekodierung +Die Ausgabe wird auf Klassifikation, Funktionsapproximation oder Clusterung übertragen + +## Historische Entwicklungen +### Nachweis von Einzelneuronen (1905) +Der spanische Neuroanatom Santiago Ramon y Cajal konnte mittels der Golgi-Färbung erstmals nachweisen, dass das Gehirn aus einzelnen, getrennten Zellen (Neuronen) besteht. +Danach wurde eine strukturelle Vielfalt der Neuronentypen entdeckt (30-40 versch Zelltypen), unter anderem Purkinje-, Pyramiden- oder spindelförmige Zellen. + +### Das Hebb'sche Korrelationslernen (1949) +Die synaptische Kopplung zwischen zwei Neuronen ist plastisch und ändert sich proportional zur Korrelation der Aktivitäten des Sender- und des Empfängerneurons, d.h. der prä- und postsynaptischen Aktivitäten. + +$w_{ij}(t+1) = w_{ij}(t) + \Delta w_{ij}(t)$ (Lernen über die Zeit) +$\Delta w_{ij} = \eta * y_i(t)*x_{ij}(t)$ (Das $x_ij$ ist Aktivität des Eingangsneuron, $y_i$ die Aktivität des Empfängerneurons) + +| $y_i/y_j$ | 0 | 1 | +| 0 | 0 | 0 | +| 1 | 0 | + | + +### Erste einfache Neuronenmodelle +In Knoten laufen Informationsprozesse verschiedener Synapsen ein. Diesen Synapsen sind Gewichtungen vorgegeben. Der Knoten bildet aus den gewichteten Eingängen über eine Gesamteingabe und Transferfunktion die Ausgabeakivitäten. Synapsen können Signale nicht verstärken, nur schwächen! + +### Grundstruktur und Lernprinzip eines Multi Layer Perzeptons (MLP) +- Input Layer nehmen Grundfunktion hne Bias auf +- Hidden Layer (1.Schicht) verknüpfen die Input Layer und bewerten mit Bias (bildet Scalarprodukt seiner gewichteten Eingangsinputs). Ermöglicht mathematische Operationen. Wird als Synaptische Matrix bezeichnet +- Output-Layer (2. Schicht) verknüft Ausgangsprodukte der Hidden Layer mit einem eigenem Bias und erstellt selbst Vektoren + +Bsp: 5 Hidden Neuronen + 1 Hidden Bias Neuron + 2 Output Neuronen + 1 Output Bias Neuron = 12 Neuronen/Gewichte +Teach Vektor t: $d = t -y$ +Abbildungsfelder (als skalare Größe): $E=||d||^2$ wird verwendet um Fehler zu minimieren oder zu verhindern +Skalarer Abbildungsfehler (Loss Funktion) wird nach fälschlichen Gewichten abgeleitet: $\frac{\delta E}{\delta w_{ij}} \rightarrow \Delta W^1$ + +### Erlernen der Navigation mittels Expert Cloning +- Kopieren der situationsabhängigen Fahrstrategie eines/mehrerer geübter Fahrer in ein Neuronales Netz +- Nutzung der Approximations und Verallgemeinerungsfähigkeit des Netzes zur Navigation in unbekannten Situationen +- realisiert eine hochkomplexe, nicht explizit algorithmisch fassbare neuronale Funktionsapproximation $\rightarrow$ End-to-End Learning + +$\phi = f(x(t))$ + +#### ALVINN – Prinzipielle Vorgehensweise +1. Vorführphase: + - Experte(n) steuert Fahrzeug entlang einer Anzahl repräsentativer Trajektorien, die die gewünschte Fahrstrategie implizit beschreiben (Beachte: nur mittels der Kamerabilder) $\rightarrow$ bei untersch. Witterungs-, Beleuchtungs- & Straßenverhältnissen + - Synchrone Aufzeichnung der aktuellen Szenenansichten $x(t)$ und des vom Experten gewählten Lenkwinkels $\phi(t)$ + - Vorteil: Datensatz enthält auch die durch Fahrzeugkinematik und sonstige Einflüsse (Straßen-/Reifenzustand) bestimmten Restriktionen während der Fahrt +2. Trainingsphase: + - Approximation der Abbildungsfunktion $\phi (t)=f(x(t))$ mittels Supervised Learning + - Generalisierung von bekannten Trainingssituationen auch auf unbekannte neue Straßenverläufe +3. Recallphase: + - Nachahmung der vom Experten in der Vorführphase verfolgten Fahrweise $\rightarrow$ Experten-Cloning + - topologische Ausgabekodierung $\rigtharrow$ Fuzzyfikation des Lenkwinkels + +- Neuronen fungieren als Detektoren für ganze Straßenverläufe mit verschiedenen Orientierungen oder für die linke bzw. rechte Straßenkante. +- Ein Einzelneuron allein kann die Lenkung nicht korrekt steuern, erst die kollektive Aktivierung aller Neuronen (mit richtigen und falschen lokalen Hypothesen) ermöglicht die feinabgestimmte Steuerung des Fahrzeugs. + +### Überwachtes Lernen als Optimierungsproblem – die „Support Vector Machine“ +- aus der statistischen Lerntheorie hervorgegangenes Lernverfahren +- zur Lösung von Klassifikationsproblemen entwickelt (Vapnik, 1995) +- später auch für Funktionsapproximation/Regression eingesetzt (Vapnik et al., 1997) +- allgemein bessere Generalisierungsfähigkeiten als damals bekannte neuronale Netze, weil ... + +| Neuronales Netz | Support Vector Machine (SVM) | +| ------------------------------------------------------- | ---------------------------------------------------------------------------------------- | +| Training – als Gradientenabstieg über dem Fehlergebirge | Training – als Lösung eines quadratischen Optimierungsproblems mit konvexer Zielfunktion | +| $\rightarrow$ kann in lokalem Minimum enden | $\rightarrow$ sichert Konvergenz zum globalen Minimum | + +#### SVM Grundidee +- Trainingsmuster in Form von Vektoren, die einer von zwei Klassen angehören +- Ermittlung einer optimalen Hyperebene H (Trenngerade, Trennebene), so dass diese + 1. die Trainingsmuster korrekt trennt und dabei + 2. einen möglichst großen Abstand zu den äußeren Datenpunkten der jeweiligen Klasse aufweist +- Der minimale Abstand zwischen der Trennebene und dem nächsten Trainingssample wird als Margin bezeichnet und soll maximal werden $\rigtharrow$ Forderung zur Erzielung guter Generalisierungsleistungen +- Ziel des Algorithmus: Finden einer optimal gelegenen Hyperebene H, bei der der Margin maximal wird $\rightarrow$ erfordert Lösung eines Optimierungsproblems + +[comment]: <> (Vorlesung 3) +### Deep Learning +Konzept und Lernverfahren, das seit etwa 2010 alle Rekorde (Computervision, Sprachverstehen, Robotik, Spielstrategien) in der künstlichen Intelligenz bricht. Kombiniert eigentlich alte Verfahren (neuronale Netze) mit +1. gewaltigen Datenmengen und +2. massiv paralleler Rechenpower $\rightarrow$ Schlüssel zum Erfolg +Im Kern ein unüberwachtes Verfahren für tiefe neuronale Netze zum Lernen von hierarchischen Features der Eingabedaten für schwierigste Klassifikationsaufgaben. + +#### Typische Netzwerkstruktur +Neuronales Netzwerk für Schadstellendetektion +- bis zu 1000 Schichten +- mehrere Mio. freie Parameter (Gewichte), die alle zu trainieren sind +- Einsatz neuartiger Techniken beim Training: Regularisierung, Dropout, Weight Decay, Batch Normalization, usw. + +#### Motivation für Deep Learning +> „Hunderte von Entwicklern und Studenten verbrachten Jahrzehnte damit, per Hand all +die Regeln einzutippen, die Computer brauchen könnten, um Gegenstände anhand ihrer +Merkmale zu unterscheiden“ +> „Sich Merkmalssätze auszudenken, ist schwierig, zeitaufwändig und verlangt nach viel +Fachwissen, da muss man sich natürlich die Frage stellen: Gibt es keinen besseren +Weg?„ (A. Ng, Stanford Univ. / Baidu Research / Coursera ) + +Probleme: +- Design des Merkmalsraumes per Hand: + - erfordert viel Hintergrundwissen über das Klassifikationsproblem und ist zeitintensiv + - Wiederkehrendes Problem: neue Objektklassen benötigen eventuell neue Merkmalsräume +- Meist nur ungelabelte Bilder verfügbar: + - viele Anwendungen haben keine oder kaum gelabelte Daten (z.B. Facebook-Fotos) + - Bilder haben hohen Informationsgehalt $\rightarrow$ auch ohne Label ist viel Information über die betreffende Klasse enthalten + +Ausweg: Deep Learning +- Wesen: + - Lernen von hierarchischen Features der Eingabedaten + - Jede Schicht lernt immer komplexere Features ausgehend von den Features der letzten Schicht +- Vorab-Design der Features ist damit nicht mehr erforderlich +- Direkte Ausnutzung von ungelabelten Daten durch unüberwachtes Lernen +- Bekannte Netzwerkarchitekturen: + - Covolutional Neural Networks (CNN) + - Stacked Auto-Encoder (SAE), Long Short-term Memories (LSTM), ... +- Netzwerkarchitekturen unterstützen auch überwachtes Lernen $\rightarrow$ damit auch Kombination von unüberwachtem mit überwachtem Lernen möglich + +#### Grundidee von Deep Learning +- Phase 1: Unüberwachtes Lernen der Feature-Hierarchie über den Bildern aller Kategorien (unüberwacht – da noch ohne Klassenlabels!) +- Phase 2: Überwachtes Fein-Tuning des Netzes – nun mit gelabelten Daten + +- erste Schicht: orientierte Kanten +- zweite Schicht: Objektteile +- Höhere Schichten: Ganze Objekte + +#### Deep Learning auf GPUs +- CPU: spezialisierte Kerne, für serielle Verarbeitung optimiert +- GPU: einfache Kerne, für parallele Verarbeitung optimiert +- Deep-Learning-Operationen sind meist einfache und leicht parallelisierbare Rechenoperationen (Add. und Mult.) +$\rightarrow$ Nutzung der GPU (z.B. Faltungen in CNN) +Beschleunigung des Lernens um Faktor 20-100 (statt 4 Wochen auf CPU $\rightarrow$ 1 Tag) + +#### “Challenges” beim Deep Learning +- Rolle der verwendeten Daten - gelernte Modelle können “biased” sein + - Beispiel: Gesichtserkenner von Microsoft, IBM, Face++ + - Männl. Gesichter (8,1 % Fehlerrate (FR)) besser erkannt als weibliche (20,6 % FR); Gesichter mit heller Hautfarbe besser erkannt (11,8 % FR) als Personen mit dunkler (19,2 % FR) $\rightarrow$ funktionierten am besten mit männl. Personen heller Haut + - Vermutung: Trainingsdatensatz bestand überproportional aus männlichen Gesichtern mit heller Hautfarbe +- Instabilität bei speziellen Rauschmustern - ”Adversarial Attacks” + - Adversarial Examples sind manipulierte Eingaben (Bilder, Sprache) mit der Fähigkeit, ein Deep Neural Network (DNN) zu täuschen, so dass das DNN die Eingabe falsch kategorisiert. + - Manipulation der Eingabe erfolgt meist durch spezielle Rauschmuster. + - Für den menschlichen Betrachter ist das Rauschen aber völlig irrelevant, hat keinen Einfluss auf die Erkennung. + +##### Adversial Attacks +Motivation: korrekt klassifizierte Bilder so verändern, dass das DNN das veränderte Bild einer falschen Klasse zuordnet, die Veränderung aber für einen Menschen nicht sichtbar ist. Böswilliger Einsatz: +- Täuschung sicherheitskritischer Systeme +- Google Bildersuche: Platzieren von eigenen Angeboten bei beliebten Suchbegriffen +- Manipulation von Assistenzsystemen beim Autonomen Fahren (z.B. Stoppschild als Vorfahrtsschild erkannt) + +# Neuronale Basisoperationen und Grundstrukturen +## Wichtige Neuronenmodelle +### Vorbild: Biologisches Neuron +Neuron: Erregungserzeugender, -leitender und –verarbeitender Grundbaustein des Nervensystems $\rightarrow$ elementarer cortikaler Prozessor. Kommunikation mittels elektr. Impulse (Aktionspotentiale, Spikes), die an Synapsen (Kontaktstellen zwischen zwei Neuronen) in Form chemischer Signale ( Neurotransmitter) weitergeleitet werden. +Wesentliche Informationen sind in +- der Spikerate (Dichte) +- dem Spikezeitpunkt (Phasenlage) +- der Effektivität der synaptischen Verbindung + +#### Struktur und Funktion der wesentlichen Neuronenabschnitte +| Neuronenabschnitte | Informationstechnische Funktion | +| ------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| 1. Synapsen | Gerichtete Informationsübertragung & -speicherung
(Adaptive Analogschalter; D/A-Wandlung der präsynaptischen Spikefolgen in analoge Membranpotentiale) | +| 2. Dendrit | Räumlich-zeitliche Integration & Weiterleitung
(Nichtlineare räumlich-zeitliche Überlagerung der lokalen dendritischen Membranpotentiale; Weiterleitung der lokalen Membranpotentiale (mit Verlusten, Verzögerungen und Laufzeiteffekten)) | +| 3. Soma | Globale räumlich-zeitliche Integration
(Integration aller dendritischen Potentiale zum Soma-Membranpotential) | +| 4. Axonhügel | Störsichere Umkodierung
(A/D-Wandlung des Somapotentials in Spikefolgen; Informationskodierung in Spikerate & Spikezeitpunkt) | +| 5. Axon | Informationsweiterleitung & -verteilung
(sichere, verlustfreie und energieoptimale Weiterleitung; aktive räuml.-zeitliche Umkodierung) | + +#### Das biologische Neuron aus informationstechnischer Sicht +Räumliche Kodierung (Position) $\rightarrow$ Kodierung von Qualitäten (Reizarten) + +Zeitliche Kodierung (Spikedichte, -phase) $\rightarrow$ Kodierung von Quantitäten (Reizintensität) und Synchronisation + +| Axonendigung | Synapse/Dendrit | Soma | Axonhügel/Axon | +| ------------------ | ------------------ | ------------------ | ------------------ | +| zeitkontinuierlich | zeitkontinuierlich | zeitkontinuierlich | zeitkontinuierlich | +| wertediskret | werteanalog | werteanalog | wertediskret | + +#### Abgeleitete Neuronenmodelle +- bislang zahlreiche Neuronenmodelle mit unterschiedlicher Biologietreue und Komplexität entwickelt +- wichtigste Vertreter mit abnehmendem Biologiebezug ↓ aber zunehmender Praxisrelevanz ↑ sind: + 1. Compartment Modell Neuronen (hier nicht weiter behandelt) + 2. Integrate & Fire Neuronen + 3. Dynamische Ratenneuronen (Leaky Integrator) + 4. Statische Ratenneuronen +- bei diesen Neuronenmodelle Vernachlässigung verschiedener biologisch relevanter Aspekte, wie z.B.: + - reale Geometrie des Neurons (mit seinen Verästelungen im Dendriten/Axon) + - Leitungsverzögerungen an den Synapsen und im Dendriten + - nichtlineare Wechselwirkungen zwischen den postsynaptischen Potentialen (PSP) + - der realen Form der präsynaptischen Aktionspotentiale $\rightarrow$ Annahme von Dirac-Impulsen ( δ(t)=1, wenn t = t spike ; δ(t)=0, wenn t ≠ t spike ) + - der realen zeitlichen Funktionalität des Neurons $\rightarrow$ wird komplett in die Synapse verlagert + +### Das Integrate & Fire (I&F) Neuron +- Kommunikation zwischen Neuronen erfolgt über Spikes (zeitkontinuierlich, wertediskret) +- Verarbeitung innerhalb des Neurons erfolgt analog auf Potentialniveau (zeitkontinuierlich, wertekontinuierlich) +- Spikekodierung stellt die Zeit als zusätzliche Kodierungsdimension für neuronale Wahrnehmungsprozesse zur Verfügung: + 1. zeitlicher Abstand von Ereignissen in Bezug zu anderen Ereignissen $\rightarrow$ Phasenlage + 2. Häufigkeit der Ereigniswiederholung $\rightarrow$ Frequenz + 3. Zeitverlauf der Änderung von Aktivitätsparametern $\rightarrow$ Frequenzänderung + +Zeitliche Synchronisation mit I&F-Neuronen +- Gehirn scheint zeitliche Synchronisationsprozesse von Einzelspikes oder Bursts (Spikepakete) als ein Attributierungsmittel zu nutzen +- „virtuelle“ Kopplung zusammengehöriger Neuronen durch zeitliche Phasensynchronisation ihrer Aktivitäten auch über große räumliche Entfernungen +- damit Kennzeichnung der Neuronen eines „Perzepts“ durch synchrones, korreliertes Feuern – Neuronen anderer „Perzepte“ feuern zu diesen unkorreliert $\rightarrow$ „Correlation Theory of Brain Function“ + +Technische Umsetzung von I&F-Neuronen +- präsynaptische Spikes erzeugen gewichtete postsynaptische Potentiale (PSP) +- PSPs werden zeitlich und räumlich integriert $\rightarrow$ Somapotential +- wenn Somapotential >= Schwelle $\rightarrow$ Generierung eines Spike (Aktionspotential) +- Afterhyperpolarisation (AHP) hemmt für bestimmte Zeit weiteres Feuern + +Typische Einsatzfelder von I&F-Neuronen +- in der Computational Neuroscience, wo sie zur systematischen Untersuchung von Gehirnfunktionen verwendet werden +- oft auch für mathematische Analysen von Gehirnfunktionen verwendet +- oft in Simulationen von Neuronalen Netzwerken eingesetzt, da sie durch ihre Einfachheit auch bei großen Netzen mit vielen Neuronen nur wenig Rechenzeit verbrauchen + +[comment]: <> (Vorlesung 4) +### Das formale dynamische Ratenneuron (Leaky Integrator) +- Ein- und Ausgänge werden interpretiert als zeitveränderliche mittlere Spikefrequenzen bzw. Spikeraten -> dynamisches Ratenneuron +- „Leaky Integrator“ steht für einen verlustbehafteten Integrator +- Approximation der Vorgänge an der Synapse (Gewichtsfunktion) als einfache Exponentialfunktion + +#### Aktivierungs- bzw Zustandsfunktion $z(t)$ +- zeitliche Summationseffekte werden vollständig in die Synapsen verlagert +- Annahme identischer Gewichtsfunktionen g(t) in allen Synapsen +- Somapotential (Aktivierung/Zustand) z(t) ergibt sich durch räumliche Summation aller lokalen PSPs $z_i(t)=\sum_{j=1}^1 w_{ij}(x_j(t)*g(t))$ +- Zeitverhalten des Neurons kann im einfachsten Fall beschrieben werden durch eine lineare DGL 1. Ordnung (ohne Herleitung hier): $\tau * z'_i(t)=-z_i(t) + \sum_{j=1}^1 w_{ij}x_j(t)$ + +#### Die Ausgabefunktion $y = f(z)$: +- dient der Umsetzung der internen Aktivierung zi(t) in eine mittlere Output-Spikefrequenz yi(t) +- erfolgt meist in einem nichtlinearen Zusammenhang, da Nachbildung + - einer unteren Schwelle erforderlich, die überschritten werden muss, um ein Neuron überhaupt zum Feuern zu veranlassen + - einer oberen Schwelle erforderlich, die eine maximale Spikefrequenz wegen der vorhandenen Refraktärzeiten modelliert +- Zusammenhänge werden durch nichtlineare Ausgabefunktionen, berücksichtigt, wie z.B. die Fermifunktion (-> Ausgabefunktionen) + +#### Typeische Einsatzfelder +- **Neuronale Oszillatoren** zur zeitlichen Synchronisation von Erkennungsvorgängen +- **Rekurrente Neuronale** Netze zur Speicherung und Erkennung zeitlicher Zusammenhänge + +### Das formale statische Ratenneuron +- Abgeleitet vom dynamischen Ratenmodell - vollständige Vernachlässigung der zeitlichen Funktionalität des Neurons, insbes. der dynamischen Übergangsvorgänge an den Synapsen +- formales statisches Neuron ist dynamisches Neuron im stationären Zustand, d.h. Vernachlässigung der zeitlichen Übergänge infolge Änderungen des Inputs +- Ein- und Ausgänge werden interpretiert als statische mittlere Spikefrequenzen bzw. Spikeraten -> Ratenneuron + $$z_i = \sum_{j=1}^n w_{ji}*x_j$$ +- Einsatz in vielen neuronalen Standardnetzen (z.B. Multilayer Perzeptron - MLP) +- Modell ist für eine biologienahe Modellierung allerdings zu grob + +#### Die Aktivierungs- bzw. Zustandsfunktion +Definition: Lineare oder nichtlineare Abbildungsvorschriften des Eingabevektors x über den Gewichtsvektor $w_i$ auf die Aktivierung $z-i$ des Neurons i + +##### Distanzbasierte Aktivierungen - lokal operierende Aktivierungsfunktionen +Vektornormen: + - Allgemeine p- bzw L-Norm von d: $||d||_p = (\sum_{j=1}^n |d_j|^p)^{\frac{1}{p}}$ + - Betragssummennorm bzw. Manhatten-Norm (L = p = 1): $||d||_1 = \sum_{j=1}^n |d_i|$ + - Euklidische Norm (L = p = 2): $||d||_2 = \sqrt{\sum_{j=1}^n |d_j|^2}$ + - Maximumnorm (L = p = $\infty$): $||d||_{\infty} = max |d_j|$ + +- Euklidische Distanz $z_i(w_i,x)=||x-w_i||$ +- Maximum Norm $z_i(w_i,x)=max|x_j - w_{ij}|$ +- Minimum Norm $z_i(w_i,x)=min|x_j - w_{ij}|$ +- Mahalanobis Distanz $z_i(x,w_i,C_i)= \sqrt{(x-w_i)^T * C_i^{-1} * (x-w_i)}$ mit $w_i=\frac{1}{N}\sum_{p=1}^N x^{(p)}$ und $C_i= \frac{1}{N}\sum_{p=1}^N (x^{(p)} - w_i)(x^{(p)}- w_i)^T$ + +**Mahalanobis Distanz** +- statistisch korrigierte Euklidische Distanz des Vektors x von einem Schätzmodell der Klasse (beschrieben durch w und C) +- w: Mittelwertvektor aller N zur Klasse gehörenden Inputvektoren x(p) der Lernstichprobe +- C: Kovarianzmatrix aller N zur Klasse gehörenden Inputvektoren x(p) der Lernstichprobe, (für mittelwertfreie Inputvektoren wird aus der Kovarianzmatrix die Korrelationsmatrix) + +**Zusammenfassung** Wichtige Aktivierungsfunktionen für Neuronale Netze +- Skalarprodukt $z(x,w)=\sum_{j=1}^n x_jw_j$ +- Euklidische Distanz $z(x,w)=\sum_{j=1}^n \sqrt{\sum_{j=1}^n |x_j - w_j|^2}$ +- Maximum Distanz $z(x,w)=max|x_j-w_j|$ +- Minimum Distanz $z(x,w)=min|x_j-w_j|$ +- Mahalanobis Distanz $(x,w)=\sqrt{(x-w)^T * C^{-1} * (x-w)}$ +- Manhatten Distanz $z(x,w)=\sum_{j=1}^n |x_j - w_j|$ + +#### Die Ausgabefunktion +Grundidee: Wie verhält sich die Ausgangsaktivität $y_i=f(x,w_i)$ (mittlere Spikerate) in Abhängigkeit von der internen Aktivierung $z_i$? + +1. Identitätsfunktion $y_i=z_i$ +2. Stufenfunktion $y_i = f(z_i) = \begin{cases} 0: z_i \leq T \\ 1: z_i > T \end{cases}$ +3. Sigmoid Funktionen (Squashing functions, S-shaped functions) + - Klasse nichtlinearer, kontinuierlicher, stetiger und stetig differenzierbarer Abbildungsfunktionen + - modellieren gut neurophysiologisch beobachtbare Sättigungseffekte + - erlauben parametrische Steuerung der Ausgabefunktion (Schwelle, Steilheit) + - Fermifunktion $y_i=f(z_i,c)= \frac{1}{1+e^{-c*z_i}}$ + - Gut durch maximale Spikerate des biologischen Neurons motiviert -> bis vor wenigen Jahren sehr verbreitet + - für $c > 0$ ist $f(z)$ im gesamten DB monoton wachsend + - Vorteil + + f(z) im gesamten Definitionsbereich $z \in (-\infty, \infty)$ stetig + + f(z) ist stetig differenzierbar + - Nachteil + - Gradienten werden im "Sättigungsbereich" extrem klein + - Ausgabefunktion ist nicht 0-zentriert -> bei nicht zentrierten Daten werden Gradienten der Eingabegewichte immer alle positiv oder alle negativ + - Berechnung der e-Funktion ist rechenaufwändig + - Hyperbol. Tangens $y_i=tanh(z_i)=\frac{e^{z_i}-e^{-z_i}}{e^{z_i}+e^{-z_i}}$ + - f(z) im gesamten DB monoton wachsend + - Vorteile + + f(z) im gesamten Definitionsbereich $z \in (-\infty, \infty)$ stetig + + f(z) ist stetig differenzierbar + + Funktion ist 0-zentriert + - Nachteil + - Gradienten werden im „Sättigungsbereich“ extrem klein + - Berechnung rechenaufwändig +4. Rectified Linear Unit (ReLU) $y_i = f(z_i) = max(0,z_i)$ + - Aktivierung z wird bei 0 gekappt + - Effektive Berechnung: $y_i = f(z_i) = 0,5*z_i + 0,5 * |z_i|$ + - Vorteil + + differenzierbar + + beschleunigt die Konvergenz des Gradientenabstiegs im Vergleich zu Fermi-Funktionen um den Faktor 6 -> wegen des linearen, nicht gesättigten Verlaufs + + lässt sich sehr leicht implementieren und schnell berechnen + - Nachteil + - Ausgabefunktion ist nicht 0-zentriert + - ReLU Neuronen können während des Trainings “sterben” infolge eines starken Gradientenflusses, der zu einem solchen Gewichtsupdate führt, dass das Neuron durch keinen Input mehr aktiviert werden kann -> Ausgabe für alle Inputs 0 -> Lernen nicht mehr! + 4.1 Leaky ReLU $y_i=f(z_i)=max(0,01z_i,z_i)$ + + Neuronen können nicht „sterben“ +5. Gaußfunkion $y_i=f(z_i)=e^{-\frac{z_i^2}{2\sigma ^2}}$ Ableitung: $/frac{dy_i}{dz_i}=-\frac{1}{\sigma ^2}* z_i * y_i$ +6. Radiale Basisfunktion (RBF) $y_i=f_i(x,w_i,\sigma_i)= exp(-\frac{||x-w_i||^2}{2\sigma_i^2})=exp(-\frac{z_i^2}{2\sigma_i^2})$ + - $\sigma_i$: Breite (Standardabweichung) der Gaußverteilung des Neurons + - $w_i^T$: Mittelwertvektor von i + - Jede einzelne Radiale Basis Funktion $f_i$ definiert ein sphärisches rezeptives Feld im Merkmalsraum $R^n$ + - $w_i$ zentriert das rezeptive Feld + - $\sigma_i^2$ lokalisiert das rezeptive Feld +7. Ellipsiodale Basisfunktion (EBF) $y_i=f_i(x,w_i,C_i)=exp(-\frac{1}{2}(x-w_i)^T * C_i^{-1} * (x-w_i))$ + - für beliebige Kovarianzmatrizen des Inputdatensatzes X + - basiert auf der Mahalanobis-Distanz $d_m^2(x, w_i, C_i)$ + +[comment]: <> (Vorlesung 5) +### Das formale statische Neuron als linearer Klassifikator +**Ziel**: +1. Suche nach einer Trenngeraden (Klassengrenze), die Punktemengen trennt +2. Automatische Klassifikation unbekannter Datenpaare durch Bestimmung ihrer Lage bezüglich der Klassengrenze + +**Vorraussetzung**: Trennung der Klassen durch Gerade möglich -> lineare Seprarierbarkeit + +**Bestimmung der Trenngeraden**: +1. Geometrische Bestimmung aus der Datenverteilung +2. Belehrung des Neurons mit kategorisierten Trainingsdaten -> Lernen + +**Implementierungstrick**: zur Verschiebung der Trenngeraden aus dem Ursprung -> Einführung einer variablen Schwelle, die durch ein Bias-Neuron realisiert wird + +**Begrifflichkeit**: +- für $R^2$ -> Trenngeraden +- für $R^3$ -> Trennebenen +- für $R^4$ -> Hyperebenen +- für $R^n$ -> (n-1)-dim. Hyperebenen + +## Wesentliche Neuronentypen und deren Einsatz +1. Statisches Ratenneuron (-> Adaline Netz) + - Skalaproduktaktivierung + - Lineare Ausgabe +2. Statisches Ratenneuron (-> binäres Hopfielnetz) + - Skalaproduktaktivierung + - Binäre Ausgabe +3. Statisches Ratenneuron (-> MLP-Netzwerk) + - Skalaproduktaktivierung + - Ausgabe: Sigmoidfunktion +4. Statisches Ratenneuron (-> RBF-Netzwerk) + - Distanz- /Normaktivierungsfunktion + - Ausgabe: Gaussfunktion +5. Statisches Ratenneuron mit Zeitfenster (-> TDNN-Netzwerk) + - Skalaproduktaktivierung + - Ausgabe: Sigmoidfunktion +6. Dynamisches Ratenneuron (-> Jordan Netz) + - Skalarproduktaktivierung + - Leaky Integrator (PT1 - Verhalten) + - Ausgabe: Sigmoidfunktion +7. Integrate-and-Fire (Spiking) Neuron + - Skalarproduktaktivierung + - Leaky Integrator (PT1 - Verhalten) + - Ausgabe: Delta-Impulse (Spikes) +8. ReLu Neuron (-> Deep Neural Networks) + - Skalarproduktaktivierung + - ReLU Ausgabe + +# Neuronale Netzwerkmodelle +**Aufgabe**: Verbinde die vorhandenen Neuronen in geeigneter Weise, um ein neuronales Netz zu erzeugen +## Typische Netzwerk-Topologien und Begriffe +- homogene oder strukturierte Netzwerke +- vollständige oder partiell-verkoppelte Netzwerke +- feed-forward oder rekurrente Netzwerke +- Netzwerke mit fester oder variabler Neuronenzahl + +Fan-In: mittlere Anzahl der auf ein Neuron konvergierenden Verbindungen\ +Fan-Out: mittlere Anzahl der von einem Neuron abgehenden (divergierenden) Verbind. + +## Homogene vs. Strukturierte Netze +| Homogene Netze | Strukturierte Netze | +| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| sehr formaler und gleichmäßiger Aufbau | erlauben Integration von strukturellem Wissen über spezifische lokale Verschaltungen und lokale räumliche Zusammenhänge (z.B. bei Bildinformationen) | +| reguläre Netzwerkstruktur | zeigen damit einen stark strukturierten Aufbau | +| als feed-forward oder als rekurrente Netze | Gibt es als feed-forward oder auch als rekurrente Netze | +| spezielles strukturelles Wissen über lokale Verschaltungen wird darin nicht berücksichtigt | | +| es gibt kaum biologische Entsprechungen | | + +## Vollständig vs partiell rekurrente Netze +| Vollständig rekurrente Netze | Partiell rekurrente Netze | +| :---------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | +| jedes Neuron ist mit jedem anderen Neuron des Netzes verschaltet | ein Teil der Neuronen des Netzes koppelt Aktivität in das Netz zurück | +| Einsatz als Autoassoziativspeicher (siehe Kap. B-3) zur Speicherung von Mustern | typischerweise Einsatz zur Repräsentation und Verarbeitung zeitlicher Zusammenhänge in Datensequenzen (z.B. Signalverläufe, Videosequenzen) | +| erlaubt Wiedererkennung (Rekonstruktion) verrauschter oder unvollständiger Eingangsmuster | Einsatz von dynamischen Neuronen als Kontextneuronen | +| | Beispiele: Jordan/Elman Netzwerk | + +## Netze mit fester oder variabler Neuronenzahl +| Feste Neuronenzahl | Variable Neuronenzahl | +| :----------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | +| Netztopologie (Anzahl Schichten, Neuronen, Verbindungen) vorab definiert | Netztopologie (Anzahl Neuronen und Verbindungen) vorab unbekannt | +| sehr formaler Aufbau mit typischer Schichtabfolge | Netzwerk erhöht oder reduziert die Anzahl der Neuronen und Verbindungen in Abhängigkeit von datenabhängigen internen Repräsentationsfehlern | +| als feed-forward oder als rekurrente Netze | meist als als feed-forward Netze | + +## Das Multi-Layer Perzeptron (MLP) als typisches vollständig verschaltetes Feed-forward Netz + +siehe Bild + +## Convolutional Neural Network (CNN) als typisches strukturiertes Netz +- Neuronen sind so angeordnet, dass sie auf überlappende Bereiche reagieren -> realisieren Faltungen (Convolutions) +- Jede Schicht eines Volumens basiert auf gelernten Faltungskernen -> bildet sogenannte Feature Maps +- Häufig Verwendung von Subsampling-Layern (Pooling (Bündelung)), die die Dimension des Outputs reduzieren und Invarianzleistungen realisieren + +Was sind Faltungsoperationen zwischen den Schichten? +- Neuronen sind lokal verschaltet und teilen sich Gewichte + - reagieren auf überlappende Bereiche des Inputs + - kann als diskrete Faltung interpretiert werden + - Faltung ersetzt Skalarproduktaktivierung +- bilden State-of-the-Art für viele Herausforderungen im Umgang mit Bildern, dafür: + - Erweiterung auf dreidimensionale Datenstrukturen (Farbkanal, Höhe, Breite eines Bildes) + -> lokaler Zusammenhang im Bild bleibt erhalten + +### 1. Faltungs-Schichten +- Neuronen des Volumens (l) sind lokal begrenzt mit dem Vorgängervolumen (l-1) verschaltet +- Skalarproduktaktivierung -> Summe der Faltungsergebnisse über Volumen (l-1) +- Gewichte zwischen Neuronen der Feature-Map -> in Volumen (l) sind geteilt (shared) +- -> identische Verknüpfung für alle Neuronen in einer Feature-Map p +$$z^{l}(p,u,v)= \sum_{k=0}^{m^{l-1}} \sum_{i=0}{d_1-1} \sum_{j=0}^{d_2-1} o^{l-1} (k,u + i,v + j) * w^{(l)} (p,k,i,j)$$ +$$Z^{(l)}(p)= \sum_{k=0}{m^{l-1}} O^{l-1}(k)** W^l(p,k)$$ +"Teilbild I * Filter W" + + +Beispiel für Berechnung einer kompletten Output-Feature-Map +- in CNN: Summation einzelner Faltungsergebnisse +- zusätzlich: gemeinsames Bias-Gewicht 􀡮 für alle Elemente der gleichen Output-Feature-Map und lineare Ausgabe + +**Padding**: Erweitern der Input-Feature-Maps um p Randpixel (z.B. Nullen) + +### 2. Pooling-Schicht +- dient der Bündelung von mehreren semantisch ähnlichen Features zur: + - Verbesserung der Robustheit der gelernten Repräsentationen (Invarianzen) + - Reduzierung des Rechenaufwandes in den anschließenden Schichten +- Output-Volume wird sequentiell über die Ausgaben der einzelnen Feature-Maps bestimmt +- Ausgabe $O_p$ der p-ten Output-Feature-Map: $O^l_p = downsample(O_p^{l-1}, g_l)$ -> Reduktion erfolgt ohne zu lernende Parameter + +Arten Pooling-Schichten +- Max-Pooling: Bestimmung des Maximums pro Pooling-Bereich +- Average-Pooling: Bestimmung der Mittelwerte des Pooling-Bereiches + +- **Stride**: Größe der vertikalen bzw. horizontalen Verschiebung während Bündelung +- **Padding**: Erweitern des Input-Feature-Maps um p Randpixel (z.B. Nullen) + + +# Lernparadigmen und deren klassische Vertreter +## Unsupervised Learning +[comment]: <> (Vorlesung 6) +Wesen: +- Lernen ohne externe Überwachung, d.h. kein expliziter Lehrer +- Lernen erfolgt rein datengetrieben in Abhängigkeit von der Statistik der Inputdaten in der Lernstichprobe +- Beim Lernen wird der kontinuierliche Eingaberaum in eine endliche Anzahl von Zuständigkeitsgebieten (-> Voronoi-Regionen) unterteilt / geclustert. +- Dies erfolgt nicht uniform sondern in Abhängigkeit von der Wahrscheinlichkeitsdichteverteilung (WDV) der Inputdaten +$\rightarrow$ Vektorquantisierung des Eingaberaums + +Ziel des Lernens: fehlerminimale Quantisierung des kontinuierlichen Eingaberaums mittels geeignet platzierter Referenzvektoren $w_r$ in eine endliche Anzahl von diskreten Zuständigkeitsgebieten + +### Vektorquantisierung bzw. Voronoizerlegung +- Anzahl der über den Inputdaten zu positionierenden Referenzvektoren +- dichtere Platzierung in Gebieten mit hoher Inputdichte -> statistischer Lernprozess +- Verbindungslinien zwischen benachbarten Referenzvektoren -> Delaunay-Triangulation +- Regionengrenzen werden durch die Mittelsenkrechten auf diesen Verbindungslinien gebildet -> Voronoi-Tesselation +- Jedes Voronoi-Gebiet bildet eine konvexe Zuständigkeitsregion (abgeschlossen oder unbeschränkt) für den betreffenden Referenzvektor + +#### Optimale Vektorquantisierung +Im $\R^2$ erlaubt nur ein hexagonales Raster fehlerminimale Quantisierung! Suche nach den optimal platzierten Referenzvektoren $w_r$ mit ihren zugehörigen Voronoi-Regionen, die eine Quantisierung des Eingaberaumes mit minimalem Quantisierungsfehler E ermöglichen +$E = \frac{1}{N} \sum_{p=1}^{N} || x-w_{r} ||$ mit r als zuständiges Neuron + +Ermittlung der Lage der Referenzvektoren und der zugehörigen Voronoi-Regionen über unüberwachte Lernprozesse in Neuronalen Netzwerken und mit statistischen Algorithmen. + +#### Typische Vertreter +- Self-Organizing Feature Maps (SOFM) bzw. Kohonen-Maps +– Neural Gas +– Growing Neural Gas (U) +– Learning Vector Quantization (U) +– k-Means-Algorithmus + +### Topografische Merkmalskarten – wichtige Organisationsstrukturen des Gehirns +- Wesentliche Cortexregionen (visuell, auditorisch, somatosensorisch, sensomotorisch) zeigen topografische, d.h. nachbarschaftserhaltende Organisationsprinzipien, z.B. + - Abbildung benachbarter Rezeptoren auf der Retina -> auf benachbarte Neuronen im primären visuellen Cortex + - Abbildung benachbarter Rezeptoren auf der Basilarmembran des Innenohres -> auf benachbarte Neuronen im auditorischen Cortex + - Abbildung benachbarter Rezeptoren auf der Hautoberfläche auf benachbarte Neuronen im somatosensorischen Cortex +- Wesen: räumlich benachbarte Rezeptoren sind mit räumlich benachbarten Neuronen im Cortex verbunden +- Grundprinzip topologischer Abbildungen: Umsetzung von Signalähnlichkeiten im Eingaberaum in Lagenachbarschaften der Neuronen des Ausgaberaumes + +#### Die somatosensorische Projektion – Beispiel einer topologieerhaltende Abbildungen +- Darstellung der Somatotopie im somatosensorischen Cortex SI. +- eingezeichnete Symbole und Beschriftung sollen die räumliche Zuordnung zwischen Körperoberfläche und Cortex verdeutlichen, wie sie mit lokaler elektrischer Hirnreizung bei wachen Patienten ermittelt wurde. +- Das Grundprinzip einer topolgieerhaltenden Abbildung, die Nachbarschaftserhaltung, wird deutlich: Lagenachbarschaften auf der Körperoberfläche werden auf räumliche Nachbarschaften in den zuständigen cortikalen Bereichen abgebildet. + +#### Vorteile nachbarschaftserhaltender Abbildungen +- Lagenachbarschaft ist ein Optimalitätsprinzip der Informationsverarbeitung + - erzeugt den geringsten Kommunikationsaufwand + - garantiert geringste Signallaufzeiten + - damit ist räumliche Kooperation zwischen benachbarten Neuronen möglich -> Robustheit, kollektives, verteiltes „Rechnen“ +- Optimale Ressourcenverteilung bei der Abbildung vom Ein- in den Ausgaberaum +- Ermöglichen bei begrenzten neuronalen Ressourcen eine optimale Quantisierung des Eingabesignalraumes (-> Voronoi-Parzellierung) +- Zuordnung der Voronoi-Regionen erfolgt durch unüberwachte, d.h rein datengetriebene Lernprozesse, die die Wahrscheinlichkeitsdichteverteilung der Inputdaten berücksichtigen. + +### Self-Organizing Feature Maps (SOFM) +Ziel: Selbstorganisation einer topologieerhaltenden Abbildung des n-dimensionalen Eingangsraumes $R^n$ auf eine m-dimensionale neuronale Kohonenkarte $R^m$ mit einer vorgegebenen Gitterstruktur + +#### Der Kohonen-Lernalgorithmus +- Bereitstellung des Trainingsdatensatzes $X = (x^{1}, x^p, ..., x^N)$ +- Festlegung der Netztopologie und der Dimensionalität des Kohenengitters zur Abbildung $R^n \rightarrow R^m$, bestimmt Art der Gewichtsmatrix $W= (w_{rs})$ zwischen Eingangsraum und Kohonenkarte + - a Empfänger-Sender-Schreibweise + - r - Positionsvektor des Neurons in der Kohonenkarte (response) + - s - Positionsvektor des Inputs im Eingangsraum (stimulus) + - b Probleme durch Dimensionsreduktion  Topologiedefekte infolge falsch dimensionierter Kohonengitter (siehe später) +- Festlegung der Präsentationsart der Trainingsdaten (zufällig/ zyklisch) +- Bei Bedarf geeignete Neuzusammenstellung des Trainingsdatensatzes (Reihenfolge, Häufigkeit) +- Festlegung der maximalen Anzahl von Lernzyklen tzyk (bei vollständigen X-Präsentationen) bzw. von Lernschritten $t_{max} =N * t_{zyk}$ +- Festlegung der Lernparameter und Abbruchkriterien + +Ablauf: +1. Gewichtsinitialisierung der $w_rs$: + - ohne a-priori-Wissen über Problem und Eingangsraum meist zufällige Anfangswerte, z.B. $w_{rs}\in [-0.1,+0.1]$ + - mit a-priori-Wissen definierte Anfangswerte (siehe späteres Beispiel TSP) +2. Stimulusauswahl: + - Auswahl eines Inputvektors $x^p$ aus dem Inputdatensatz X +3. Response + - Bestimmung des Best-maching Neurons r´ mit der geringsten euklidischen Distanz zwischen $w_{r´}$ und $x^p$ + $||w_{r'}-x^p|| = min||w_r-x^p||$ + - Festlegung des B-M-Neuron r´ als Zentrum einer lokalen Lernumgebung $h_{rr´}$, beschrieben durch eine geeignete Nachbarschaftsfunktion, z.B. $h_{rr'}=h_0 exp(\frac{||r-r'||^2}{2\sigma^2(t)})$ +4. Stimulusgetriebene Adaption der Gewichte des B-M-Neurons und der Neuronen aus seiner lokalen Nachbarschaft: $w_r(t+1)=w_r(t)+\eta(t) * h_{rr'}(t)(x^p -w_r(t))$ +5. Zeitliche Veränderung der Lernrate $\eta(t)$ und des Nachbarschaftsradius $\sigma(t)$ der Nachbarschaftsfunktion $h_{rr´}(t)$. + Zwei Varianten gebräuchlich: + - konstante Lernrate $\eta(t)=konst.$ + - Verringerung der Lernrate (über Abkühlungsprozess) + rekursives Verfahren sinnvoll: $\sigma(t)=\sigma(t-1)*\alpha$ mit $\alpha=(\frac{\sigma_E}{\sigma_A})^{\frac{1}{t_max}}$ +6. Datensatz X vollständig präsentiert? Nein: next p($p=p+1$ oder $p=rand(N)$) => 2. +7. Abbruchkriterium $t\geq t_{max}$ erfüllt? Nein: next p ($p=1$ oder $p=rand(N)$) => 2. +8. Ende + +Geometrisch interpretiert ist eine 1-D Kohonenkarte zum Ring geschlossen. +Die Neuronen des Kohonengitters sind auf einer 2D-Karte angeordnet. Sie sind mit ihren lokalen Nachbarschaften auch über Kartengrenzen hinweg voll vernetzt, indem die Verbindungen an den Enden umschlagen. Dadurch ergibt sich die Topologie eines Torus. + +##### Visualisierung des SO-Prozesses +- Gewichtungen $w_{rs}$ jedes Neurons (Referenzvektoren) werden als Punkte im Inputraum $R^n$ interpretiert +- unmittelbar im Kohonen-Gitter benachbarte Neuronen können ihre Referenzvektoren im Inputraum durch eine Gerade verbinden +- Abbildungsprobleme bei Dimensionsreduktion $R^n \rightarrow R^m$ mit $m (Vorlesung 7) +##### Einsatzgebiete topologieerhaltender SOFM +Lösung von Optimierungsproblemen – das Traveling Salesman Problem (TSP) + - Gesucht: kürzeste geschlossene Tour durch M vorgegebene Städte + - bei M Städten – durch Permutation (Anordnung der Städte innerhalb der Tour unter Beachtung der Reihenfolge) -> maximal M! verschiedene Touren + - da + - a jede Stadt Ausgangspunkt einer Tour sein kann und + - b jede Tour in zwei verschiedenen Richtungen zurückgelegt werden kann + ergeben sich 2*M Touren mit gleicher Weglänge + - $(M-1)/2$ verschiedene geschlossene Routen + - Rechenaufwand: steigt mit der Fakultät der Problemgröße (Anzahl der Städte) -> wächst damit noch viel stärker als exponentieller Rechenaufwand (für n>6), z.B. + - bei 10 Städten: 181 440 Touren + - bei 20 Städten: 6,08 1016 Touren (selbst auf einer 1 GFLOPS Maschine ca. 35 Tage) + - bei 30 Städten: 4,4 1030 Touren (auf einer 1 GFLOPS Maschine ca. 4000 Mrd. Jahre) (Core i7, 3.4 GHz, 4 Kerne ca. 100 GFLOPS) + - Fazit: TSP ist ein NP-vollständiges Problem, da es exponentiell wachsenden Rechenaufwand hat, für eine Beispiellösung aber schnell, d.h. mit polynomialem Rechenaufwand verifiziert werden kann + - Lösungsansatz mit SOFM: + - Suche nach kürzester Route durch selbstorganisierende Platzierung der Referenzvektoren einer zu einem Ring verschalteten 1D-Neuronenkette im 2D-Inputraum + - Städte fungieren als Inputdaten, die die Verteilung der Voronoi-Regionen sowie der zugehörigen Referenzvektoren bestimmen + - Grundprinzip und Ablauf: + - Jedes Neuron mit 2 Gewichten -> Ortskoordinaten in der Ebene + - Initialisierung der Gewichtsvektoren mit definierten Anfangswerten (Kreisring) mit Anzahl der Neuronen + $$w_{rx}=0,35*cos(\frac{2\pi r}{N})+0,5$$ + $$w_{ry}=0,35*cos(\frac{2\pi r}{N})+0,5$$ + - pro Lernschritt zufällige Auswahl einer Stadt als Input + - Selektion des B-M-Neurons -> Gewichtsadaption für B-M-Neurons & Nachbarn + +Visualisierung semantischer Beziehungen – die semanto-topografische Abbildung + - Grundidee: Nachbildung kognitiver Fähigkeiten durch Erzeugung von neuronalen Karten, die auch semantische Beziehungen zwischen Objektbegriffen widerspiegeln können + - Beispiel: + - Erlernen von Ähnlichkeitsbeziehungen zwischen Tierarten + - Eingabekodierung: Beschreibung der Tierarten über charakteristische Merkmale mittels einer Merkmalsmatrix + - Probleme der SOFM + - Kriterium: Optimalität der Verteilung der Gewichtsvektoren im Eingangssignalraum + Quantisierungsfehler: $E=\frac{1}{N}\sum_{p=1}{N}||x-w_{r'}||$ + - Nachteile des Algorithmus + 1. Lernphase erfordert zunächst erhebliche Zahl von Lernschritten zur Entfaltung des Kohonengitters – Herausbildung einer topologischen Grundordnung des Netzwerkes (-> Zeitaufwand, Kosten) + 2. Topologische Struktur des Kohonengitters muss der topologischen Struktur der zu repräsentierenden „Untermannigfaltigkeit“ des Eingabesignalraumes entsprechen + -> erfordert a priori Informationen (nicht immer vorhanden) über Verteilung der Eingabesignale, z.B. in Häufungsgebieten + -> Struktur des Eingabesignalsraumes kann topologisch derart kompliziert sein, dass Netzdesign praktisch unmöglich ist + - Repräsentationsprobleme bei inhomogen strukturierter Untermannigfaltigkeit des Inputraumes (Verknüpfung von voneinander separierten Unterräumen verschiedener Dimensionalität) + - tritt auf, wenn Topologie des Kohonennetzes von der Topologie der Datenpunktmannigfaltigkeit abweicht -> erzeugt suboptimale Verteilung der Referenzvektoren + - wegen Gitterorganisation des Kohonennetzes ist Positionierung im Raum zwischen den Teilmannigfaltigkeiten möglich -> damit ungenutzte Kodierungsressourcen + - Abbildung weit vom Optimum entfernt, da unvollständige Verwendung des verfügbaren Satzes von Referenzvektoren + +### Das "Neural Gas" Lernparadigma +Unterschiede zum Kohonen-Lernalgorithmus: +- anstatt Verwendung der Nachbarschaftsrelationen der Gewichtsvektoren im externen Kohonengitter – Verwendung der Nachbarschaftsrelationen der Gewichtsvektoren im Eingangssignalraum zur Adjustierung der $w_i$ +- anstatt Verwendung der Distanz des Gewichtsvektors $w_i$ zum Input $x^p$–Bestimmung des „Distanzranges“ des Gewichtsvektors $w_i$ unter Berücksichtigung aller anderen Gewichtsvektoren $w_j$ +Grundprinzip: +- ausschließliche Berücksichtigung von Nachbarschaftsrelationen im Eingangssignalraum -> „gasähnliche“ Dynamik der Gewichtsvektoren (ohne Verankerung in einem festen Gitter) +- Bestimmung einer Distanz- oder Nachbarschaftsrangfolge +- Adjustierung des dem Input ähnlichsten Gewichtsvektors $w_{i0}$ sowie der in der Distanzrangfolge nächsten Gewichtsvektoren -> ergibt eine wesentlich effizientere Quantisierung des Eingabesignalraumes +- Wertung: ermöglicht Generierung einer perfekt topologieerhaltenden Gewichtsverteilung zur Vektorquantisierung des Eingangssignalraumes + +#### "Neural Gas" Lernalgorithmus +1. Initialisierung der Gewichtsvektoren $w_i(i = 1, ..., m)$ +2. Stimulusauswahl: Auswahl eines Inputvektors $x^p$ aus X +3. Response: + Bestimmung der Distanz- oder Nachbarschaftsrangfolge aller m Gewichtsvektoren wi bezüglich des aktuellen $x^p$ + \rightarrow $k_i(x^p, W)$ – Distanzrang von $w_i$ bezüglich $x^p$ ($k_i = 0$ für $w_i^0; k_i = 1$ für $w_i^1$) + \rightarrow jedes $k_i(x^p, W)$ hängt neben $x^p$ von allen anderen aktuellen Referenzvektoren $w_i$ ab -> während des Lernens damit ständige Umordnung der Rangfolge (auch bei gleichen Inputs) +4. Adaption der Referenzvektoren + $$\delta w_i = \eta(t)* h_{\lambda}*(x^p - w_i)$$ +5. Datensatz X vollständig präsentiert? Nein: next $p(p=p+1$ oder p=rand(N)) => 2. +6. Abbruchkriterium $t\geq t_{max\$ erfüllt? Nein: next $p(p=1$ oder p=rand(N)) => 2. +7. Ende + +##### Quantisierung komplexer Inputräume mit NG +Wesen: Lernvorgang zeigt eine gasähnliche Dynamik, d.h. ein Verhalten wie das von Molekülen im Schwerefeld der Untermannigfaltigkeiten mit untereinander abstoßender Kraftwirkung + +Vorteil: gridfreie Netzwerkstruktur und topologische Struktur der Untermannigfaltigkeit passen optimal zusammen -> ergibt eine optimale Verteilung der Referenzvektoren, kein Referenzvektor bleibt ungenutzt + +#### Vergleich zwischen SOFM- und Neural Gas Lernverfahren + +| Kriterien | SOFM | Neural Gas | +| :----------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------: | +| Definition der Nachbarschaften | innerhalb des vordefinierten Neuronengitters (n-dim.) | innerhalb des Eingaberaumes | +| Einschränkungen | Dimensionalität des Grids | Keine | +| Probleme bei der Dimensionsreduktion | möglich, recht häufig | prinzipiell keine | +| Wertung | adaptiver Vektorquantisierer, der eine Abbildung von Inputähnlichkeiten auf das Neuronengitter (n-dim.) erzeugt (-> Visualisierung) | perfekter adaptiver Vektorquantisierer, der direkt im Eingaberaum arbeitet (ohne eine Projektion) | + +### Der k-Means Algorithmus als klassischer VQ +Ziel: den Datensatz so in k Partitionen zu teilen, dass die Summe der quadrierten Abweichungen von den Cluster-Schwerpunkten minimal ist. Mathematisch entspricht dies der Optimierung der Funktion $J = \sum_{i=1}^k \sum_{x\in S} || x_j - \mu_i ||^2$ +- Diese Zielfunktion basiert auf der Methode der kleinsten Quadrate, man spricht auch von Clustering durch Varianzminimierung, da die Summe der Varianzen der Cluster minimiert wird. +- Da zudem die quadrierte Euklidische Distanz ist, ordnet k-Means effektiv jeden Datenpunkt dem nächstgelegenen (nach Euklidischer Distanz) Clusterschwerpunkt zu. +- Da die Suche nach der optimalen Lösung schwer ist (NP-schwer), wird im Normalfall ein approximativer Algorithmus verwendet. +- Der am häufigsten verwendete approximative k-Means-Algorithmus ist der Lloyd-Algorithmus, der oft als "der" k-means Algorithmus bezeichnet wird, obwohl Lloyd diesen Namen nicht verwendet hat. +- Lloyd’s Algorithmus besteht aus drei Schritten: + 1. Initialisierung: Wähle k zufällige Mittelwerte (Means) $m_1,..., m_k$ aus dem Datensatz. + 2. Zuordnung: Jedes Datenobjekt $x_j$ wird demjenigen Cluster $S_j$ zugeordnet, bei dem die Cluster-Varianz am wenigsten erhöht wird. + $S_i^{(t)}= {x_j: ||x_j -m_i^{(t)}||^2 \leq ||x_j - m_{i*}^{(t)}||^2 }$ für alle $i*=1,...,k$ + 3. Aktualisierung: Berechne die Mittelpunkte der Cluster neu: + - Die Schritte 2-3 werden dabei so lange wiederholt, bis sich die Zuordnungen nicht mehr ändern. + + +## Reinforcement Learning +[comment]: <> (Vorlesung 8) +### Einordnung und Wesen +- Überbegriff für eine Reihe von Methoden des Maschinellen Lernens, bei denen ein Agent den Nutzen von Aktionsabfolgen in einer Welt bestimmt +- dient dem völlig selbständigen Erlernen komplexer Wahrnehmungs-Handlungs-Zusammenhänge auf Basis einer Handlungsbewertung nur durch ein unspezifisches Leistungsbewertungssignal (Belohnung/Bestrafung) +- zwischen überwachtem und unüberwachtem (datengetrieben) Lernen +- Unterschied zum Supervised Learning: Leistungsbewertungssignal ist nicht instruktiv (spezifisch mit konkreten Hinweisen zur Verbesserung der Abbildung), sondern ausschließlich evaluativ (bewertend) + +$\rightarrow$ „Learning with critic instead of learning with teacher.“ + +Haupteinsatzgebiete: Robotik, optimale Steuerungen, Spielsteuerungen, .... + +### Grundidee +- Entscheidungsmodul (Agent) muss wiederholt Aktionen auswählen, um ein System in gewünschter Weise zu beeinflussen und in einen Zielzustand zu überführen. +- Bei jeder Entscheidung erhält der Agent eine direkte Belohnung / Bestrafung (Reinforcement), wobei sich die erhaltenen Belohnungen über die Zeit akkumulieren. +- Reinforcement Lernen (RL) beschäftigt sich mit dem Problem, durch Lernen solche Entscheidungsstrategien zu finden, die bezüglich dieser akkumulierten Reinforcements optimal sind. +- Ziel ist es, nur mittels lokal optimaler Entscheidungen eine global optimale Strategie zu erhalten. + +### Wo steckt das Wissen im RL-Agenten ? +- In so genannten State-Action Values (Q-Werten), die kodieren, welches long-term Return R erhalten werden kann, wenn man in einem bestimmten State s j eine bestimme Aktion a i ausführt +- Einfachste Form: Tabelle Q( s , a ) +- Fragen und Probleme: + 1. Woher bekommt man die Q-Werte? -> Lernverfahren + 2. Exponentielles Wachstum der Tabellengröße mit der Anzahl der Dimensionen d des State Spaces + +## Q-Learning – der bekannteste RL Algorithmus +On-line Lernverfahren nach [Watkins and Dayan, 1992], das auf einer inkrementellen Verbesserung der Schätzung Q(s,a) mittels “stochastischer Approximation” basiert + + +## Supervised Learning +### Kurzcharakteristik +- Lernverfahren, bei dem gelabelte Daten-Samples $X = {(x_1 , y_1 ), (x_2 ,y_2 ), ...,(x_n , y_n )}$ bzw. $X = {(x_1 , t_1 ), (x_2 ,t_2 ), ...,(x_n , t_n )}$ zur Approximation einer unbekannten, Daten generierenden Funktion genutzt werden. +- Das Labeln der Trainingsdaten erfolgt durch Lehrer meist offline. +- Soll eine unbekannte Funktion approximiert werden, deren Funktionsoutput y nur diskrete Klassen/Kategorien besitzt, dann müssen die Daten-Samples diskret gelabelt werden mit t. -> Klassifikation / Kategorisierung +- Soll eine unbekannte, Daten generierende Funktion approximiert werden, deren Funktionsoutput y kontinuierlich (reell) ist, dann müssen die Daten Samples auch reellwertig gelabelt werden mit t -> Funktionsapproximation / Regression + +### Erlernen von Abbildungen – Das Konzept der Assoziativspeicher +- Wesen: Erlernen von Abbildungen zwischen zu assoziierenden Musterpaaren (x, t) aus der Lernstichprobe +- Wesen: $t=x(Vorr. m=n)$ +- Zweck: Ausgabe des korrekten, ungestörten Inputs (Outputs) x bei Präsentation eines gestörten oder unvollständigen Inputs X* +- Einsatz: Mustervervollständigung, Rauschunterdrückung, Feature Learning in Deep Neural Nets +- Einfachstes Lernverfahren: Hebb‘sches Lernen (Steinbuch‘sche Lernmatrix + +### Der Error-Backpropagation Algorithmus +- Erlaubt eine Verallgemeinerung der auf einschichtige Netze beschränkten Delta-Lernregel auf mehrschichtige Netze mit beliebiger Anzahl von Schichten. +- Problem: Ein direktes Fehlersignal zwischen Teach-Vektor und Output-Vektor des Netzes existiert nur für die Output-Schicht. +- Für alle Hidden-Schichten muss das Fehlersignal von der Output-Schicht zurückpropagiert und rückwirkend aufakkumuliert werden (daher der Name Error-Backpropagation) -> fungiert dann als „internes Fehlersignal“ +- Fehlerakkumulation erfolgt gewichtet mit den vorhandenen „alten“ Gewichten der betreffenden Verbindung. +- erlaubt damit eine rekursive Berechnung der notwendigen Gewichtsänderungen vom Output zum Input. +- Implementierung: damit stets 2 Sätze von Gewichtsparametern erforderlich: + - Satz „alter Gewichte“ zum Generieren der aktuellen, internen Netzaktivität und zum Zurückpropagieren der Fehlersignale + - Satz „neuer Gewichte“, die die Gewichte nach dem Lernschritt kodieren; kommen erst im nächsten Zyklus zum Einsatz, dann wieder als „alte Gewichte“ + +## Verallgemeinerte Delta-Lernregel +### der Error Backpropagation Algorithmus +1. Betrachtung für die Ausgabeschicht L (entspricht Betrachtung nach Delta-Regel) +2. Betrachtung für zwei beliebige Schichten l und l-1 + -> erlaubt rekursive Berechnung für l-schichtige Netze vom Ausgang auf den Eingang + +### Fazit +- verallgemeinerte Delta-Lernregel lässt sich auf beliebige Anzahl von Schichten erweitern +- Fehlerterme berechnen sich rekursiv aus der gewichteten Summe der Delta-Fehler der nachfolgenden Schicht l, multipliziert mit der Ableitung der Ausgabefunktion der aktuellen Schicht l-1 -> ist gut vektorisierbar +- Die zwei prinzipiellen Trainingsmodi können auch hier unterschieden werden: + - Direct Learning: berechnete Gewichtsänderung wird sofort nach der Verarbeitung des Trainingsmusterpaares ausgeführt + - Batch Learning: berechnete Gewichtsänderung wird über alle Musterpaare des Trainingssets akkumuliert und erst nach Verarbeitung aller Musterpaare ausgeführt + +## Ausgabekodierung bei der Klassifikation +- Häufig verwendet: Bei Klassifikationsproblemen Umwandlung der reelwertigen Netzausgaben in eine binäre Ausgabe durch einfache Bestimmung des Maximums zur Markierung der am stärksten aktivierten (und damit erkannten) Klasse/Kategorie +- Häufig benötigt: Klassenzugehörigkeiten, die nicht nur die einzelne Ausgabe (Klasse) sondern auch alle anderen Ausgaben (Klassen) mit berücksichtigen +-> Softmax Ausgabe + +### Softmax Ausgabe +- Spezielle Ausgabefunktion der ganzen Ausgabeschicht statt der bisherigen Ausgabefunktion pro Einzelneuron +- ermöglicht die Schätzung von Klassenzugehörigkeiten +- dazu Abbildung (“Quetschen”) eines N-dimensionalen Vektors von beliebigen reelwertigen Ausgabeaktivitäten auf einen N-dimensionalen Vektor von positiv reelwertigen Ausgaben im Bereich (0, 1), die sich alle zu 1 addieren. + +# Moderne Verfahren für große Datensets + +## Deep Neural Networks + +## Anwendungsbeispiele + + +[comment]: <> (Vorlesung 9) +[comment]: <> (Vorlesung 10) +[comment]: <> (Vorlesung 11) [comment]: <> (Vorlesung 12) \ No newline at end of file diff --git a/Programmierparadigmen.md b/Programmierparadigmen.md index 69964c8..44f6715 100644 --- a/Programmierparadigmen.md +++ b/Programmierparadigmen.md @@ -1,1552 +1,1552 @@ -# Programmierparadigmen - -## Was ist ein Paradigma? -- Paradigma – aus dem Altgriechischen Beispiel, Muster; Erzählung mit beispielhaftem Charakter (laut Duden) -- Programmierparadigmen beschreiben grundsätzliche Arten wie Computer-Programme formuliert werden können -- Programmiersprachen können einzelne oder viele Konzepte aufgreifen - - Keine verbreitete Sprache greift alle behandelten Konzepte auf - - Betrachtung unterschiedlicher Sprachen -- Ziel der Veranstaltung: Weiten der in Algorithmen und Programmierung eingeführten Sichten hin zu einem Werkzeugkoffer zur Lösung realer Probleme... - -## Warum unterschiedliche Paradigmen? -Komplexität von Software schlecht beherrschbar - -## Was bedeutet das? -- Programmierer schreiben, testen und dokumentieren zwischen 325 und 750 Codezeilen pro Monat - - maximal 360.000 Zeilen in 40 Jahren! -- Komplexität muss verborgen werden, z.B. durch - - Kapselung - - Spezifische Spachkonstrukte, Domain Specific Languages - - Ausdrucksstärkere Sprachen -- Entwicklung neuer Programmierparadigmen hilft Grenzen (ein wenig) zu verschieben -- Theoretische Rahmenbedingungen (Turing-Mächtigkeit, Satz von Rice) behalten Gültigkeit! - -## Welche Paradigmen existieren? -- Aus Vorlesung AuP: - - Imperative Algorithmen - - Applikative Algorithmen - - Deduktive Algorithmen -- Aber Vielzahl weiterer Formen - - teilweise ergänzend, unterschiedliche Kategorisierung möglich - - Bsp: prozedural, deklarativ, objekt-orientiert, datenstromorientiert, parallele & verteilte Programmierung... -- Teilweise unterschiedliche Bezeichnungen - - Applikativ bzw. Funktional - - Deduktiv bzw. Logisch -- Aktueller Trend: Multiparadigmen-Sprachen - - Umsetzung unterschiedlichster Paradigmen in einer Sprache - - Beispiele: Scala, neuere C++-Standards, ... - -# Objektorientierung und weiterführende Konzepte am Beispiel Java -- Bekannt: - - Grundlegendes Verständnis von Java - - Kapselung durch Klassen und Vererbung -- Ziele: - - Verständnis der Probleme bei Vererbung und Typersetzbarkeit in objektorientierten Programmiersprachen - - Kennenlernen der Grundideen generischer und abstrahierender Konzepte in Objekt-orientierter Programmierung (OOP) - - Praktische Erfahrungen anhand von Java & C++ -- Ausdrucksstärke erhöhen, Komplexität verbergen - -## Unit Testing -### Motivation -- Große Software-Systeme entwickeln sich über lange Zeiträume -- Wie können Änderungen an komplexen Code-Basen beherrscht werden? -- Veränderung über Zeit + Komplexität der Software - - Änderungen führen mglw. zu Auswirkungen, die für Einzelne nicht immer überschaubar sind - - Software muss nach Änderung von Grund auf durchgetestet werden -- Verbreitetes Vorgehen: zusätzlichen Code schreiben, der eigentlichen Code automatisch “überprüft” - - Nicht vollständig möglich (z.B. Halteproblem) - - Eher Heuristik -- Test-Code wird bei Ereignissen oder periodisch ausgeführt - - Vor Releases, nach Commit in Repository, während der Entwicklung ... - -### Eigenschaften von Unit-Tests -- Software schlecht als Ganzes testbar -> Zergliederung von Software in sinnvolle Einheiten -- Individuelle Tests dieser Einheiten -- Dabei: reproduzierbar & vollautomatisierbar - - Ziel: Wann immer Änderungen in komplexen Programmen vorgenommen werden, möglichst vollständiger Test, da Programmierer nicht mehr alles überblicken -- Messung der Vollständigkeit der Tests schwierig -- Üblich: Messung von Überdeckung (Coverage) in Bezug auf Anzahl Funktionen, Code-Zeilen oder Verzweigungen -- Gute Praxis: Wenn ein Bug beim Testen oder Live-Betrieb auftritt -> Schreiben eines zusätzlichen Tests, um Wiederauftreten zu erkennen - -### Unit-Testing in Java -- De facto Standard: JUnit Framework -- „Best Practice” für einfachen Einsatz: - - Java Code in ein oder mehrere Klassen im Ordner src speichern - - Im Ordner tests jeweils eine Klasse anlegen, die Funktionen einer Implementierungsklasse prüft - - Konvention: Testklasse einer Klasse Name heißt NameTest - - Eigentliche Tests werden in Methoden implementiert, die als Tests annotiert sind - - Typischer Ansatz: für bekannte Werte ausführen und Ergebnis mit Grundwahrheit (erwartetes Verhalten) vergleichen, bspw. mit assertEquals-Funktion -- Viele weitere Features, z.B. Deaktivieren von Tests, Timeouts, GUI Coverage, Mocks - -### Unit Testing – Richtiges Abstraktionsniveau -- Um die Tests auszuführen, müssen jeweils entsprechende Hauptprogramme generiert werden („Test Suites“) -- Hauptschwierigkeiten von Unit-Tests: - - Richtiges Abstraktionsniveau - - „Herauslösen“ von zu testendem Code aus Umgebung -- Zwei wesentliche Möglichkeiten: - 1. Individuelles Testen von Klassen: - - Vernachlässigt Zusammenspiel zwischen Klassen - - Oft sehr aufwändig, da andere Klassen für Unit-Tests nachgebildet werden müssen (Mocks) - - Was bei zyklischen Abhängigkeiten? - 2. Gemeinsames Testen von Klassen: - - Erfordert Eingreifen in gekapselte Funktionalitäten - - Private & Protected Member-Variablen & Methoden! - - Eigentlich nicht möglich?! - -## Reflections -- Normaler Ablauf: Programm schreiben, compilieren, ausführen - - Aber was wenn ich ein Programm zur Laufzeit inspizieren oder verändern möchte? -- Unterschiedliche Gründe - - Testen (um Fehler zu injizieren!) - - Fehlersuche („Debugging“) - - Nachladen von Plugins zur Modularisierung von Programmen - - Serialisierung/Deserialisierung von Code - - „Patchen“ zur Laufzeit - - Erkunden der Ablaufumgebung (z.B. OS-/Shared-Library Version) -- Benötigt die Fähigkeit, im Programm Codestruktur zu analysieren und ggf. zu verändern: - - Typisch: Abruf Klassenhierarchie, Auflisten von Methoden und Parametern, Austausch von Klassen und Methoden - - Teil von Java, Python, ... - -API verstreut über verschiedene Packages, z.B. java.lang.Class, java.lang.instrument, java.lang.reflect - -```java -Class cls = "test".getClass(); -System.out.println("Die Klasse heisst " + cls.getName()); -// Die Klasse heisst java.lang.String -``` -```java -// import java.lang.reflect.Method; -Method[] methods = cls.getMethods(); -for (Method m : methods) -System.out.println(m.getName()); -``` -### Annotationen -- Annotationen erlauben Anmerkungen an Klassen & Methoden -- Beginnen mit @ -- Einige wenige vordefinierte z.B. @Override -- Aber auch eigene; u.a. durch Reflections abrufbar -- Häufig genutzt, wenn zusätzlicher Code geladen wird (Java EE) -- Oder um Unit-Tests zu markieren... -```java -class MultiTest { - @org.junit.jupiter.api.Test - void mul() { - ... -``` - -### Reflektionen über Reflections -- Reflections sind ein sehr mächtiges Werkzeug, aber Einsatz sollte wohldosiert erfolgen -- Nachteile: - - Geringe Geschwindigkeit weil Zugriff über Programmcode erfolgt - - Kapselung kann umgangen werden - - private, protected und final können entfernt werden - - Aufruf/Veränderung interner Methoden & Auslesen/Veränderung interner Variablen - - Synchronisation zwischen externen und internen Komponenten bei Weiterentwicklung? - - Debugging veränderter Programme? - - Sicherheit?! -- Verwandte Techniken: - - Monkey Patching (JavaScript-Umfeld) - - Method Swizzling (Swift/Objective-C-Umfeld) - - -## Assertions -- Kann man interne Zustände testen, ohne invasive Techniken wie Reflections? -- Einfache Möglichkeit: An sinnvollen Stellen im Programmcode testen, ob Annahmen/Zusicherungen (Assertions) stimmen... -- Tests, die nie falsch sein sollten - - Erlauben gezielten Programmabbruch, um Folgefehler zu vermeiden - - Erlauben gezieltes Beheben von Fehlern - - Gemeinsames Entwickeln von Annahmen und Code -```java -class Stack { - public void push(Object o) { - ... - if(empty() == true) // es sollte ein Objekt da sein - System.exit(-1); - } - ... -} -``` - -Aber: Ausführungsgeschwindigkeit niedriger -- Zeitverlust stark abhängig von Programm/Programmiersprache -- Verbreitetes Vorgehen: - - Aktivieren der Tests in UnitTests und Debug-Versionen - - Deaktivieren in Releases - - Benötigt spezielle „if“-Bedingung: assert -- Aktivierung der Tests über Start mit java -ea -```java -class Stack { - public void push(Object o) { - ... - assert empty() == false -} -``` - -### Welche braucht man? -- Woran erkennt man beim Programmieren bzw. (erneutem) Lesen von Code, dass man eine Assertion hinzufügen sollte? -- Eine einfache Heuristik – Die „Eigentlich“-Regel: - - Wenn einem beim Lesen von Programmcode ein Gedanke der Art „Eigentlich müsste an dieser Stelle XY gelten“ durch den Kopf geht, - - dann sofort eine entsprechende Assertion formulieren! - -### Spezielle Assertions: Pre- & Postconditions -- An welchen Stellen ist es sinnvoll, Annahmen zu prüfen? -- Einfache Antwort: an so vielen Stellen wie möglich -- Komplexere Antwort: Design by contract, ursprünglich Eiffel -- Methoden/Programmabschnitte testen Bedingung vor und nach Ausführung -- Einige Sprachen bieten spezialisierte Befehle: requires und ensures --> Ziel mancher Sprachen: Formale Aussagen über Korrektheit - -```java -class Stack { - public void push(Object o) { - assert o != null // precondition - ... - assert empty() == false // postcondition - } - ... -} -``` - -### Klasseninvarianten -- Bei OO-Programmierung sind Vor- und Nachbedingungen nur eingeschränkt sinnvoll -- Bedingungen oft besser auf Objekt-Ebene -> interner Zustand -- Invarianten spezifizieren Prüfbedingungen -- In Java nicht nativ unterstützt: - - Erweiterungen, wie Java Modeling Language - - Simulation: -```java -class Stack { - void isValid() { - for(Object o : _objs) // Achtung: O(n) Aufwand! - assert o != null - } - public void push(Object o) { - isValid() // always call invariant - ... - isValid() // always call invariant -} -``` - -## Exeptions -Signifikantes Element vieler Sprachen: Wie wird mit Fehlern umgegangen? -Fehler können unterschiedliche Gründe haben -Besser für Code-Komplexität: Fehlerprüfungen an zentralerer Stelle -- Abbrechen und Programm-Stack „abbauen“ bis (zentrale) Fehlerbehandlung greift -- Dabei Fehler sinnvoll gruppieren -- Java (und viele mehr): try/catch/throw-Konstrukt -```java -private void readFile(String f) { - try { - Path file = Paths.get("/tmp/file"); - if(Files.exists(file) == false) - throw new IOException("No such dir"); - array = Files.readAllBytes(file); - } catch(IOException e) { - // do something about it - } -} -``` -throw übergibt ein Objekt vom Typ Throwable an Handler, dabei zwei Unterarten: -- Error: Sollte nicht abgefangen werden z.B. Fehler im Byte-Code, Fehlgeschlagene Assertions -- Exceptions: - - Checked Exception: Programm muss Exception fangen oder in Methode vermerken - - Runtime Exceptions: Müssen nicht (aber sollten) explizit behandelt werden, bspw. ArithmeticException oder IndexOutOfBoundsException - -### Checked Exceptions -Deklaration einer überprüften Exception: -```java - void dangerousFunction() throws IOException { - ... - if(onFire) - throw IOException("Already burns"); - ... -} -``` -Die Deklaration mit "throws IOException" lässt beim build mögliche Fehler durch IOExceptions dieser Funktion zu, diese müssen durch die aufrufende Methode abgefangen werden. -Aufrufe ohne try-catch-Block schlagen fehl! -Sollte man checked oder unchecked Exceptions verwenden? -- Checked sind potenziell sicherer -- Unchecked machen Methoden lesbarer -- Faustregel unchecked, wenn immer auftreten können (zu wenig Speicher, Division durch 0) - -Abfangen mehrerer unterschiedlicher Exceptions -```java -try { - dangerousFunction(); -} catch(IOException i) { - // handle that nasty error -} catch(Exception e) { - // handle all other exceptions -} -``` -Aufräumen nach einem try-catch-Block: Anweisungen im finally-Block werden immer ausgeführt, d.h. auch bei -return in try- oder catch-Block (oder fehlerloser Ausführung) -```java -try { - dangerousFunction(); -} catch(Exception e) { - // handle exceptions - return; -} finally { - // release locks etc.. -} -``` - - -## Generizät von Datentypen -(Typ-)Generizität: -- Anwendung einer Implementierung auf verschiedene Datentypen -- Parametrisierung eines Software-Elementes (Methode, Datenstruktur, Klasse, ...) durch einen oder mehrere Typen -Beispiel: -```java -int min(int a, int b) { - return a < b ? a : b; -} -float min(float a, float b) { - return a < b ? a : b; -} -String min(String a, String b) { // lexikographisch - return a.compareTo(b) < 0 ? a : b; -} -``` - -### Grenzen von Typsubstitution -Problem: Für jeden Typ? Wie kann sort implementiert werden? -Möglicher Ausweg: Klassenhierarchie mit zentraler Basisklasse -```java -void sort(Object[] feld) { ... } //z.B. java.lang.Object -void sort(java.util.Vector feld) { ... } //alternativ (nutzt intern Object) -``` -Möglicher Ausweg 2: Nutzung primitiver Datentypen nicht direkt möglich -```java -Object[] feld = new Object[10]; //Object[] ≠ int[] -feld[0] = new Integer(42); -int i = ((Integer) feld[0]).intValue(); //erfordert Wrapper-Klassen wie java.lang.Integer -``` - -Weiteres Problem: Typsicherheit
-Typ-Substituierbarkeit: Kann ein Objekt einer Oberklasse (eines Typs) durch ein Objekt seiner Unterklasse (Subtyps) ersetzt werden? -Beispiel (isSubtyp): short $\rightarrow$ int $\rightarrow$ long -Viele Programmiersprachen ersetzen Typen automatisch, d.h. diese wird auch für shorts und ints verwendet -```java -long min(long a, long b) { - return a < b ? a : b; -} -``` - -Kreis-Ellipse-Problem: Modellierung von Vererbungsbeziehungen -- „Ist ein Kreis eine Ellipse?“ „Oder eine Ellipse ein Kreis?“ -- Annahme: Kreis := Ellipse mit Höhe = Breite -```java -Circle c = new Circle(); -c.skaliereX(2.0); //skalieren aus Klasse Circle -c.skaliereY(.5); //is das noch ein Kreis? -``` -evtl. Reihenfolge in der Klassenhierarchie tauschen (nutzung von Radius)? Was bedeutet das für Ellipse? -Verwandte Probleme: Rechteck-Quadrat, Set-Bag - -### Ko- und Kontravarianz -Geg.: Ordnung von Datentypen von spezifisch $\rightarrow$ allgemeiner -- Gleichzeitige Betrachtung einer Klassenhierarchie, die Datentypen verwendet -- Kovarianz: Erhaltung der Ordnung der Typen -- Kontravarianz: Umkehrung der Ordnung -- Invarianz: keines von beiden -- Anwendung für - - Parameter - - Rückgabetypen - - Ausnahmetypen - - Generische Datenstrukturen - -Beispiel: Basierend auf Meyer‘s SKIER-Szenario -```java -class Student { - String name; - Student mate; - void setRoomMate(Student s) { ... } -} -``` -Wie überschreibt man in einer Unterklasse Girl oder Boy die Methode „setRoomMate“ in elternfreundlicher Weise? Von Eltern sicher gewollt - Kovarianz: -```java -class Boy extends Student { - void setRoomMate(Boy b) { ... } -} -class Girl extends Student { - void setRoomMate(Girl g) { ... } -} -``` -Was passiert mit folgendem Code? -```java -Boy kevin = new Boy("Kevin"); -Girl vivian = new Girl("Vivian"); -kevin.setRoomMate(vivian); -``` -- Verwendet setRoomMate der Basisklasse -- setRoomMate Methoden der abgeleiteten Klassen überladen nur Spezialfälle $\rightarrow$ gültig - -- In C++ und Java keine Einschränkung der Typen zur Compile-Zeit -- Kovarianz so nur in wenigen Sprachen implementiert (z.B. Eiffel über redefine); Überprüfung auch nicht immer statisch! -- Auch bekannt als catcall-Problem (cat = changed availablility type) -Ausweg: Laufzeitüberprüfung -```java -class Girl extends Student { - ... - public void setRoomMate(Student s) { //student wird aufgerufen! nicht boy oder girl, dadurch können die methoden der klasse verwendet werden - if (s instanceof Girl) - super.setRoomMate(s); - else - throw new ParentException("Oh Oh!"); - } -} -``` -Nachteil: Nur zur Laufzeit überprüfung - -#### Ko- und Kontravarianz für Rückgabewerte -Kovarianz (gängig): -```java -public class KlasseA { - KlasseA ich() { return this; } -} -public class KlasseB extends KlasseA { - KlasseB ich() { return this; } -} -``` -Kontravarianz macht wenig Sinn und kommt (gängig) nicht vor - -In objektorientierten Programmiersprachen im Allgemeinen -- Kontravarianz: für Eingabeparameter -- Kovarianz: für Rückgabewerte und Ausnahmen -- Invarianz: für Ein- und Ausgabeparameter - -### Liskovsches Substitutionsprinzip (LSP) -Barbara Liskov, 1988 bzw. 1993, definiert stärkere Form der Subtyp-Relation, berücksichtigt Verhalten: -> Wenn es für jedes Objekt $o_1$ eines Typs S ein Objekt $o_2$ des Typs T gibt, so dass für alle Programme P, die mit Operationen von T definiert sind, das Verhalten von P unverändert bleibt, wenn $o_2$ durch $o_1$ ersetzt wird, dann ist S ein Subtyp von T.' -Subtyp darf Funktionalität eines Basistyps nur erweitern, aber nicht einschränken.
-Beispiel: Kreis-Ellipse $\rightarrow$ Kreis als Unterklasse schränkt Funktionalität ein und verletzt damit LSP - -### Generics in Java (Typsicherheit) -Motivation: Parametrisierung von Kollektionen mit Typen -```java -LinkedList liste = new LinkedList(); -liste.add("Generics"); -String s = liste.get(0); -``` -auch für Iteratoren nutzbar -```java -Iterator iter = liste.iterator(); - while(iter.hasNext()) { - String s = iter.next(); - ... -} -``` -oder mit erweiterter for-Schleife -```java -for(String s : liste) { - System.out.println(s); -} -``` - -Deklaration: Definition mit Typparameter -```java -class GMethod { - static T thisOrThat(T first, T second) { - return Math.random() > 0.5 ? first : second; - } -} -``` -- T = Typparameter (oder auch Typvariable) wird wie Typ verwendet, stellt jedoch nur einen Platzhalter dar -- wird bei Instanziierung (Parametrisierung) durch konkreten Typ „ersetzt“ -- nur Referenzdatentypen (Klassennamen), keine primitiven Datentypen -Anwendung: -- explizite Angabe des Typparameters - ```java - String s = GMethod.thisOrThat("Java", "C++"); - Integer>thisOrThat(new Integer(42), new Integer(23)); - ``` -- automatische Typinferenz durch Compiler - ```java - String s = GMethod.thisOrThat("Java", "C++"); - Integer i = GMethod.thisOrThat(new Integer(42), new Integer(23)); - ``` - -#### Eingrenzung von Typparametern -Festlegung einer Mindestfunktionalität der einzusetzenden Klasse, z.B. durch Angabe einer Basisklasse -- Instanziierung von T muss von Comparable abgeleitet werden (hier ein Interface, dass wiederum generisch ist, daher Comparable) -- Verletzung wird vom Compiler erkannt -```java -static> T min(T first, T second) { - return first.compareTo(second) < 0 ? first : second; -} -``` -Angabe des Typparameters bei der Klassendefinition: -```java -class GArray { - T[] data; - int size = 0; - public GArray(int capacity) { ... } - public T get(int idx) { return data[idx]; } - public void add(T obj) { ... } -} -``` -Achtung: new T[n] ist unzulässig! Grund liegt in der Implementierung von Generics: -Es gibt zwei Möglichkeiten der internen Umsetzung generischen Codes: -- Code-Spezialisierung: jede neue Instanziierung generiert neuen Code - - Array → ArrayString, Array → ArrayInteger - - Problem: Codegröße -- Code-Sharing: gemeinsamer Code für alle Instanziierungen - - Array → Array, Array → Array - - Probleme: keine Unterstützung primitiver Datentypen & keine Anpassung von Algorithmen an Typ -Java: Code-Sharing durch Typlöschung (Type Erasure) -Typen beim Übersetzen geprüft, aber keinen Einfluss auf Code -sichert auch Kompatibilität zu nicht generischem Code (Java-Version < 1.5) Bsp.: ArrayList vs. ArrayList - -Beispiel: Reflektion (Metaklassen) zur Erzeugung nutzen; danach Konstruktionsaufruf -```java -public GArray(Class clazz, int capacity) { - data = (T[]) Array.newInstance(clazz, capacity); -} - -GArray array = new GArray(String.class, 10); -``` - -#### Kovarianz generischer Typen -einfache Felder in Java sind kovariant -```java -Object[] feld = new Object[10]; -feld[0] = "String"; -feld[1] = new Integer(42); -``` -Instanziierungen mit unterschiedliche Typen sind jedoch inkompatibel -```java -GArray anArray = new GArray(); -GArray anotherArray = (GArray) anArray; -``` - -#### Wildcards -Wildcard „?“ als Typparameter und abstrakter Supertyp für alle Instanziierungen -```java -GArray aRef; -aRef = new GArray(); -aRef = new GArray(); -``` -aber nicht: -```java -GArray aRef = new GArray(); -``` -hilfreich insbesondere für generische Methoden -```java -// dieser Methode ist der genaue Typ egal -static void pO(GArray ia) { - for(Object o : ia) { - System.out.print(o); - } -} -// floats wollen wir mit Genauigkeit 2 haben -static void pF(GArray ia) { - for(Float f : ia) { - System.out.printf("%5.2f\n", f); - } -} -``` - -Beschränkte Wildcards -- nach „unten“ in der Klassenhierarchie $\rightarrow$ Kovarianz - ```java - ? extends Supertyp - ``` - Anwendungsbeispiel: Sortieren eines generischen Feldes erfordert Unterstützung der Comparable-Schnittstelle - ```java - void sortArray(GArray array) { - ... - } - ``` -- nach „oben“ in der Klassenhierarchie $\rightarrow$ Kontravarianz - ```java - ? super Subtyp - ``` - Anwendungsbeispiel: Feld mit ganzen Zahlen und Objekten - ```java - GArray array; - // Zuweisungskompatibel zu ... - array = new GArray(); - array = new GArray(); - array = new GArray(); - // aber nur erlaubt: - Object obj = array.get(0); - ``` - -PECS = Producer extends, Consumer super $\rightarrow$ Producer liest nur sachen, Consumer legt daten/Objekte/... ab - -# Objectorientierung am Beispiel C++ -- Ziel von C++: volle Kontrolle über Speicher & Ausführungsreihenfolgen sowie skalierbarere Projekt-Größe -- Kompiliert zu nativem Maschinencode und erlaubt genauere Aussagen über Speicher-, Cache- und Echtzeitverhalten -- Viele Hochsprachenelemente (Wie Java objektorientiert; sogar ähnliche Syntax an viele Stellen (weil Java ursprünglich an C++ angelehnt)) -- Jedoch kompromissloser Fokus Ausführungsgeschwindigkeit, d.h. - - Keine automatische Speicherverwaltung - - Keine Initialisierung von Variablen (im Allgemeinen) - - Kein Speicherschutz! - - Dinge, die Zeit kosten, müssen im Allgemeinen erst durch Schlüsselworte aktiviert werden -- C++ ist zu sehr großen Teilen eine Obermenge von C - - Fügt Objektorientierung hinzu - - Versucht fehleranfällige Konstrukte zu kapseln - - Führt (viele) weitere Sprachkonstrukte ein, die Code kompakter werden lassen - -## Vergleich mit Java -```java -[Hello.java] -package hello; // say that we are part of a package -public class Hello { // declare a class called Hello: -// declare the function main that takes an array of Strings: - public static void main(String args[]) { - // call the static method, println on class System.out with parameter "Hi Welt!": - System.out.println("Hi Welt!"); - } -} // end of class Hello -``` -```cpp -[Hello.cpp] -// include declarations for I/O library where cout object is specified in namespace std:: -#include -// declare the function main that takes an int and array of strings and returns an int as the exit code -int main(int argc, char* argv[]) { -// stream string to cout object flush line with endl - std::cout << "Hello world!" - << std::endl; - return 0; -} // end of main() -``` -- Unterschiede im Aufbau: - - C++ hat globale Funktionen, also außerhalb von Klassen, wie main - - #include gibt Dateien mit Klassen- und Funktionsdefinitionen an, die der Compiler einlesen soll - - Java-Programme werden in packages gegliedert, in C++ gibt es mit modules ein ähnliches Konzept, welches aber (noch) nicht verbreitet ist - - C++-Programme können (ohne Bezug zu Dateien) in namespaces untergliedert werden, hier std -- Programmargumente: - - In Java bekommt main ein String-Array übergeben, die Länge kann über .length abgefragt werden - - C/C++-Programme erhalten ein Array von char* (Details zu Pointern folgen) - - In C/C++ sind Arrays keine Pseudoobjekte, sondern Speicherbereiche in denen die Daten konsekutiv abgelegt sind $\rightarrow$ argc wird benötigt die Anzahl an Elementen zu kodieren -- Rückgabewerte: - - In Java keine Rückgabe in der main-Methode - - In C++ Rückgabe eines exit code - - 0 gibt an: Programmausführung erfolgreich - - Andere Werte geben einen Programm-spezifischen Fehlercode zurück -- Primitive Datentypen: - - Wie in Java einfache Datentypen, die „Zahlen“ enthalten - - char, short, int, long sind auf 64-bit Maschinen 8 bit, 16 bit, 32 bit und 64 bit breit (char braucht in Java 16 Bit!) - - long ist auf 32 bit Maschinen 32 Bit breit, long long [sic!] ist immer 64 Bit - - bool speichert Boolsche Werte (Breite hängt vom Compiler ab!) - - Ein unsigned vor Ganzahltypen gibt an, dass keine negativen Zahlen in der Variable gespeichert werden (Beispiel: unsigned int) $\rightarrow$ Kann größere Zahlen speichern & zu viel Unsinn führen (beim Vergleich mit vorzeichenbehafteten Zahlen) - -## C++ Klassen -Header Foo.hpp deklariert Struktur und Schnittstelle -```cpp -public: // Block ohne Zugriffsbeschränkung - Foo(); // Konstruktor - ~Foo(); // Destruktor -protected: // Block von Dingen, auf die auch abgeleitete Klassen zugreifen dürfen - int num; // Member-Variable -}; // WICHTIGES Semikolon! -``` - -Implementierung in getrennter Datei Foo.cpp -```cpp -#include "Foo.hpp" // Klassen Deklaration einbinden -#include // Einbinden von Funktionen der stdlib -Foo::Foo() : // Implementierung des Konstuktors von Foo - num(5) { // Statische Initialisierung von num, Code in Klammern {} kann auch initialisieren - std::cout << "c" << std::endl; -} -Foo::~Foo() { - std::cout << "d" << std::endl; -} -``` - -- Reine Implementierung auch im Header möglich, aber Trennung von Implementierung und Deklaration erlaubt schnelleres Kompilieren -- Trennung nicht immer möglich (später mehr Details), aber im Allgemeinen zu bevorzugen -- Der scope-Operator :: wird zum Zugriff auf namespaces und zur Beschreibung der Klassenzugehörigkeit von Methoden verwendet -- Initialisierung von Variablen vor Funktionsrumpf etwas „merkwürdig“ zu lesen, aber erlaubt schnelle Implementierungen... - - Syntax: nach Konstruktor : dann jeweils Variable(Wert) - - Variablen durch , getrennt - - Wichtig: Reihenfolge der Variablen wie in Deklaration der Klasse! -- Schlüsselworte private, protected und public vergleichbar zu Java, werden aber vor ganze Blöcke geschrieben - - Kapselung nur auf Ebene von Klassen ➞ Klassen sind immer public - - protected erlaubt nur der Klasse selber und Unterklassen den Zugriff -- Zugriffe außerhalb der Klassenstruktur können durch friend- Deklaration erlaubt werden (teilweise verrufen!) -- Auch *final* ähnlich zu Java $\righarrow$ Verhindert weiteres Ableiten von Klassen -- Schlüsselwort const markiert Methoden, die Objekte nicht verändern $\rightarrow$ Erlauben die Übergabe von Nur-Lesen-Referenzen -- Größere Unterschiede zu Java: - - Klassen können Destruktoren besitzen - - Werden aufgerufen wenn Objekt zerstört wird - - Kann bspw. dafür verwendet werden, um von dem Objekt allozierte Speicherbereiche freizugeben (Achtung: anschließend darf auf diese nicht mehr zugegriffen werden – problematisch wenn anderen Objekte diese Speicherbereiche bekannt gegeben wurden!) - - Destruktor kann Zerstören eines Objekts aber nicht verhindern - - Methodensignatur ~Klassenname() – kein Rückgabetyp! - - Warum gibt es das nicht in Java? - - Neben dem Standardkonstruktor oder einem expliziten Konstruktor existiert ein Copy-Constructor - - Methodensignatur Klassenname(const Klassenname& c) - - Wird aufgerufen wenn Objekt kopiert werden soll - - Vergleichbar zu Object.clone() in Java -- Überladen von Methoden vergleichbar zu Java - - Parametertypen (oder const-Markierung) müssen sich unterscheiden! - - Nur Veränderung des Rückgabewertes nicht ausreichend - ```cpp - class Foo { - public: - void doMagic(int i); - void doMagic(std::string s); - }; - ``` - -## C++ Präprozessor -C/C++-Code kann vor dem Übersetzen durch einen Präprozessor verändert werden -- Alle Präprozessor-Makros beginnen mit # -- (Haupt-)gründe: - - Importieren anderer Dateien - - An- und Ausschalten von Features je nach Compile-Optionen - - Kapselung von Plattform-spezifischem Code - - Vermeiden von Redundanzen -- Makros sollten vermieden werden - - Schwierig zu lesen - - Keine Namespaces - - Keine Typsicherheit -- Manchmal jedoch einzige Möglichkeit - -Beispiele: -```cpp -#include "X.hpp" // Datei X.hpp aus Projekt-Ordner -#include // Datei cstdio aus System-Includes - -#ifdef DEBUG // falls Konstante DEBUG definiert ist -std::cout << "Wichtige Debugausgabe" << std::endl; -#endif - -#define DEBUG // Konstante setzen -#define VERSION 3.1415 // Konstante auf einen Wert setzen -#define DPRINT(X) std::cout << X << std::endl; // Macro-Fkt. -#undef DEBUG // Konstante löschen, good practice! - -#ifndef __linux__ // falls nicht für Linux übersetzt -playMinesweeper(); -#endif -``` - -### Einschub: Include Guards -Eine (oft hässliche) Eigenschaft des #include-Befehls: kein Überprüfen ob eine Datei vorher bereits eingebunden wurde. Problematisches Beispiel: -```cpp -#include "Bar.hpp" //in "Bar.hpp" ist "Foo.hpp" bereits inkludiert worden -#include "Foo.hpp" //Fehler weil kallse Foo bereits deklariert wurde -``` -Common Practice: Include-Guards um alle Header-Dateien -```cpp -#ifndef FOO_HPP -#define FOO_HPP -... -#endif -``` - -## Speichermanagement -- Programmspeicher enthält Code und Daten, vom Betriebssystem i.A. auf virtuelle Adressbereiche abgebildet -- Unterschiedliche Varianten von Datenspeicher: - - Stack hält alle Variablen einer Methode, aller aufrufenden Methoden, Parameter, Rückgabewerte und einige Management-Daten - - Heap hält Variablen und Objekte, die nicht direkt über Methodenaufrufe übergeben werden - - Speicher für globale und statische Objekte und Variablen -- Java legt primitive Datentypen im Stack ab und Objekte im Heap -- C++ kann sowohl primitive Datentypen als auch Objekte in Stack und Heap abbilden -- Für den Stack bieten Java und C++ automatisches Speicher-Mgmt. -- Für den Heap bietet nur Java automatisches Speicher-Mgmt. - -### Eigenschaften des Stack-Speichers: - - Variablen/Objekte haben klare Lebensdauer $\rightarrow$ Werden immer gelöscht wenn Funktion verlassen wird $\rightarrow$ Man kann Speicher nicht „aufheben“ - - In der Regel sehr schnell, weil im Prozessor-Cache - - In der Größe begrenzt, z.B. 8MB bei aktuellen Linux-Systemen - - Für flexiblere Speicherung brauchen wir anders organisierten Speicher... - -### Heap: Keine klare Struktur - - Anlegen: in C++ & Java mit new - - Um angelegten Speicher anzusprechen: Zeiger und Referenzen - - In Java automatisch Zeiger - - In C++ Zeiger durch * hinter Typ - ```cpp - int main() { - int* i = new int[3]; - int* j = new int; - delete [] i; - delete j; - return 0; - } - ``` - - Löschen von Heap-Speicher: - - Java automatisch - - In C++ nur manuell - - durch genau einen Aufruf von delete - - Programmierer ist dafür verantwortlich, dass danach kein Zeiger auf diesen Speicher mehr benutzt wird - - Warum der Unterschied? - - Nicht einfach festzustellen, wann letzter Zeiger auf Objekt gelöscht wurde - - Zeiger können selbst auch im Heap gespeichert sein - - Zyklische Referenzen! - - Relativ aufwändiges Scannen, in Java durch regelmäßige Garbage Collection gelöst - - Führt zu Jitter (Schwankung der Zeitdauer, die bestimmte Programmabschnitte zur Bearbeitung benötigen) & Speicher-Overhead, ... - -Beispiele - - Anlegen eines Objects auf dem Heap: - ```cpp - std::string* s = new std::string("wiz!"); - delete s; - ``` - - Allokation von Feldern: - ```cpp - int* i = new int[29]; // gültige Indicies 0-28 - i[0] = 23; - delete [] i; // nicht mit delete i; verwechseln! - ``` - - Zeiger können durch & auf beliebige Variablen ermittelt werden - ```cpp - int i = 0; - int* j = &i; // &-Operator erzeugt Zeiger; j darf nicht gelöscht werden - ``` - - Zeiger können durch * dereferenziert werden - ```cpp - int i = 0; - int* j = &i; // &-Operator erzeugt Zeiger - *j = 1; // Zugriff auf Variableninhalt - ``` - - Zugriff auf Methoden/Member Variablen - ```cpp - std::string* s = new std::string("wiz"); - (*s).push_back('?'); // manuelles Derefenzieren - s->push_back('?'); // -> Operator - delete s; - ``` - - C++ übergibt alles als Kopie - ```cpp - void set(std::string s) { s = "foo"; } - int main() { - std::string s = "bar"; - set(s); - std::cout << s; // gibt bar aus - return 0; - } - ``` - - Zeiger können verwendet werden, um schreibend zuzugreifen - ```cpp - void set(std::string* s) { *s = "foo"; } - int main() { - std::string s = "bar"; - set(&s); - std::cout << s; // gibt foo aus - return 0; - } - ``` - - Zeiger erlauben syntaktisch sehr viele Dinge mit unvorhersehbaren Nebenwirkungen - ```cpp - std::string* magicStr() { - std::string s("wiz!"); - return &s; // gibt Speicher auf Stack weiter; Tun Sie das nie! - } - int main() { - std::string* s = magicStr(); - std::cout << *s; // Stack ist bereits überschrieben! - return 0; - } - ``` - -Warum wirken sich Speicherfehler so unvorhersehbar aus? -- Speicherfehler entstehen sehr häufig durch Zugriff auf Speicherbereiche nachdem diese freigegeben worden sind -- Ob hierdurch später ein Fehler auftritt, hängt davon ab wie der freigegebene Speicher nach der Freigabe wieder genutzt wird -- Die insgesamte Speichernutzung wird durch die Gesamtheit aller Speicherallokationen und -freigaben beeinflusst -- Das kann dazu führen, dass ein Speicherfehler in Modul X erst lange nach seinem Entstehen Auswirkungen zeigt, nachdem in einem anderen Modul Y eine Änderung eingeführt wurde -- Auch eingebundene dynamische Bibliotheken haben Einfluss -- Das macht es so schwierig, solche Fehler schwierig zu finden - -### Bessere Alternative: Referenzen -- Zeigen ebenfalls auf Speicher, Compiler stellt aber sicher, dass Speicher gültig ist (wenn man nicht in Zeiger wandelt etc.)! -- Markiert durch Suffix & -- Beispiel: - ```cpp - void set(std::string& s) { s = "foo"; } - int main() { - std::string s = "bar"; - set(s); - std::cout << s; // gibt foo aus - return 0; - } - ``` -- Dereferenzierung durch * und -> nicht notwendig -- Referenzen sind toll, haben aber eine Einschränkung: - ```cpp - std::string& magicStr() { - std::string s("wiz!"); - return s; //< FEHLER - } - ``` - ```cpp - std::string& magicStr() { - static std::string s("wiz!"); - return s; // klappt prima - } - ``` -- Per Referenz übergebene Rückgabewerte müssen im Speicher noch existieren, wenn Methodenaufruf abgeschlossen ist... - - OK für globale Variablen, Member-Variablen, statische Variablen... - - Nicht-OK für Speicher der wirklich dynamisch alloziert werden muss -- Allgemein bleiben nur Zeiger und Heap: - ```cpp - std::string* magicStr() { - std::string* s = new std::string("wiz!"); - return s; // klappt prima, aber: aufpassen wann s gelöscht - // werden kann und vollständig vergessen wurde! - } - ``` - -- Konvertierung von Zeigern zu Referenzen mit „*“-Operator: - ```cpp - std::string& s = *magicStr(); // Konvertieren in Referenz; Delete nicht mehr möglich - std::string s2 = *magicStr(); // Konvertieren in Referenz & Kopie! Delete nicht direkt möglich - ``` -- Konvertierung von Referenzen zu Zeigern mit „&“-Operator: - ```cpp - std::string s("bla"); - std::string* sStar = &s; // Konvertieren in Zeiger - ``` - -- Abschließende Bemerkungen zum Speicher - - Niemals Speicher doppelt löschen – Niemals Löschen vergessen! - - Häufige Praxis: Zeiger auf NULL setzen nach dem Löschen (Aber: gibt es danach wirklich keinen anderen Zeiger mehr?) - - Nur Speicher löschen, der mit „new“ allokiert wurde - - Speicher der mit „new“ allokiert wurde in jedem möglichen Programmablauf löschen (selbst wenn Exceptions auftreten)... - - Nie über Feldgrenzen hinweg lesen/schreiben (auch negative Indizes!) - - Programme ausgiebig testen (dabei Address Sanitizer aktivieren!) - - Statische Code Analyse nutzen: z.B. http://cppcheck.sourceforge.net - - malloc/free sind Äquivalente in Sprache C und nicht typsicher! - -- Verbreitetes Vorgehen in C++ (Pattern): Resource Acquisition Is Initialization (RAII) - - Speicher (oder Ressourcen im Allgemeinen) wird nur im Konstruktor einer Klasse reserviert - - Destruktor gibt Speicher frei - - Sicheres (Exceptions!), nachvollziehbares Konstrukt - - Beispiel: (Funktioniert leider noch nicht immer) - ```cpp - class MagicString { - std::string* s; - public: - MagicString() : s(new std::string("wiz!")) {} - std::string* magicStr() { return s; } - ~MagicString() { delete s; } - }; - ``` - -## Vererbung -- Vermeiden von Mehrfachimplementierungen -- Vermeiden von Dopplung interner Daten -- Vererbung syntaktisch ebenfalls ähnlich zu Java: - ```java - class Foo { - public: - int magic() const { return 23; } - int enchanting() const { return 0xbeef; } - }; - class FooBar : public Foo { - public: - int magic() const { return 42; } - }; - ``` -- Unterschied zu Java: Methoden „liegen“ bei C++ statisch im Speicher - - D.h. f.magic(); ruft statisch magic-Methode in Klasse Foo auf, weil f eine Referenz vom Typ Foo ist - - Vermeidet Mehrfachimplementierungen, realisiert aber keine einheitliche Schnittstelle! -- Nach Überschreiben einer Methode wollen wir meist, dass genutzte Methode nicht vom Referenztyp abhängt, sondern vom Objekttyp - - Idee zu jedem Objekt speichern wir Zeiger auf zu nutzende Methoden - - Tabelle wird *vtable* bezeichnet - - Markierung von Methoden, für die ein Zeiger vorgehalten wird, mit Schlüsselwort virtual - - Funktionierendes Beispiel: - ```cpp - class Foo { - public: - virtual int magic() const { return 23; } - }; - class FooBar : public Foo { - public: - int magic() const override { return 42; } - }; - int r(const Foo& f) { return f.magic(); } - int main() { - return r(FooBar()); // yeah gibt 42 zurück! - } - ``` - - virtual-Markierung genügt in Oberklasse, alle abgeleiteten Methoden ebenfalls „virtuell“ - - override-Markierung optional, aber hätte vor fehlendem virtual gewarnt! - -## Mehrfachvererbung -- C++ unterstützt keine Interfaces -- Aber C++ unterstützt Mehrfachvererbung! Pro Interface eine Basisklasse -> mit abstrakten Methoden erstellen -- Gute Praxis: Explizites Überschreiben - ```cpp - class NiceFooBar : public Foo, public Bar { - // erlaube NiceFooBar().magic() - int magic() const override { return Bar::magic(); } - }; - ``` - - Wegen Mehrfachvererbung: kein super:: - - Stattdessen immer NameDerBasisKlasse:: -- Aber: Diamond Problem - - Markieren der Ableitung als virtual behebt das Problem - -Komposition statt Vererbung -- Vererbungshierarchien werden trotzdem häufig als zu unflexibel angesehen -- Ein möglicher Ausweg: - - Klassen flexiblen aus anderen Objekten zusammensetzen - - Einzelobjekte modellieren Aspekte des Verhaltens des Gesamtobjekts - - Werden beim Anlegen des Gesamtobjekts übergeben -- Engl.: Prefer composition over inheritance -```cpp -class Automatisierungsmodul { - public: - void steuere() = 0; -}; -class Roboter : public Automatisierungsmodul{ - public: - void steuere() { /* call HAL */ } -}; -class DumbDevice : public Automatisierungsmodul { - public: - void steuere() { /* do nothing */ } -}; -class Geraet { - protected: - Automatisierungsmodul* _a; - Geraet(Automatisierungsmodul* a, Saeuberungsmodul* s): _a(a), _s(s) {} - public: - void steuere() { _a->steuere(); } -}; -``` - -## Operator Overloading -- In Java: Unterschied zwischen "==" und "equals()" bei String-Vergleich -- In C++: "=="-Operator für String-Vergleich -- Umsetzung: Hinzufügen einer Methode mit Namen *operatorx* wobei für x unter anderem zulässig: $+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= <=> && || ++ -- , ->* -> () []$ -- Vereinfacht Nutzung komplexer Datentypen teilweise sehr stark -- Aber: Erfordert Disziplin beim Schreiben von Code - - Oft erwartet: Freiheit von Exceptions (Wer gibt Speicher frei, wenn eine Zuweisung fehlgeschlagen ist?) - - Semantik der Operatoren muss selbsterklärend sein - - Ist der Operator auf einem multiplikativen Ring + oder * ? - - Was ist, wenn zwei ungleiche Objekte jeweils kleiner als das andere sind? - - Ist * bei Vektoren das Skalar- oder das Kreuzprodukt (oder etwas ganz anderes)? - -## Templates -- Generische Datentypen werden in C++ mit Templates realsiert -- Häufig ähnlich eingesetzt wie Generics, aber können neben Typen auch Konstanten enthalten -- Zur Compile-Zeit aufgelöst ➞ Deklaration & Implementierung in Header-Dateien -- Einfaches Beispiel (mit Typen, ähnl. zu Generics, primitive Typen ok!): - ```cpp - template // typename keyword -> deklariert T als Typ - T max(T a, T b) { - return (a > b ? a : b); - } - ``` - ```cpp - int i = 10; - int j = 2; - int k = max(j, i); // explizit - int l = max(j, i); // automat. Typinferenz durch Parametertypen - ``` -- Ein wichtiges Grundkonzept von Templates: Substitution failure is not an error (SFINAE) es -> wird solange nach passenden Templates (in lexikogr. Reihenfolge) gesucht bis Parameter passen (sonst Fehler!) -- Sehr häufig verwendetes Konstrukt & mächtiger als es scheint, aber schwer zu beherrschen - - Wir können alternativ versuchen, durch SFINAE zu verhindern, dass Funktionen doppelt definiert sind - - Trick: Einführen eines Pseudoparameters, der nicht benutzt wird - ```cpp - template - T quadrieren(T i, typename T::Val pseudoParam = 0) { - T b(i); b *= i; return b; - } - ``` - - Trick: Einführen eines Hilfstemplates (sogenannter trait): wenn arithmetic::Cond definiert ist, muss T = int sein - ```cpp - template struct arithmetic {}; - template<> struct arithmetic { using Cond = void*; }; - ``` - - Definition einer Funktion, die nur für int instanziiert werden kann: - ```cpp - template - T quadrieren(T i, typename arithmetic::Cond = nullptr) { - return i * i; - } - ``` - -## Container -- Templates werden an vielen Stellen der C++ Standard-Bibliothek verwendet -- Container implementieren alle gängigen Datenstrukturen -- Prominente Beispiele: - ```cpp - template class vector; // dynamisches Array - template class list; // doppelt verkette Liste - template class set; // geordnete Menge basiert auf Baum - template class map; // Assoziatives Array, geordnet - // wie oben aber basierend auf Hash-Datenstruktur - template class unordered_set; - template class unordered_map; - ``` - - Alle Templates sind stark vereinfacht dargestellt, weitere Parameter haben Standardwerte, die z.B. Speicherverhalten regeln - -### Container Enumerieren -- Je nach Struktur unterschiedlicher Zugriff -- Oft über Iteratoren vom Typ Container::iterator, bspw. vector::iterator - ```cpp - std::vector v{ 1, 2, 3 }; // Initialisierung über Liste - // “normale” for-Schleife, Beachte: Überladene Operatoren ++ und * - for(std::vector::iterator i = v.begin(); i != v.end(); ++i) { - std::cout << *i << std::endl; - } - // auto erlaubt Typinferenz → Code lesbarer, aber fehleranfälliger - for(auto i = v.begin(); i != v.end(); ++i) { - std::cout << *i << std::endl; - } - // range loop (nutzt intern Iteratoren), komplexe Datentypen nur mit Ref. “&” sonst werden Kopie erzeugt! - for(int i : v) { // hier ohne “&”, da nur int in v gespeichert - std::cout << i << std::endl; - } - ``` - -### Container Einfügen -- Unterschiedliche Operationen je nach Container-Typ -- std::vector::push_back() fügt neues Element am Ende ein - - Allokiert ggf. neuen Speicher - - Exisitierende Pointer können dadurch invalidiert werden!!! -- std::list zusätzlich push_front() fügt Element am Anfang ein -- std::set, std::map, … - - insert() fügt Element ein, falls es nicht existiert (Optional mit Hinweis wo ungefähr eingefügt werden soll) - - operator[] erlaubt Zugriff aber auch Überschreiben alter Elemente - - emplace() Einfügen, ohne Kopien zu erzeugen (nicht behandelt) - -### Container Löschen -- Unterschiedliche Operationen je nach Container-Typ -- Allgemein: erase(Container::iterator) (Vorsicht ggf. werden Iterator/Zeiger auf Objekte dadurch ungültig!) -- std::vector::resize() löscht implizit letzte Elemente bei Verkleinerung -- std::vector::pop_back()entfernt letztes Element -- std::list hat zusätzlich pop_front() -- std::set, std::map, … löschen nur mit erase() - - -## Shared Pointer -- Synonym: Smart Pointer -- Ziel: Sichereres Verwenden von Speicher -- Idee: kleine, schlanke Zeiger-Objekte, die Referenzzähler + Zeiger auf komplexere Objekte enthalten, wird letztes Zeiger-Objekt gelöscht, wird auch das komplexe Objekt gelöscht -- Realisierung mit RAII, Templates, Operator-Überladung -- Beispiel, wie shared_ptr sich verhalten sollten - ```cpp - using stringP = shared_ptr; - stringP hello() { // gibt kopie der referenz zurück - return stringP(new std::string("Hello!")); - } - - int main() { - stringP x = hello(); - stringP y(x); // Erstellen einer weiteren Referenz - std::cout << y->length(); - return 0; // Original-String wird gelöscht wenn letzte Ref. weg - } - - template class shared_ptr { // Vereinfacht! - T* p; // Zeiger auf eigentliches Objekt - int* r; // Referenzzähler - public: - // neue Referenz auf Objekt erzeugen - shared_ptr(T* t) : p(t), r(new int) { *r = 1; } - // Referenz durch andere Referenz erzeugen - shared_ptr(const shared_ptr& sp) : p(sp.p), r(sp.r) { ++(*r); } - T* operator->() const { // benutzen wie einen richtigen Zeiger - return p; - } - ~shared_ptr() { - if(--(*r) == 0) { // Objekt loeschen, wenn letzte Referenz weg - delete r; - delete p; - } - } - }; // TODO operator= implementieren! - ``` - -# Einführung in Funktionale Programmierung -## Applikaive Algorithmen -Grundidee: -- Definition zusammengesetzter Funktionen durch Terme: $f(x) = 5x + 1$ -- Unbestimmte: - - x, y, z, . . . vom Typ int - - q, p, r , . . . vom Typ bool -- Terme mit Unbestimmten (z.B. Terme vom Typ int: $x, x - 2, 2x + 1, (x + 1)(y - 1)$) -- Terme vom Typ bool $p, p Λ true, (p V true) ⇒ (q V false)$ - -> Sind $v_1, ..., v_n$ Unbestimmte vom Typ $\tau_1,...,\tau_n$ (bool oder int) und ist $t(v_1, ..., v_n)$ ein Term, so heißt $f(v_1, ..., v_n) = t(v_1, ..., v_n)$ eine Funktionsdefinition vom Typ $\tau$ . $\tau$ ist dabei der Typ des Terms. - -- Erweiterung der Definition von Termen -- Neu: Aufrufe definierter Funktionen sind Terme - -> Ein applikativer Algorithmus ist eine Menge von Funktionsdefinitionen. Die erste Funktion $f_1$ wird wie beschrieben ausgewertet und ist die Bedeutung (Semantik) des Algorithmus. - -- Kategorisierung nach unterschiedlichen Kriterien -- Ordnung der Sprache - - Erster Ordnung: - - Funktionen können (nur) definiert und aufgerufen werden - - Höherer Ordnung: - - Funktionen können außerdem als Parameter an Funktionen übergeben werden und/oder Ergebnisse von Funktionen sein. - - Funktionen sind hier auch Werte! -- erstklassige Werte; - - Erstklassig: Es gibt keine Einschränkungen. - - Umgekehrt: Wert ist eine Funktion ohne Parameter -- Auswertungsstrategie: - - Strikte Auswertung: - - Synonyme: strict evaluation, eager evaluation, call by value, applikative Reduktion - - Die Argumente einer Funktion werden vor Eintritt in die Funktion berechnet (ausgewertet) – wie z.B. in Pascal oder C. - - Bedarfsauswertung: - - Synonyme: Lazy evaluation, call by need - - Funktionsargumente werden unausgewertet an die Funktion übergeben - - Erst wenn die Funktion (in ihrem Körper) die Argumente benötigt, werden die eingesetzten Argumentausdrücke berechnet, und dann nur einmal. - - Realisiert „Sharing“ (im Unterschied zur Normalform-Reduktion – dort werden gleiche Ausdrücke immer wieder erneut berechnet). -- Typisierung: - - Stark typisiert: Die verbreiteten funktionalen Programmiersprachen sind stark typisiert, d.h. alle Typfehler werden erkannt. - - Statisch typisiert: Typprüfung wird zur Übersetzungszeit ausgeführt. - - Dynamisch typisiert: Typprüfung wird zur Laufzeit ausgeführt - - Untypisiert: Reiner Lambda-Kalkül (später) - -## Die funktionale Programmiersprache Erlang -- Entwickelt ab der zweiten Hälfte der 1980er Jahre im Ericsson Computer Science Laboratory (CSLab, Schweden) -- Ziel war, eine einfache, effiziente und nicht zu umfangreiche Sprache, die sich gut zur Programmierung robuster, großer und nebenläufiger Anwendungen für den industriellen Einsatz eignet. -- Erste Version einer Erlang-Umgebung entstand 1987 auf der Grundlage von Prolog. Später wurden Bytecode-Übersetzer und abstrakte Maschinen geschaffen. - -### Arbeiten mit Erlang -- Erlang-Programme werden durch Definition der entsprechenden Funktionen in Modulen erstellt -- Module können in den Erlang-Interpreter geladen und von diesem in Zwischencode übersetzt werden -- Anschließend können Anfragen im Interpreter gestellt werden - -Modul "fakultaet.erl": -```erlang - -module(fakultaet). - -export([fak/1]). - fak(0) -> 1; - fak(N) when N > 0 -> (N) * fak(N-1). -``` -Laden in Interpreter mittels: ```c(fakultaet)``` -Testen der Funktion, z.B. mit: ```fakultaet:fak(5)``` - -### Elemente von Erlang -- Ganzzahlen (Integer): - - 10 - - -234 - - 16#AB10F - - 2#110111010 - - $A - - B#Val erlaubt Zahlendarstellung mit Basis B (mit B ≤ 36). - - $Char ermöglicht Angabe von Ascii-Zeichen ($A für 65). -- Gleitkommazahlen (Floats): - - 17.368 - - -56.654 - - 12.34E-10. -- Atome (Atoms): - - abcef - - start_with_a_lower_case_letter - - 'Blanks can be quoted' - - 'Anything inside quotes \n\012' - - Erläuterungen: - - Atome sind Konstanten, die Ihren eigenen Namen als Wert haben - - Atome beliebiger Länge sind zulässig - - Jedes Zeichen ist innerhalb eines Atoms erlaubt - - Einige Atome sind reservierte Schlüsselwörter und können nur in der von den Sprachentwicklern gewünschen Weise verwendet werden als Funktionsbezeichner, Operatoren, Ausdrücke etc. - - Reserviert sind: *after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor* -- Tupel (Tuples): - - {123, bcd} % Ein Tupel aus Ganzzahl und Atom - - {123, def, abc} - - {person, 'Joe', 'Armstrong'} - - {abc, {def, 123}, jkl} - - {} - - Erläuterungen: - - Können eine feste Anzahl von “Dingen” speichern - - Tupel beliebiger Größe sind zulässig - - Kommentare werden in Erlang mit % eingeleitet und erstrecken sich dann bis zum Zeilenende -- Listen: - - [123, xyz] - - [123, def, abc] - - [{person, 'Joe', 'Armstrong'}, {person, 'Robert', 'Virding'}, {person, 'Mike', 'Williams'}] - - "abcdefgh" wird zu [97,98,99,100,101,102,103,104] - - "" wird zu [] - - Erläuterungen: - - Listen können eine variable Anzahl von Dingen speichern - - Die Größe von Listen wird dynamisch bestimmt - - "..." ist eine Kurzform für die Liste der Ganzzahlen, die die ASCIICodes der Zeichen innerhalb der Anführungszeichen repräsentieren -- Variablen: - - Abc - - A_long_variable_name - - AnObjectOrientatedVariableName - - Erläuterungen: - - Fangen grundsätzlich mit einem Großbuchstaben an - - Keine „Funny Characters" - - Variablen werden zu Speicherung von Werten von Datenstrukturen verwendet - - Variablen können nur einmal gebunden werden! - - Der Wert einer Variablen kann also nicht mehr verändert werden, nachdem er einmal gesetzt wurde: *N = N + 1 VERBOTEN!* - - Einzige Ausnahmen: Die anonyme Variable "_" (kein Lesen möglich) und das Löschen einer Variable im Interpreter mit f(N). -- Komplexe Datenstrukturen: - - [{{person,'Joe', 'Armstrong'}, {telephoneNumber, [3,5,9,7]}, {shoeSize, 42}, {pets, [{cat, tubby},{cat, tiger}]}, {children,[{thomas, 5},{claire,1}]}}, {{person,'Mike','Williams'}, {shoeSize,41}, {likes,[boats, beer]}, ... }] - - Erläuterungen: - - Beliebig komplexe Strukturen können erzeugt werden - - Datenstrukturen können durch einfaches Hinschreiben erzeugt werden (keine explizite Speicherbelegung oder -freigabe) - - Datenstrukturen können gebundene Variablen enthalten -- Pattern Matching: - - $A = 10$ erfolgreich, bindet A zu 10 - - ${B, C, D} = {10, foo, bar}$ erfolgreich, bindet B zu 10, C zu foo and D zu bar - - ${A, A, B} = {abc, abc, foo}$ erfolgreich, bindet A zu abc, B zu foo - - ${A, A, B} = {abc, def, 123}$ schlägt fehl (“fails”) - - $[A,B,C] = [1,2,3]$ erfolgreich, bindet A zu 1, B zu 2, C zu 3 - - $[A,B,C,D] = [1,2,3]$ schlägt fehl - - $[A,B|C] = [1,2,3,4,5,6,7]$ erfolgreich bindet A zu 1, B zu 2, C zu [3,4,5,6,7] - - $[H|T] = [1,2,3,4]$ erfolgreich, bindet H zu 1, T zu [2,3,4] - - $[H|T] = [abc]$ erfolgreich, bindet H zu abc, T zu [] - - $[H|T] = []$ schlägt fehl - - ${A,_, [B|_],{B}} = {abc,23,[22,x],{22}}$ erfolgreich, bindet A zu abc, B zu 22 - - Erläuterungen: - - „Pattern Matching“, zu Deutsch „Mustervergleich“, spielt eine zentrale Rolle bei der Auswahl der „richtigen“ Anweisungsfolge für einen konkreten Funktionsaufruf und dem Binden der Variablen für die Funktionsparameter (siehe spätere Erklärungen) - - Beachte die Verwendung von "_", der anonymen (“don't care”) Variable (diese Variable kann beliebig oft gebunden, jedoch nie ausgelesen werden, da ihr Inhalt keine Rolle spielt). - - Im letzten Beispiel wird die Variable B nur einmal an den Wert 22 gebunden (das klappt, da der letzte Wert genau {22} ist) -- Funktionsaufrufe: - - module:func(Arg1, Arg2, ... Argn) - - func(Arg1, Arg2, .. Argn) - - Erläuterungen: - - Arg1 .. Argn sind beliebige Erlang-Datenstrukturen - - Die Funktion und die Modulnamen müssen Atome sein (im obigen Beispiel module und func) - - Eine Funktion darf auch ohne Parameter (Argumente) sein (z.B. date() – gibt das aktuelle Datum zurück) - - Funktionen werden innerhalb von Modulen definiert - - Funktionen müssen exportiert werden, bevor sie außerhalb des Moduls, in dem sie definiert sind, verwendet werden - - Innerhalb ihres Moduls können Funktionen ohne den vorangestellten Modulnamen aufgerufen werden (sonst nur nach einer vorherigen Import-Anweisung) -- Modul-Deklaration: - ```erlang - -module(demo). - -export([double/1]). - double(X) -> times(X, 2). - times(X, N) -> X * N. - ``` - - Erläuterungen: - - Die Funktion double kann auch außerhalb des Moduls verwendet werden, times ist nur lokal in dem Modul verwendbar - - Die Bezeichnung double/1 deklariert die Funktion double mit einem Argument - - Beachte: double/1 und double/2 bezeichnen zwei unterschiedliche Funktionen -- Eingebaute Funktionen (Built In Functions, BIFs) - - date() - - time() - - length([1,2,3,4,5]) - - size({a,b,c}) - - atom_to_list(an_atom) - - list_to_tuple([1,2,3,4]) - - integer_to_list(2234) - - tuple_to_list({}) - - Erläuterungen: - - Eingebaute Funktionen sind im Modul erlang deklariert - - Für Aufgaben, die mit normalen Funktionen nicht oder nur sehr schwierig in Erlang realisiert werden können - - Verändern das Verhalten des Systems - - Beschrieben im Erlang BIFs Handbuch -- Definition von Funktionen: - ```erlang - func(Pattern1, Pattern2, ...) -> - ... ; % Vor dem ; steht der Rumpf - func(Pattern1, Pattern2, ...) -> - ... ; % Das ; kündigt weitere Alternativen an - ... % Beliebig viele Alternativen möglich - func(Pattern1, Pattern2, ...) -> - ... . % Am Ende muss ein Punkt stehen! - ``` - - Erläuterungen: - - Funktionen werden als Sequenz von Klauseln definiert - - Sequentielles Testen der Klauseln bis das erste Muster erkannt wird (Pattern Matching) - - Das Pattern Matching bindet alle Variablen im Kopf der Klausel - - Variablen sind lokal zu jeder Klausel (automatische Speicherverw.) - - Der entsprechende Anweisungsrumpf wird sequentiell ausgeführt - -Was passiert wenn wir mathstuff:factorial() mit einem negativen Argument aufrufen? Der Interpreter reagiert nicht mehr? -- Erste Reaktion: rette das Laufzeitsystem durch Eingabe von CTRL-G - - User switch command - 01. --> h - 02. c [nn] - connect to job - 03. i [nn] - interrupt job - 04. k [nn] - kill job - 05. j - list all jobs - 06. s [shell] - start local shell - 07. r [node [shell]] - start remote shell - 08. q - quit erlang - 09. ? | h - this message - 10. --> - - Liste durch Eingabe von j alle Jobnummern auf - - Beende den entsprechenden Shell-Job durch k - - Starte eine neue Shell durch Eingabe von s - - Liste durch erneute Eingabe von j die neuen Jobnummern auf - - Verbinde durch Eingabe von c mit neuer Shell -- Zweite Reaktion: Ergänze factorial() um zusätzliche Bedingung: - - „Beschütze“ die Funktion vor Endlosrekursion durch Ergänzung eines sogenannten Wächters (Guards) bei dem entsprechenden Fallmuster (Pattern) - - Erläuterungen: - - Der Guard wird durch das Atom when und eine Bedingung vor dem Pfeil -> formuliert - - Vollständig „beschützte“ Klauseln können in beliebiger Reihenfolge angeordnet werden - - Achtung: Ohne Guard führt diese Reihenfolge zu Endlosschleifen - - Beispiele für Guards: - - number(X) % X is a number - - integer(X) % X is an integer - - float(X) % X is a float - - atom(X) % X is an atom - - tuple(X) % X is a tuple - - list(X) % X is a list - - length(X) == 3 % X is a list of length 3 - - size(X) == 2 % X is a tuple of size 2. - - X > Y + Z % X is > Y + Z - - X == Y % X is equal to Y - - X =:= Y % X is exactly equal to Y (i.e. 1 == 1.0 succeeds but 1 =:= 1.0 fails) - - Alle Variablen in einem Wächter müssen zuvor gebunden werden - -- Traversieren (“Ablaufen”) von Listen: - ``` - average(X) -> sum(X) / len(X). - sum([H|T]) -> H + sum(T); % summiert alle Werte auf - sum([]) -> 0. - len([_|T]) -> 1 + len(T); % Wert des Elements - len([]) -> 0. % interessiert nicht - ``` - - Die Funktionen sum und len verwenden das gleiche Rekursionsmuster - - Zwei weitere gebräuchliche Rekursionsmuster: - ``` - double([H|T]) -> [2*H|double(T)]; % verdoppelt alle - double([]) -> []. % Listenelemente - - member(H, [H|_]) -> true; % prüft auf - member(H, [_|T]) -> member(H, T); % Enthaltensein - member(_, []) -> false. % in Liste - ``` -- Listen und Akkumulatoren: - ``` - average(X) -> average(X, 0, 0). - average([H|T], Length, Sum) -> average(T, Length + 1, Sum + H); - average([], Length, Sum) -> Sum / Length. - ``` - - Interessant sind an diesem Beispiel: - - Die Liste wird nur einmal traversiert - - Der Speicheraufwand bei der Ausführung ist konstant, da die Funktion “endrekursiv” ist (nach Rekursion steht Ergebnis fest) - - Die Variablen Length und Sum spielen die Rolle von Akkumulatoren - - Bemerkung: average([]) ist nicht definiert, da man nicht den Durchschnitt von 0 Werten berechnen kann (führt zu Laufzeitfehler) -- „Identisch“ benannte Funktionen mit unterschiedlicher Parameterzahl: - ``` - sum(L) -> sum(L, 0). - sum([], N) -> N; - sum([H|T], N) -> sum(T, H+N). - ``` - - Erläuterungen: - - Die Funktion sum/1 summiert die Elemente einer als Parameter übergebenen Liste - - Sie verwendet eine Hilfsfunktion, die mit sum/2 benannt ist - - Die Hilfsfunktion hätte auch irgendeinen anderen Namen haben können - - Für Erlang sind sum/1 und sum/2 tatsächlich unterschiedliche Funktionsnamen -- Shell-Kommandos: - - h() - history . Print the last 20 commands. - - b() - bindings. See all variable bindings. - - f() - forget. Forget all variable bindings. - - f(Var) - forget. Forget the binding of variable X. This can ONLY be used as a command to the shell - NOT in the body of a function! - - e(n) - evaluate. Evaluate the n:th command in history. - - e(-1) Evaluate the previous command. - - Erläuterungen: Die Kommandozeile kann wie mit dem Editor Emacs editiert werden (werl.exe unterstützt zusätzlich Historie mit Cursortasten) -- Spezielle Funktionen: - ``` - apply(Func, Args) - apply(Mod, Func, Args) % old style, deprecated - ``` - - Erläuterungen: - - Wendet die Funktion Func (im Modul Mod bei der zweiten Variante) auf die Argumente an, die in der Liste Args enthalten sind - - Mod und Func müssen Atome sein bzw. Ausdrücke, die zu Atomen evaluiert werden und die eine Funktion bzw. Modul referenzieren - - Jeder Erlang-Ausdruck kann für die Formulierung der an die Funktion zu übergebenden Argumente verwendet werden - - Die Stelligkeit der Funktion ist gleich der Länge der Argumentliste - - Beispiel: ```` 1> apply( lists1,min_max,[[4,1,7,3,9,10]]).``` -> {1, 10} - - Bemerkung: Die Funktion min_max erhält hier ein (!) Argument -- Anonyme Funktionen: - ``` - Double = fun(X) -> 2*X end. - > Double(4). - > 8 - ``` - - Erläuterung: - - Mittels “fun” können anonyme Funktionen deklariert werden - - Diese können auch einer Variablen (im obigen Beispiel Double) zugewiesen werden - - Interessant wird diese Art der Funktionsdefinition, da anonyme Funktionen auch als Parameter übergeben bzw. als Ergebniswert zurückgegeben werden können - - Die Funktionen, die anonyme Funktionen als Parameter akzeptieren bzw. als Ergebnis zurückgeben nennt man Funktionen höherer Ordnung - -Kap 3a seite 48-84 - -## Lambda Kalkül -[comment]: <> (Kapitel 3b) - -# Multithreading & Parallele Programmierung -[comment]: <> (Kapitel 4) -## Grundlagen - -## Parallele Programmierung in Erlang - -## Parallele Programmierung in C++ -### Threads -Thread („Faden“) := leichtgewichtige Ausführungseinheit oder Kontrollfluss (Folge von Anweisungen) innerhalb eines sich in Ausführung befindlichen Programms -- Threads teilen sich den Adressraum des ihres Prozesses -- in C++: Instanzen der Klasse std::thread -- führen eine (initiale) Funktion aus - -```cpp -#include -#include - -void say_hello() { - std::cout << "Hello Concurrent C++\n"; -} - -int main() { - std::thread t(say_hello); - t.join(); -} -``` -Alternative Erzeugung von Threads über Lamda Ausdruck: -```cpp -std::thread t([]() { do_something(); }); -``` -oder mit Instanz einer Klasse - erfordert Überladen von operator() -```cpp -struct my_task { - void operator()() const { do_something(); } -}; - -my_task tsk; -std::thread t1(tsk); // mit Objekt -std::thread t2{ my_task() }; // über Konstruktor -``` - -Parameter-Übergabe bei Thread-Erzeugung über zusätzliche Argumente des thread-Konstruktors. Vorsicht bei Übergabe von Referenzen, wenn -Eltern-Thread vor dem erzeugten Thread beendet wird. -```cpp -void fun(int n, const std::string& s) { - for (auto i = 0; i < n; i++) - std::cout << s << " "; - std::cout << std::endl; -} -std::thread t(fun, 2, "Hello"); -t.join(); -``` - -Warten auf Threads -- t.join() wartet auf Beendigung des Threads t -- blockiert aktuellen Thread -- ohne join() keine Garantie, dass t zur Ausführung kommt -- Freigabe der Ressourcen des Threads -```cpp -std::thread t([]() { do_something(); }); -t.join(); -``` - -Hintergrund Threads -- Threads können auch im Hintergrund laufen, ohne dass auf Ende gewartet werden muss -- „abkoppeln“ durch detach() -- Thread läuft danach unter Kontrolle des C++-Laufzeitsystems, join nicht mehr möglich - -Thread-Identifikation -- Thread-Identifikator vom Typ `std::thread::id` -- Ermittlung über Methode get_id() -```cpp -void fun() { - std::cout << "Hello from " - << std::this_thread::get_id() - << std::endl; -} -std::thread t(fun); -t.join(); -``` - - -### Datenparallele Verarbeitung -### Kommunikation zwischen Threads -### Taskparallelität +# Programmierparadigmen + +## Was ist ein Paradigma? +- Paradigma – aus dem Altgriechischen Beispiel, Muster; Erzählung mit beispielhaftem Charakter (laut Duden) +- Programmierparadigmen beschreiben grundsätzliche Arten wie Computer-Programme formuliert werden können +- Programmiersprachen können einzelne oder viele Konzepte aufgreifen + - Keine verbreitete Sprache greift alle behandelten Konzepte auf + - Betrachtung unterschiedlicher Sprachen +- Ziel der Veranstaltung: Weiten der in Algorithmen und Programmierung eingeführten Sichten hin zu einem Werkzeugkoffer zur Lösung realer Probleme... + +## Warum unterschiedliche Paradigmen? +Komplexität von Software schlecht beherrschbar + +## Was bedeutet das? +- Programmierer schreiben, testen und dokumentieren zwischen 325 und 750 Codezeilen pro Monat + - maximal 360.000 Zeilen in 40 Jahren! +- Komplexität muss verborgen werden, z.B. durch + - Kapselung + - Spezifische Spachkonstrukte, Domain Specific Languages + - Ausdrucksstärkere Sprachen +- Entwicklung neuer Programmierparadigmen hilft Grenzen (ein wenig) zu verschieben +- Theoretische Rahmenbedingungen (Turing-Mächtigkeit, Satz von Rice) behalten Gültigkeit! + +## Welche Paradigmen existieren? +- Aus Vorlesung AuP: + - Imperative Algorithmen + - Applikative Algorithmen + - Deduktive Algorithmen +- Aber Vielzahl weiterer Formen + - teilweise ergänzend, unterschiedliche Kategorisierung möglich + - Bsp: prozedural, deklarativ, objekt-orientiert, datenstromorientiert, parallele & verteilte Programmierung... +- Teilweise unterschiedliche Bezeichnungen + - Applikativ bzw. Funktional + - Deduktiv bzw. Logisch +- Aktueller Trend: Multiparadigmen-Sprachen + - Umsetzung unterschiedlichster Paradigmen in einer Sprache + - Beispiele: Scala, neuere C++-Standards, ... + +# Objektorientierung und weiterführende Konzepte am Beispiel Java +- Bekannt: + - Grundlegendes Verständnis von Java + - Kapselung durch Klassen und Vererbung +- Ziele: + - Verständnis der Probleme bei Vererbung und Typersetzbarkeit in objektorientierten Programmiersprachen + - Kennenlernen der Grundideen generischer und abstrahierender Konzepte in Objekt-orientierter Programmierung (OOP) + - Praktische Erfahrungen anhand von Java & C++ +- Ausdrucksstärke erhöhen, Komplexität verbergen + +## Unit Testing +### Motivation +- Große Software-Systeme entwickeln sich über lange Zeiträume +- Wie können Änderungen an komplexen Code-Basen beherrscht werden? +- Veränderung über Zeit + Komplexität der Software + - Änderungen führen mglw. zu Auswirkungen, die für Einzelne nicht immer überschaubar sind + - Software muss nach Änderung von Grund auf durchgetestet werden +- Verbreitetes Vorgehen: zusätzlichen Code schreiben, der eigentlichen Code automatisch “überprüft” + - Nicht vollständig möglich (z.B. Halteproblem) + - Eher Heuristik +- Test-Code wird bei Ereignissen oder periodisch ausgeführt + - Vor Releases, nach Commit in Repository, während der Entwicklung ... + +### Eigenschaften von Unit-Tests +- Software schlecht als Ganzes testbar -> Zergliederung von Software in sinnvolle Einheiten +- Individuelle Tests dieser Einheiten +- Dabei: reproduzierbar & vollautomatisierbar + - Ziel: Wann immer Änderungen in komplexen Programmen vorgenommen werden, möglichst vollständiger Test, da Programmierer nicht mehr alles überblicken +- Messung der Vollständigkeit der Tests schwierig +- Üblich: Messung von Überdeckung (Coverage) in Bezug auf Anzahl Funktionen, Code-Zeilen oder Verzweigungen +- Gute Praxis: Wenn ein Bug beim Testen oder Live-Betrieb auftritt -> Schreiben eines zusätzlichen Tests, um Wiederauftreten zu erkennen + +### Unit-Testing in Java +- De facto Standard: JUnit Framework +- „Best Practice” für einfachen Einsatz: + - Java Code in ein oder mehrere Klassen im Ordner src speichern + - Im Ordner tests jeweils eine Klasse anlegen, die Funktionen einer Implementierungsklasse prüft + - Konvention: Testklasse einer Klasse Name heißt NameTest + - Eigentliche Tests werden in Methoden implementiert, die als Tests annotiert sind + - Typischer Ansatz: für bekannte Werte ausführen und Ergebnis mit Grundwahrheit (erwartetes Verhalten) vergleichen, bspw. mit assertEquals-Funktion +- Viele weitere Features, z.B. Deaktivieren von Tests, Timeouts, GUI Coverage, Mocks + +### Unit Testing – Richtiges Abstraktionsniveau +- Um die Tests auszuführen, müssen jeweils entsprechende Hauptprogramme generiert werden („Test Suites“) +- Hauptschwierigkeiten von Unit-Tests: + - Richtiges Abstraktionsniveau + - „Herauslösen“ von zu testendem Code aus Umgebung +- Zwei wesentliche Möglichkeiten: + 1. Individuelles Testen von Klassen: + - Vernachlässigt Zusammenspiel zwischen Klassen + - Oft sehr aufwändig, da andere Klassen für Unit-Tests nachgebildet werden müssen (Mocks) + - Was bei zyklischen Abhängigkeiten? + 2. Gemeinsames Testen von Klassen: + - Erfordert Eingreifen in gekapselte Funktionalitäten + - Private & Protected Member-Variablen & Methoden! + - Eigentlich nicht möglich?! + +## Reflections +- Normaler Ablauf: Programm schreiben, compilieren, ausführen + - Aber was wenn ich ein Programm zur Laufzeit inspizieren oder verändern möchte? +- Unterschiedliche Gründe + - Testen (um Fehler zu injizieren!) + - Fehlersuche („Debugging“) + - Nachladen von Plugins zur Modularisierung von Programmen + - Serialisierung/Deserialisierung von Code + - „Patchen“ zur Laufzeit + - Erkunden der Ablaufumgebung (z.B. OS-/Shared-Library Version) +- Benötigt die Fähigkeit, im Programm Codestruktur zu analysieren und ggf. zu verändern: + - Typisch: Abruf Klassenhierarchie, Auflisten von Methoden und Parametern, Austausch von Klassen und Methoden + - Teil von Java, Python, ... + +API verstreut über verschiedene Packages, z.B. java.lang.Class, java.lang.instrument, java.lang.reflect + +```java +Class cls = "test".getClass(); +System.out.println("Die Klasse heisst " + cls.getName()); +// Die Klasse heisst java.lang.String +``` +```java +// import java.lang.reflect.Method; +Method[] methods = cls.getMethods(); +for (Method m : methods) +System.out.println(m.getName()); +``` +### Annotationen +- Annotationen erlauben Anmerkungen an Klassen & Methoden +- Beginnen mit @ +- Einige wenige vordefinierte z.B. @Override +- Aber auch eigene; u.a. durch Reflections abrufbar +- Häufig genutzt, wenn zusätzlicher Code geladen wird (Java EE) +- Oder um Unit-Tests zu markieren... +```java +class MultiTest { + @org.junit.jupiter.api.Test + void mul() { + ... +``` + +### Reflektionen über Reflections +- Reflections sind ein sehr mächtiges Werkzeug, aber Einsatz sollte wohldosiert erfolgen +- Nachteile: + - Geringe Geschwindigkeit weil Zugriff über Programmcode erfolgt + - Kapselung kann umgangen werden + - private, protected und final können entfernt werden + - Aufruf/Veränderung interner Methoden & Auslesen/Veränderung interner Variablen + - Synchronisation zwischen externen und internen Komponenten bei Weiterentwicklung? + - Debugging veränderter Programme? + - Sicherheit?! +- Verwandte Techniken: + - Monkey Patching (JavaScript-Umfeld) + - Method Swizzling (Swift/Objective-C-Umfeld) + + +## Assertions +- Kann man interne Zustände testen, ohne invasive Techniken wie Reflections? +- Einfache Möglichkeit: An sinnvollen Stellen im Programmcode testen, ob Annahmen/Zusicherungen (Assertions) stimmen... +- Tests, die nie falsch sein sollten + - Erlauben gezielten Programmabbruch, um Folgefehler zu vermeiden + - Erlauben gezieltes Beheben von Fehlern + - Gemeinsames Entwickeln von Annahmen und Code +```java +class Stack { + public void push(Object o) { + ... + if(empty() == true) // es sollte ein Objekt da sein + System.exit(-1); + } + ... +} +``` + +Aber: Ausführungsgeschwindigkeit niedriger +- Zeitverlust stark abhängig von Programm/Programmiersprache +- Verbreitetes Vorgehen: + - Aktivieren der Tests in UnitTests und Debug-Versionen + - Deaktivieren in Releases + - Benötigt spezielle „if“-Bedingung: assert +- Aktivierung der Tests über Start mit java -ea +```java +class Stack { + public void push(Object o) { + ... + assert empty() == false +} +``` + +### Welche braucht man? +- Woran erkennt man beim Programmieren bzw. (erneutem) Lesen von Code, dass man eine Assertion hinzufügen sollte? +- Eine einfache Heuristik – Die „Eigentlich“-Regel: + - Wenn einem beim Lesen von Programmcode ein Gedanke der Art „Eigentlich müsste an dieser Stelle XY gelten“ durch den Kopf geht, + - dann sofort eine entsprechende Assertion formulieren! + +### Spezielle Assertions: Pre- & Postconditions +- An welchen Stellen ist es sinnvoll, Annahmen zu prüfen? +- Einfache Antwort: an so vielen Stellen wie möglich +- Komplexere Antwort: Design by contract, ursprünglich Eiffel +- Methoden/Programmabschnitte testen Bedingung vor und nach Ausführung +- Einige Sprachen bieten spezialisierte Befehle: requires und ensures +-> Ziel mancher Sprachen: Formale Aussagen über Korrektheit + +```java +class Stack { + public void push(Object o) { + assert o != null // precondition + ... + assert empty() == false // postcondition + } + ... +} +``` + +### Klasseninvarianten +- Bei OO-Programmierung sind Vor- und Nachbedingungen nur eingeschränkt sinnvoll +- Bedingungen oft besser auf Objekt-Ebene -> interner Zustand +- Invarianten spezifizieren Prüfbedingungen +- In Java nicht nativ unterstützt: + - Erweiterungen, wie Java Modeling Language + - Simulation: +```java +class Stack { + void isValid() { + for(Object o : _objs) // Achtung: O(n) Aufwand! + assert o != null + } + public void push(Object o) { + isValid() // always call invariant + ... + isValid() // always call invariant +} +``` + +## Exeptions +Signifikantes Element vieler Sprachen: Wie wird mit Fehlern umgegangen? +Fehler können unterschiedliche Gründe haben +Besser für Code-Komplexität: Fehlerprüfungen an zentralerer Stelle +- Abbrechen und Programm-Stack „abbauen“ bis (zentrale) Fehlerbehandlung greift +- Dabei Fehler sinnvoll gruppieren +- Java (und viele mehr): try/catch/throw-Konstrukt +```java +private void readFile(String f) { + try { + Path file = Paths.get("/tmp/file"); + if(Files.exists(file) == false) + throw new IOException("No such dir"); + array = Files.readAllBytes(file); + } catch(IOException e) { + // do something about it + } +} +``` +throw übergibt ein Objekt vom Typ Throwable an Handler, dabei zwei Unterarten: +- Error: Sollte nicht abgefangen werden z.B. Fehler im Byte-Code, Fehlgeschlagene Assertions +- Exceptions: + - Checked Exception: Programm muss Exception fangen oder in Methode vermerken + - Runtime Exceptions: Müssen nicht (aber sollten) explizit behandelt werden, bspw. ArithmeticException oder IndexOutOfBoundsException + +### Checked Exceptions +Deklaration einer überprüften Exception: +```java + void dangerousFunction() throws IOException { + ... + if(onFire) + throw IOException("Already burns"); + ... +} +``` +Die Deklaration mit "throws IOException" lässt beim build mögliche Fehler durch IOExceptions dieser Funktion zu, diese müssen durch die aufrufende Methode abgefangen werden. +Aufrufe ohne try-catch-Block schlagen fehl! +Sollte man checked oder unchecked Exceptions verwenden? +- Checked sind potenziell sicherer +- Unchecked machen Methoden lesbarer +- Faustregel unchecked, wenn immer auftreten können (zu wenig Speicher, Division durch 0) + +Abfangen mehrerer unterschiedlicher Exceptions +```java +try { + dangerousFunction(); +} catch(IOException i) { + // handle that nasty error +} catch(Exception e) { + // handle all other exceptions +} +``` +Aufräumen nach einem try-catch-Block: Anweisungen im finally-Block werden immer ausgeführt, d.h. auch bei +return in try- oder catch-Block (oder fehlerloser Ausführung) +```java +try { + dangerousFunction(); +} catch(Exception e) { + // handle exceptions + return; +} finally { + // release locks etc.. +} +``` + + +## Generizät von Datentypen +(Typ-)Generizität: +- Anwendung einer Implementierung auf verschiedene Datentypen +- Parametrisierung eines Software-Elementes (Methode, Datenstruktur, Klasse, ...) durch einen oder mehrere Typen +Beispiel: +```java +int min(int a, int b) { + return a < b ? a : b; +} +float min(float a, float b) { + return a < b ? a : b; +} +String min(String a, String b) { // lexikographisch + return a.compareTo(b) < 0 ? a : b; +} +``` + +### Grenzen von Typsubstitution +Problem: Für jeden Typ? Wie kann sort implementiert werden? +Möglicher Ausweg: Klassenhierarchie mit zentraler Basisklasse +```java +void sort(Object[] feld) { ... } //z.B. java.lang.Object +void sort(java.util.Vector feld) { ... } //alternativ (nutzt intern Object) +``` +Möglicher Ausweg 2: Nutzung primitiver Datentypen nicht direkt möglich +```java +Object[] feld = new Object[10]; //Object[] ≠ int[] +feld[0] = new Integer(42); +int i = ((Integer) feld[0]).intValue(); //erfordert Wrapper-Klassen wie java.lang.Integer +``` + +Weiteres Problem: Typsicherheit
+Typ-Substituierbarkeit: Kann ein Objekt einer Oberklasse (eines Typs) durch ein Objekt seiner Unterklasse (Subtyps) ersetzt werden? +Beispiel (isSubtyp): short $\rightarrow$ int $\rightarrow$ long +Viele Programmiersprachen ersetzen Typen automatisch, d.h. diese wird auch für shorts und ints verwendet +```java +long min(long a, long b) { + return a < b ? a : b; +} +``` + +Kreis-Ellipse-Problem: Modellierung von Vererbungsbeziehungen +- „Ist ein Kreis eine Ellipse?“ „Oder eine Ellipse ein Kreis?“ +- Annahme: Kreis := Ellipse mit Höhe = Breite +```java +Circle c = new Circle(); +c.skaliereX(2.0); //skalieren aus Klasse Circle +c.skaliereY(.5); //is das noch ein Kreis? +``` +evtl. Reihenfolge in der Klassenhierarchie tauschen (nutzung von Radius)? Was bedeutet das für Ellipse? +Verwandte Probleme: Rechteck-Quadrat, Set-Bag + +### Ko- und Kontravarianz +Geg.: Ordnung von Datentypen von spezifisch $\rightarrow$ allgemeiner +- Gleichzeitige Betrachtung einer Klassenhierarchie, die Datentypen verwendet +- Kovarianz: Erhaltung der Ordnung der Typen +- Kontravarianz: Umkehrung der Ordnung +- Invarianz: keines von beiden +- Anwendung für + - Parameter + - Rückgabetypen + - Ausnahmetypen + - Generische Datenstrukturen + +Beispiel: Basierend auf Meyer‘s SKIER-Szenario +```java +class Student { + String name; + Student mate; + void setRoomMate(Student s) { ... } +} +``` +Wie überschreibt man in einer Unterklasse Girl oder Boy die Methode „setRoomMate“ in elternfreundlicher Weise? Von Eltern sicher gewollt - Kovarianz: +```java +class Boy extends Student { + void setRoomMate(Boy b) { ... } +} +class Girl extends Student { + void setRoomMate(Girl g) { ... } +} +``` +Was passiert mit folgendem Code? +```java +Boy kevin = new Boy("Kevin"); +Girl vivian = new Girl("Vivian"); +kevin.setRoomMate(vivian); +``` +- Verwendet setRoomMate der Basisklasse +- setRoomMate Methoden der abgeleiteten Klassen überladen nur Spezialfälle $\rightarrow$ gültig + +- In C++ und Java keine Einschränkung der Typen zur Compile-Zeit +- Kovarianz so nur in wenigen Sprachen implementiert (z.B. Eiffel über redefine); Überprüfung auch nicht immer statisch! +- Auch bekannt als catcall-Problem (cat = changed availablility type) +Ausweg: Laufzeitüberprüfung +```java +class Girl extends Student { + ... + public void setRoomMate(Student s) { //student wird aufgerufen! nicht boy oder girl, dadurch können die methoden der klasse verwendet werden + if (s instanceof Girl) + super.setRoomMate(s); + else + throw new ParentException("Oh Oh!"); + } +} +``` +Nachteil: Nur zur Laufzeit überprüfung + +#### Ko- und Kontravarianz für Rückgabewerte +Kovarianz (gängig): +```java +public class KlasseA { + KlasseA ich() { return this; } +} +public class KlasseB extends KlasseA { + KlasseB ich() { return this; } +} +``` +Kontravarianz macht wenig Sinn und kommt (gängig) nicht vor + +In objektorientierten Programmiersprachen im Allgemeinen +- Kontravarianz: für Eingabeparameter +- Kovarianz: für Rückgabewerte und Ausnahmen +- Invarianz: für Ein- und Ausgabeparameter + +### Liskovsches Substitutionsprinzip (LSP) +Barbara Liskov, 1988 bzw. 1993, definiert stärkere Form der Subtyp-Relation, berücksichtigt Verhalten: +> Wenn es für jedes Objekt $o_1$ eines Typs S ein Objekt $o_2$ des Typs T gibt, so dass für alle Programme P, die mit Operationen von T definiert sind, das Verhalten von P unverändert bleibt, wenn $o_2$ durch $o_1$ ersetzt wird, dann ist S ein Subtyp von T.' +Subtyp darf Funktionalität eines Basistyps nur erweitern, aber nicht einschränken.
+Beispiel: Kreis-Ellipse $\rightarrow$ Kreis als Unterklasse schränkt Funktionalität ein und verletzt damit LSP + +### Generics in Java (Typsicherheit) +Motivation: Parametrisierung von Kollektionen mit Typen +```java +LinkedList liste = new LinkedList(); +liste.add("Generics"); +String s = liste.get(0); +``` +auch für Iteratoren nutzbar +```java +Iterator iter = liste.iterator(); + while(iter.hasNext()) { + String s = iter.next(); + ... +} +``` +oder mit erweiterter for-Schleife +```java +for(String s : liste) { + System.out.println(s); +} +``` + +Deklaration: Definition mit Typparameter +```java +class GMethod { + static T thisOrThat(T first, T second) { + return Math.random() > 0.5 ? first : second; + } +} +``` +- T = Typparameter (oder auch Typvariable) wird wie Typ verwendet, stellt jedoch nur einen Platzhalter dar +- wird bei Instanziierung (Parametrisierung) durch konkreten Typ „ersetzt“ +- nur Referenzdatentypen (Klassennamen), keine primitiven Datentypen +Anwendung: +- explizite Angabe des Typparameters + ```java + String s = GMethod.thisOrThat("Java", "C++"); + Integer>thisOrThat(new Integer(42), new Integer(23)); + ``` +- automatische Typinferenz durch Compiler + ```java + String s = GMethod.thisOrThat("Java", "C++"); + Integer i = GMethod.thisOrThat(new Integer(42), new Integer(23)); + ``` + +#### Eingrenzung von Typparametern +Festlegung einer Mindestfunktionalität der einzusetzenden Klasse, z.B. durch Angabe einer Basisklasse +- Instanziierung von T muss von Comparable abgeleitet werden (hier ein Interface, dass wiederum generisch ist, daher Comparable) +- Verletzung wird vom Compiler erkannt +```java +static> T min(T first, T second) { + return first.compareTo(second) < 0 ? first : second; +} +``` +Angabe des Typparameters bei der Klassendefinition: +```java +class GArray { + T[] data; + int size = 0; + public GArray(int capacity) { ... } + public T get(int idx) { return data[idx]; } + public void add(T obj) { ... } +} +``` +Achtung: new T[n] ist unzulässig! Grund liegt in der Implementierung von Generics: +Es gibt zwei Möglichkeiten der internen Umsetzung generischen Codes: +- Code-Spezialisierung: jede neue Instanziierung generiert neuen Code + - Array → ArrayString, Array → ArrayInteger + - Problem: Codegröße +- Code-Sharing: gemeinsamer Code für alle Instanziierungen + - Array → Array, Array → Array + - Probleme: keine Unterstützung primitiver Datentypen & keine Anpassung von Algorithmen an Typ +Java: Code-Sharing durch Typlöschung (Type Erasure) +Typen beim Übersetzen geprüft, aber keinen Einfluss auf Code +sichert auch Kompatibilität zu nicht generischem Code (Java-Version < 1.5) Bsp.: ArrayList vs. ArrayList + +Beispiel: Reflektion (Metaklassen) zur Erzeugung nutzen; danach Konstruktionsaufruf +```java +public GArray(Class clazz, int capacity) { + data = (T[]) Array.newInstance(clazz, capacity); +} + +GArray array = new GArray(String.class, 10); +``` + +#### Kovarianz generischer Typen +einfache Felder in Java sind kovariant +```java +Object[] feld = new Object[10]; +feld[0] = "String"; +feld[1] = new Integer(42); +``` +Instanziierungen mit unterschiedliche Typen sind jedoch inkompatibel +```java +GArray anArray = new GArray(); +GArray anotherArray = (GArray) anArray; +``` + +#### Wildcards +Wildcard „?“ als Typparameter und abstrakter Supertyp für alle Instanziierungen +```java +GArray aRef; +aRef = new GArray(); +aRef = new GArray(); +``` +aber nicht: +```java +GArray aRef = new GArray(); +``` +hilfreich insbesondere für generische Methoden +```java +// dieser Methode ist der genaue Typ egal +static void pO(GArray ia) { + for(Object o : ia) { + System.out.print(o); + } +} +// floats wollen wir mit Genauigkeit 2 haben +static void pF(GArray ia) { + for(Float f : ia) { + System.out.printf("%5.2f\n", f); + } +} +``` + +Beschränkte Wildcards +- nach „unten“ in der Klassenhierarchie $\rightarrow$ Kovarianz + ```java + ? extends Supertyp + ``` + Anwendungsbeispiel: Sortieren eines generischen Feldes erfordert Unterstützung der Comparable-Schnittstelle + ```java + void sortArray(GArray array) { + ... + } + ``` +- nach „oben“ in der Klassenhierarchie $\rightarrow$ Kontravarianz + ```java + ? super Subtyp + ``` + Anwendungsbeispiel: Feld mit ganzen Zahlen und Objekten + ```java + GArray array; + // Zuweisungskompatibel zu ... + array = new GArray(); + array = new GArray(); + array = new GArray(); + // aber nur erlaubt: + Object obj = array.get(0); + ``` + +PECS = Producer extends, Consumer super $\rightarrow$ Producer liest nur sachen, Consumer legt daten/Objekte/... ab + +# Objectorientierung am Beispiel C++ +- Ziel von C++: volle Kontrolle über Speicher & Ausführungsreihenfolgen sowie skalierbarere Projekt-Größe +- Kompiliert zu nativem Maschinencode und erlaubt genauere Aussagen über Speicher-, Cache- und Echtzeitverhalten +- Viele Hochsprachenelemente (Wie Java objektorientiert; sogar ähnliche Syntax an viele Stellen (weil Java ursprünglich an C++ angelehnt)) +- Jedoch kompromissloser Fokus Ausführungsgeschwindigkeit, d.h. + - Keine automatische Speicherverwaltung + - Keine Initialisierung von Variablen (im Allgemeinen) + - Kein Speicherschutz! + - Dinge, die Zeit kosten, müssen im Allgemeinen erst durch Schlüsselworte aktiviert werden +- C++ ist zu sehr großen Teilen eine Obermenge von C + - Fügt Objektorientierung hinzu + - Versucht fehleranfällige Konstrukte zu kapseln + - Führt (viele) weitere Sprachkonstrukte ein, die Code kompakter werden lassen + +## Vergleich mit Java +```java +[Hello.java] +package hello; // say that we are part of a package +public class Hello { // declare a class called Hello: +// declare the function main that takes an array of Strings: + public static void main(String args[]) { + // call the static method, println on class System.out with parameter "Hi Welt!": + System.out.println("Hi Welt!"); + } +} // end of class Hello +``` +```cpp +[Hello.cpp] +// include declarations for I/O library where cout object is specified in namespace std:: +#include +// declare the function main that takes an int and array of strings and returns an int as the exit code +int main(int argc, char* argv[]) { +// stream string to cout object flush line with endl + std::cout << "Hello world!" + << std::endl; + return 0; +} // end of main() +``` +- Unterschiede im Aufbau: + - C++ hat globale Funktionen, also außerhalb von Klassen, wie main + - #include gibt Dateien mit Klassen- und Funktionsdefinitionen an, die der Compiler einlesen soll + - Java-Programme werden in packages gegliedert, in C++ gibt es mit modules ein ähnliches Konzept, welches aber (noch) nicht verbreitet ist + - C++-Programme können (ohne Bezug zu Dateien) in namespaces untergliedert werden, hier std +- Programmargumente: + - In Java bekommt main ein String-Array übergeben, die Länge kann über .length abgefragt werden + - C/C++-Programme erhalten ein Array von char* (Details zu Pointern folgen) + - In C/C++ sind Arrays keine Pseudoobjekte, sondern Speicherbereiche in denen die Daten konsekutiv abgelegt sind $\rightarrow$ argc wird benötigt die Anzahl an Elementen zu kodieren +- Rückgabewerte: + - In Java keine Rückgabe in der main-Methode + - In C++ Rückgabe eines exit code + - 0 gibt an: Programmausführung erfolgreich + - Andere Werte geben einen Programm-spezifischen Fehlercode zurück +- Primitive Datentypen: + - Wie in Java einfache Datentypen, die „Zahlen“ enthalten + - char, short, int, long sind auf 64-bit Maschinen 8 bit, 16 bit, 32 bit und 64 bit breit (char braucht in Java 16 Bit!) + - long ist auf 32 bit Maschinen 32 Bit breit, long long [sic!] ist immer 64 Bit + - bool speichert Boolsche Werte (Breite hängt vom Compiler ab!) + - Ein unsigned vor Ganzahltypen gibt an, dass keine negativen Zahlen in der Variable gespeichert werden (Beispiel: unsigned int) $\rightarrow$ Kann größere Zahlen speichern & zu viel Unsinn führen (beim Vergleich mit vorzeichenbehafteten Zahlen) + +## C++ Klassen +Header Foo.hpp deklariert Struktur und Schnittstelle +```cpp +public: // Block ohne Zugriffsbeschränkung + Foo(); // Konstruktor + ~Foo(); // Destruktor +protected: // Block von Dingen, auf die auch abgeleitete Klassen zugreifen dürfen + int num; // Member-Variable +}; // WICHTIGES Semikolon! +``` + +Implementierung in getrennter Datei Foo.cpp +```cpp +#include "Foo.hpp" // Klassen Deklaration einbinden +#include // Einbinden von Funktionen der stdlib +Foo::Foo() : // Implementierung des Konstuktors von Foo + num(5) { // Statische Initialisierung von num, Code in Klammern {} kann auch initialisieren + std::cout << "c" << std::endl; +} +Foo::~Foo() { + std::cout << "d" << std::endl; +} +``` + +- Reine Implementierung auch im Header möglich, aber Trennung von Implementierung und Deklaration erlaubt schnelleres Kompilieren +- Trennung nicht immer möglich (später mehr Details), aber im Allgemeinen zu bevorzugen +- Der scope-Operator :: wird zum Zugriff auf namespaces und zur Beschreibung der Klassenzugehörigkeit von Methoden verwendet +- Initialisierung von Variablen vor Funktionsrumpf etwas „merkwürdig“ zu lesen, aber erlaubt schnelle Implementierungen... + - Syntax: nach Konstruktor : dann jeweils Variable(Wert) + - Variablen durch , getrennt + - Wichtig: Reihenfolge der Variablen wie in Deklaration der Klasse! +- Schlüsselworte private, protected und public vergleichbar zu Java, werden aber vor ganze Blöcke geschrieben + - Kapselung nur auf Ebene von Klassen ➞ Klassen sind immer public + - protected erlaubt nur der Klasse selber und Unterklassen den Zugriff +- Zugriffe außerhalb der Klassenstruktur können durch friend- Deklaration erlaubt werden (teilweise verrufen!) +- Auch *final* ähnlich zu Java $\righarrow$ Verhindert weiteres Ableiten von Klassen +- Schlüsselwort const markiert Methoden, die Objekte nicht verändern $\rightarrow$ Erlauben die Übergabe von Nur-Lesen-Referenzen +- Größere Unterschiede zu Java: + - Klassen können Destruktoren besitzen + - Werden aufgerufen wenn Objekt zerstört wird + - Kann bspw. dafür verwendet werden, um von dem Objekt allozierte Speicherbereiche freizugeben (Achtung: anschließend darf auf diese nicht mehr zugegriffen werden – problematisch wenn anderen Objekte diese Speicherbereiche bekannt gegeben wurden!) + - Destruktor kann Zerstören eines Objekts aber nicht verhindern + - Methodensignatur ~Klassenname() – kein Rückgabetyp! + - Warum gibt es das nicht in Java? + - Neben dem Standardkonstruktor oder einem expliziten Konstruktor existiert ein Copy-Constructor + - Methodensignatur Klassenname(const Klassenname& c) + - Wird aufgerufen wenn Objekt kopiert werden soll + - Vergleichbar zu Object.clone() in Java +- Überladen von Methoden vergleichbar zu Java + - Parametertypen (oder const-Markierung) müssen sich unterscheiden! + - Nur Veränderung des Rückgabewertes nicht ausreichend + ```cpp + class Foo { + public: + void doMagic(int i); + void doMagic(std::string s); + }; + ``` + +## C++ Präprozessor +C/C++-Code kann vor dem Übersetzen durch einen Präprozessor verändert werden +- Alle Präprozessor-Makros beginnen mit # +- (Haupt-)gründe: + - Importieren anderer Dateien + - An- und Ausschalten von Features je nach Compile-Optionen + - Kapselung von Plattform-spezifischem Code + - Vermeiden von Redundanzen +- Makros sollten vermieden werden + - Schwierig zu lesen + - Keine Namespaces + - Keine Typsicherheit +- Manchmal jedoch einzige Möglichkeit + +Beispiele: +```cpp +#include "X.hpp" // Datei X.hpp aus Projekt-Ordner +#include // Datei cstdio aus System-Includes + +#ifdef DEBUG // falls Konstante DEBUG definiert ist +std::cout << "Wichtige Debugausgabe" << std::endl; +#endif + +#define DEBUG // Konstante setzen +#define VERSION 3.1415 // Konstante auf einen Wert setzen +#define DPRINT(X) std::cout << X << std::endl; // Macro-Fkt. +#undef DEBUG // Konstante löschen, good practice! + +#ifndef __linux__ // falls nicht für Linux übersetzt +playMinesweeper(); +#endif +``` + +### Einschub: Include Guards +Eine (oft hässliche) Eigenschaft des #include-Befehls: kein Überprüfen ob eine Datei vorher bereits eingebunden wurde. Problematisches Beispiel: +```cpp +#include "Bar.hpp" //in "Bar.hpp" ist "Foo.hpp" bereits inkludiert worden +#include "Foo.hpp" //Fehler weil kallse Foo bereits deklariert wurde +``` +Common Practice: Include-Guards um alle Header-Dateien +```cpp +#ifndef FOO_HPP +#define FOO_HPP +... +#endif +``` + +## Speichermanagement +- Programmspeicher enthält Code und Daten, vom Betriebssystem i.A. auf virtuelle Adressbereiche abgebildet +- Unterschiedliche Varianten von Datenspeicher: + - Stack hält alle Variablen einer Methode, aller aufrufenden Methoden, Parameter, Rückgabewerte und einige Management-Daten + - Heap hält Variablen und Objekte, die nicht direkt über Methodenaufrufe übergeben werden + - Speicher für globale und statische Objekte und Variablen +- Java legt primitive Datentypen im Stack ab und Objekte im Heap +- C++ kann sowohl primitive Datentypen als auch Objekte in Stack und Heap abbilden +- Für den Stack bieten Java und C++ automatisches Speicher-Mgmt. +- Für den Heap bietet nur Java automatisches Speicher-Mgmt. + +### Eigenschaften des Stack-Speichers: + - Variablen/Objekte haben klare Lebensdauer $\rightarrow$ Werden immer gelöscht wenn Funktion verlassen wird $\rightarrow$ Man kann Speicher nicht „aufheben“ + - In der Regel sehr schnell, weil im Prozessor-Cache + - In der Größe begrenzt, z.B. 8MB bei aktuellen Linux-Systemen + - Für flexiblere Speicherung brauchen wir anders organisierten Speicher... + +### Heap: Keine klare Struktur + - Anlegen: in C++ & Java mit new + - Um angelegten Speicher anzusprechen: Zeiger und Referenzen + - In Java automatisch Zeiger + - In C++ Zeiger durch * hinter Typ + ```cpp + int main() { + int* i = new int[3]; + int* j = new int; + delete [] i; + delete j; + return 0; + } + ``` + - Löschen von Heap-Speicher: + - Java automatisch + - In C++ nur manuell + - durch genau einen Aufruf von delete + - Programmierer ist dafür verantwortlich, dass danach kein Zeiger auf diesen Speicher mehr benutzt wird + - Warum der Unterschied? + - Nicht einfach festzustellen, wann letzter Zeiger auf Objekt gelöscht wurde + - Zeiger können selbst auch im Heap gespeichert sein + - Zyklische Referenzen! + - Relativ aufwändiges Scannen, in Java durch regelmäßige Garbage Collection gelöst + - Führt zu Jitter (Schwankung der Zeitdauer, die bestimmte Programmabschnitte zur Bearbeitung benötigen) & Speicher-Overhead, ... + +Beispiele + - Anlegen eines Objects auf dem Heap: + ```cpp + std::string* s = new std::string("wiz!"); + delete s; + ``` + - Allokation von Feldern: + ```cpp + int* i = new int[29]; // gültige Indicies 0-28 + i[0] = 23; + delete [] i; // nicht mit delete i; verwechseln! + ``` + - Zeiger können durch & auf beliebige Variablen ermittelt werden + ```cpp + int i = 0; + int* j = &i; // &-Operator erzeugt Zeiger; j darf nicht gelöscht werden + ``` + - Zeiger können durch * dereferenziert werden + ```cpp + int i = 0; + int* j = &i; // &-Operator erzeugt Zeiger + *j = 1; // Zugriff auf Variableninhalt + ``` + - Zugriff auf Methoden/Member Variablen + ```cpp + std::string* s = new std::string("wiz"); + (*s).push_back('?'); // manuelles Derefenzieren + s->push_back('?'); // -> Operator + delete s; + ``` + - C++ übergibt alles als Kopie + ```cpp + void set(std::string s) { s = "foo"; } + int main() { + std::string s = "bar"; + set(s); + std::cout << s; // gibt bar aus + return 0; + } + ``` + - Zeiger können verwendet werden, um schreibend zuzugreifen + ```cpp + void set(std::string* s) { *s = "foo"; } + int main() { + std::string s = "bar"; + set(&s); + std::cout << s; // gibt foo aus + return 0; + } + ``` + - Zeiger erlauben syntaktisch sehr viele Dinge mit unvorhersehbaren Nebenwirkungen + ```cpp + std::string* magicStr() { + std::string s("wiz!"); + return &s; // gibt Speicher auf Stack weiter; Tun Sie das nie! + } + int main() { + std::string* s = magicStr(); + std::cout << *s; // Stack ist bereits überschrieben! + return 0; + } + ``` + +Warum wirken sich Speicherfehler so unvorhersehbar aus? +- Speicherfehler entstehen sehr häufig durch Zugriff auf Speicherbereiche nachdem diese freigegeben worden sind +- Ob hierdurch später ein Fehler auftritt, hängt davon ab wie der freigegebene Speicher nach der Freigabe wieder genutzt wird +- Die insgesamte Speichernutzung wird durch die Gesamtheit aller Speicherallokationen und -freigaben beeinflusst +- Das kann dazu führen, dass ein Speicherfehler in Modul X erst lange nach seinem Entstehen Auswirkungen zeigt, nachdem in einem anderen Modul Y eine Änderung eingeführt wurde +- Auch eingebundene dynamische Bibliotheken haben Einfluss +- Das macht es so schwierig, solche Fehler schwierig zu finden + +### Bessere Alternative: Referenzen +- Zeigen ebenfalls auf Speicher, Compiler stellt aber sicher, dass Speicher gültig ist (wenn man nicht in Zeiger wandelt etc.)! +- Markiert durch Suffix & +- Beispiel: + ```cpp + void set(std::string& s) { s = "foo"; } + int main() { + std::string s = "bar"; + set(s); + std::cout << s; // gibt foo aus + return 0; + } + ``` +- Dereferenzierung durch * und -> nicht notwendig +- Referenzen sind toll, haben aber eine Einschränkung: + ```cpp + std::string& magicStr() { + std::string s("wiz!"); + return s; //< FEHLER + } + ``` + ```cpp + std::string& magicStr() { + static std::string s("wiz!"); + return s; // klappt prima + } + ``` +- Per Referenz übergebene Rückgabewerte müssen im Speicher noch existieren, wenn Methodenaufruf abgeschlossen ist... + - OK für globale Variablen, Member-Variablen, statische Variablen... + - Nicht-OK für Speicher der wirklich dynamisch alloziert werden muss +- Allgemein bleiben nur Zeiger und Heap: + ```cpp + std::string* magicStr() { + std::string* s = new std::string("wiz!"); + return s; // klappt prima, aber: aufpassen wann s gelöscht + // werden kann und vollständig vergessen wurde! + } + ``` + +- Konvertierung von Zeigern zu Referenzen mit „*“-Operator: + ```cpp + std::string& s = *magicStr(); // Konvertieren in Referenz; Delete nicht mehr möglich + std::string s2 = *magicStr(); // Konvertieren in Referenz & Kopie! Delete nicht direkt möglich + ``` +- Konvertierung von Referenzen zu Zeigern mit „&“-Operator: + ```cpp + std::string s("bla"); + std::string* sStar = &s; // Konvertieren in Zeiger + ``` + +- Abschließende Bemerkungen zum Speicher + - Niemals Speicher doppelt löschen – Niemals Löschen vergessen! + - Häufige Praxis: Zeiger auf NULL setzen nach dem Löschen (Aber: gibt es danach wirklich keinen anderen Zeiger mehr?) + - Nur Speicher löschen, der mit „new“ allokiert wurde + - Speicher der mit „new“ allokiert wurde in jedem möglichen Programmablauf löschen (selbst wenn Exceptions auftreten)... + - Nie über Feldgrenzen hinweg lesen/schreiben (auch negative Indizes!) + - Programme ausgiebig testen (dabei Address Sanitizer aktivieren!) + - Statische Code Analyse nutzen: z.B. http://cppcheck.sourceforge.net + - malloc/free sind Äquivalente in Sprache C und nicht typsicher! + +- Verbreitetes Vorgehen in C++ (Pattern): Resource Acquisition Is Initialization (RAII) + - Speicher (oder Ressourcen im Allgemeinen) wird nur im Konstruktor einer Klasse reserviert + - Destruktor gibt Speicher frei + - Sicheres (Exceptions!), nachvollziehbares Konstrukt + - Beispiel: (Funktioniert leider noch nicht immer) + ```cpp + class MagicString { + std::string* s; + public: + MagicString() : s(new std::string("wiz!")) {} + std::string* magicStr() { return s; } + ~MagicString() { delete s; } + }; + ``` + +## Vererbung +- Vermeiden von Mehrfachimplementierungen +- Vermeiden von Dopplung interner Daten +- Vererbung syntaktisch ebenfalls ähnlich zu Java: + ```java + class Foo { + public: + int magic() const { return 23; } + int enchanting() const { return 0xbeef; } + }; + class FooBar : public Foo { + public: + int magic() const { return 42; } + }; + ``` +- Unterschied zu Java: Methoden „liegen“ bei C++ statisch im Speicher + - D.h. f.magic(); ruft statisch magic-Methode in Klasse Foo auf, weil f eine Referenz vom Typ Foo ist + - Vermeidet Mehrfachimplementierungen, realisiert aber keine einheitliche Schnittstelle! +- Nach Überschreiben einer Methode wollen wir meist, dass genutzte Methode nicht vom Referenztyp abhängt, sondern vom Objekttyp + - Idee zu jedem Objekt speichern wir Zeiger auf zu nutzende Methoden + - Tabelle wird *vtable* bezeichnet + - Markierung von Methoden, für die ein Zeiger vorgehalten wird, mit Schlüsselwort virtual + - Funktionierendes Beispiel: + ```cpp + class Foo { + public: + virtual int magic() const { return 23; } + }; + class FooBar : public Foo { + public: + int magic() const override { return 42; } + }; + int r(const Foo& f) { return f.magic(); } + int main() { + return r(FooBar()); // yeah gibt 42 zurück! + } + ``` + - virtual-Markierung genügt in Oberklasse, alle abgeleiteten Methoden ebenfalls „virtuell“ + - override-Markierung optional, aber hätte vor fehlendem virtual gewarnt! + +## Mehrfachvererbung +- C++ unterstützt keine Interfaces +- Aber C++ unterstützt Mehrfachvererbung! Pro Interface eine Basisklasse -> mit abstrakten Methoden erstellen +- Gute Praxis: Explizites Überschreiben + ```cpp + class NiceFooBar : public Foo, public Bar { + // erlaube NiceFooBar().magic() + int magic() const override { return Bar::magic(); } + }; + ``` + - Wegen Mehrfachvererbung: kein super:: + - Stattdessen immer NameDerBasisKlasse:: +- Aber: Diamond Problem + - Markieren der Ableitung als virtual behebt das Problem + +Komposition statt Vererbung +- Vererbungshierarchien werden trotzdem häufig als zu unflexibel angesehen +- Ein möglicher Ausweg: + - Klassen flexiblen aus anderen Objekten zusammensetzen + - Einzelobjekte modellieren Aspekte des Verhaltens des Gesamtobjekts + - Werden beim Anlegen des Gesamtobjekts übergeben +- Engl.: Prefer composition over inheritance +```cpp +class Automatisierungsmodul { + public: + void steuere() = 0; +}; +class Roboter : public Automatisierungsmodul{ + public: + void steuere() { /* call HAL */ } +}; +class DumbDevice : public Automatisierungsmodul { + public: + void steuere() { /* do nothing */ } +}; +class Geraet { + protected: + Automatisierungsmodul* _a; + Geraet(Automatisierungsmodul* a, Saeuberungsmodul* s): _a(a), _s(s) {} + public: + void steuere() { _a->steuere(); } +}; +``` + +## Operator Overloading +- In Java: Unterschied zwischen "==" und "equals()" bei String-Vergleich +- In C++: "=="-Operator für String-Vergleich +- Umsetzung: Hinzufügen einer Methode mit Namen *operatorx* wobei für x unter anderem zulässig: $+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= <=> && || ++ -- , ->* -> () []$ +- Vereinfacht Nutzung komplexer Datentypen teilweise sehr stark +- Aber: Erfordert Disziplin beim Schreiben von Code + - Oft erwartet: Freiheit von Exceptions (Wer gibt Speicher frei, wenn eine Zuweisung fehlgeschlagen ist?) + - Semantik der Operatoren muss selbsterklärend sein + - Ist der Operator auf einem multiplikativen Ring + oder * ? + - Was ist, wenn zwei ungleiche Objekte jeweils kleiner als das andere sind? + - Ist * bei Vektoren das Skalar- oder das Kreuzprodukt (oder etwas ganz anderes)? + +## Templates +- Generische Datentypen werden in C++ mit Templates realsiert +- Häufig ähnlich eingesetzt wie Generics, aber können neben Typen auch Konstanten enthalten +- Zur Compile-Zeit aufgelöst ➞ Deklaration & Implementierung in Header-Dateien +- Einfaches Beispiel (mit Typen, ähnl. zu Generics, primitive Typen ok!): + ```cpp + template // typename keyword -> deklariert T als Typ + T max(T a, T b) { + return (a > b ? a : b); + } + ``` + ```cpp + int i = 10; + int j = 2; + int k = max(j, i); // explizit + int l = max(j, i); // automat. Typinferenz durch Parametertypen + ``` +- Ein wichtiges Grundkonzept von Templates: Substitution failure is not an error (SFINAE) es -> wird solange nach passenden Templates (in lexikogr. Reihenfolge) gesucht bis Parameter passen (sonst Fehler!) +- Sehr häufig verwendetes Konstrukt & mächtiger als es scheint, aber schwer zu beherrschen + - Wir können alternativ versuchen, durch SFINAE zu verhindern, dass Funktionen doppelt definiert sind + - Trick: Einführen eines Pseudoparameters, der nicht benutzt wird + ```cpp + template + T quadrieren(T i, typename T::Val pseudoParam = 0) { + T b(i); b *= i; return b; + } + ``` + - Trick: Einführen eines Hilfstemplates (sogenannter trait): wenn arithmetic::Cond definiert ist, muss T = int sein + ```cpp + template struct arithmetic {}; + template<> struct arithmetic { using Cond = void*; }; + ``` + - Definition einer Funktion, die nur für int instanziiert werden kann: + ```cpp + template + T quadrieren(T i, typename arithmetic::Cond = nullptr) { + return i * i; + } + ``` + +## Container +- Templates werden an vielen Stellen der C++ Standard-Bibliothek verwendet +- Container implementieren alle gängigen Datenstrukturen +- Prominente Beispiele: + ```cpp + template class vector; // dynamisches Array + template class list; // doppelt verkette Liste + template class set; // geordnete Menge basiert auf Baum + template class map; // Assoziatives Array, geordnet + // wie oben aber basierend auf Hash-Datenstruktur + template class unordered_set; + template class unordered_map; + ``` + - Alle Templates sind stark vereinfacht dargestellt, weitere Parameter haben Standardwerte, die z.B. Speicherverhalten regeln + +### Container Enumerieren +- Je nach Struktur unterschiedlicher Zugriff +- Oft über Iteratoren vom Typ Container::iterator, bspw. vector::iterator + ```cpp + std::vector v{ 1, 2, 3 }; // Initialisierung über Liste + // “normale” for-Schleife, Beachte: Überladene Operatoren ++ und * + for(std::vector::iterator i = v.begin(); i != v.end(); ++i) { + std::cout << *i << std::endl; + } + // auto erlaubt Typinferenz → Code lesbarer, aber fehleranfälliger + for(auto i = v.begin(); i != v.end(); ++i) { + std::cout << *i << std::endl; + } + // range loop (nutzt intern Iteratoren), komplexe Datentypen nur mit Ref. “&” sonst werden Kopie erzeugt! + for(int i : v) { // hier ohne “&”, da nur int in v gespeichert + std::cout << i << std::endl; + } + ``` + +### Container Einfügen +- Unterschiedliche Operationen je nach Container-Typ +- std::vector::push_back() fügt neues Element am Ende ein + - Allokiert ggf. neuen Speicher + - Exisitierende Pointer können dadurch invalidiert werden!!! +- std::list zusätzlich push_front() fügt Element am Anfang ein +- std::set, std::map, … + - insert() fügt Element ein, falls es nicht existiert (Optional mit Hinweis wo ungefähr eingefügt werden soll) + - operator[] erlaubt Zugriff aber auch Überschreiben alter Elemente + - emplace() Einfügen, ohne Kopien zu erzeugen (nicht behandelt) + +### Container Löschen +- Unterschiedliche Operationen je nach Container-Typ +- Allgemein: erase(Container::iterator) (Vorsicht ggf. werden Iterator/Zeiger auf Objekte dadurch ungültig!) +- std::vector::resize() löscht implizit letzte Elemente bei Verkleinerung +- std::vector::pop_back()entfernt letztes Element +- std::list hat zusätzlich pop_front() +- std::set, std::map, … löschen nur mit erase() + + +## Shared Pointer +- Synonym: Smart Pointer +- Ziel: Sichereres Verwenden von Speicher +- Idee: kleine, schlanke Zeiger-Objekte, die Referenzzähler + Zeiger auf komplexere Objekte enthalten, wird letztes Zeiger-Objekt gelöscht, wird auch das komplexe Objekt gelöscht +- Realisierung mit RAII, Templates, Operator-Überladung +- Beispiel, wie shared_ptr sich verhalten sollten + ```cpp + using stringP = shared_ptr; + stringP hello() { // gibt kopie der referenz zurück + return stringP(new std::string("Hello!")); + } + + int main() { + stringP x = hello(); + stringP y(x); // Erstellen einer weiteren Referenz + std::cout << y->length(); + return 0; // Original-String wird gelöscht wenn letzte Ref. weg + } + + template class shared_ptr { // Vereinfacht! + T* p; // Zeiger auf eigentliches Objekt + int* r; // Referenzzähler + public: + // neue Referenz auf Objekt erzeugen + shared_ptr(T* t) : p(t), r(new int) { *r = 1; } + // Referenz durch andere Referenz erzeugen + shared_ptr(const shared_ptr& sp) : p(sp.p), r(sp.r) { ++(*r); } + T* operator->() const { // benutzen wie einen richtigen Zeiger + return p; + } + ~shared_ptr() { + if(--(*r) == 0) { // Objekt loeschen, wenn letzte Referenz weg + delete r; + delete p; + } + } + }; // TODO operator= implementieren! + ``` + +# Einführung in Funktionale Programmierung +## Applikaive Algorithmen +Grundidee: +- Definition zusammengesetzter Funktionen durch Terme: $f(x) = 5x + 1$ +- Unbestimmte: + - x, y, z, . . . vom Typ int + - q, p, r , . . . vom Typ bool +- Terme mit Unbestimmten (z.B. Terme vom Typ int: $x, x - 2, 2x + 1, (x + 1)(y - 1)$) +- Terme vom Typ bool $p, p Λ true, (p V true) ⇒ (q V false)$ + +> Sind $v_1, ..., v_n$ Unbestimmte vom Typ $\tau_1,...,\tau_n$ (bool oder int) und ist $t(v_1, ..., v_n)$ ein Term, so heißt $f(v_1, ..., v_n) = t(v_1, ..., v_n)$ eine Funktionsdefinition vom Typ $\tau$ . $\tau$ ist dabei der Typ des Terms. + +- Erweiterung der Definition von Termen +- Neu: Aufrufe definierter Funktionen sind Terme + +> Ein applikativer Algorithmus ist eine Menge von Funktionsdefinitionen. Die erste Funktion $f_1$ wird wie beschrieben ausgewertet und ist die Bedeutung (Semantik) des Algorithmus. + +- Kategorisierung nach unterschiedlichen Kriterien +- Ordnung der Sprache + - Erster Ordnung: + - Funktionen können (nur) definiert und aufgerufen werden + - Höherer Ordnung: + - Funktionen können außerdem als Parameter an Funktionen übergeben werden und/oder Ergebnisse von Funktionen sein. + - Funktionen sind hier auch Werte! -- erstklassige Werte; + - Erstklassig: Es gibt keine Einschränkungen. + - Umgekehrt: Wert ist eine Funktion ohne Parameter +- Auswertungsstrategie: + - Strikte Auswertung: + - Synonyme: strict evaluation, eager evaluation, call by value, applikative Reduktion + - Die Argumente einer Funktion werden vor Eintritt in die Funktion berechnet (ausgewertet) – wie z.B. in Pascal oder C. + - Bedarfsauswertung: + - Synonyme: Lazy evaluation, call by need + - Funktionsargumente werden unausgewertet an die Funktion übergeben + - Erst wenn die Funktion (in ihrem Körper) die Argumente benötigt, werden die eingesetzten Argumentausdrücke berechnet, und dann nur einmal. + - Realisiert „Sharing“ (im Unterschied zur Normalform-Reduktion – dort werden gleiche Ausdrücke immer wieder erneut berechnet). +- Typisierung: + - Stark typisiert: Die verbreiteten funktionalen Programmiersprachen sind stark typisiert, d.h. alle Typfehler werden erkannt. + - Statisch typisiert: Typprüfung wird zur Übersetzungszeit ausgeführt. + - Dynamisch typisiert: Typprüfung wird zur Laufzeit ausgeführt + - Untypisiert: Reiner Lambda-Kalkül (später) + +## Die funktionale Programmiersprache Erlang +- Entwickelt ab der zweiten Hälfte der 1980er Jahre im Ericsson Computer Science Laboratory (CSLab, Schweden) +- Ziel war, eine einfache, effiziente und nicht zu umfangreiche Sprache, die sich gut zur Programmierung robuster, großer und nebenläufiger Anwendungen für den industriellen Einsatz eignet. +- Erste Version einer Erlang-Umgebung entstand 1987 auf der Grundlage von Prolog. Später wurden Bytecode-Übersetzer und abstrakte Maschinen geschaffen. + +### Arbeiten mit Erlang +- Erlang-Programme werden durch Definition der entsprechenden Funktionen in Modulen erstellt +- Module können in den Erlang-Interpreter geladen und von diesem in Zwischencode übersetzt werden +- Anschließend können Anfragen im Interpreter gestellt werden + +Modul "fakultaet.erl": +```erlang + -module(fakultaet). + -export([fak/1]). + fak(0) -> 1; + fak(N) when N > 0 -> (N) * fak(N-1). +``` +Laden in Interpreter mittels: ```c(fakultaet)``` +Testen der Funktion, z.B. mit: ```fakultaet:fak(5)``` + +### Elemente von Erlang +- Ganzzahlen (Integer): + - 10 + - -234 + - 16#AB10F + - 2#110111010 + - $A + - B#Val erlaubt Zahlendarstellung mit Basis B (mit B ≤ 36). + - $Char ermöglicht Angabe von Ascii-Zeichen ($A für 65). +- Gleitkommazahlen (Floats): + - 17.368 + - -56.654 + - 12.34E-10. +- Atome (Atoms): + - abcef + - start_with_a_lower_case_letter + - 'Blanks can be quoted' + - 'Anything inside quotes \n\012' + - Erläuterungen: + - Atome sind Konstanten, die Ihren eigenen Namen als Wert haben + - Atome beliebiger Länge sind zulässig + - Jedes Zeichen ist innerhalb eines Atoms erlaubt + - Einige Atome sind reservierte Schlüsselwörter und können nur in der von den Sprachentwicklern gewünschen Weise verwendet werden als Funktionsbezeichner, Operatoren, Ausdrücke etc. + - Reserviert sind: *after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor* +- Tupel (Tuples): + - {123, bcd} % Ein Tupel aus Ganzzahl und Atom + - {123, def, abc} + - {person, 'Joe', 'Armstrong'} + - {abc, {def, 123}, jkl} + - {} + - Erläuterungen: + - Können eine feste Anzahl von “Dingen” speichern + - Tupel beliebiger Größe sind zulässig + - Kommentare werden in Erlang mit % eingeleitet und erstrecken sich dann bis zum Zeilenende +- Listen: + - [123, xyz] + - [123, def, abc] + - [{person, 'Joe', 'Armstrong'}, {person, 'Robert', 'Virding'}, {person, 'Mike', 'Williams'}] + - "abcdefgh" wird zu [97,98,99,100,101,102,103,104] + - "" wird zu [] + - Erläuterungen: + - Listen können eine variable Anzahl von Dingen speichern + - Die Größe von Listen wird dynamisch bestimmt + - "..." ist eine Kurzform für die Liste der Ganzzahlen, die die ASCIICodes der Zeichen innerhalb der Anführungszeichen repräsentieren +- Variablen: + - Abc + - A_long_variable_name + - AnObjectOrientatedVariableName + - Erläuterungen: + - Fangen grundsätzlich mit einem Großbuchstaben an + - Keine „Funny Characters" + - Variablen werden zu Speicherung von Werten von Datenstrukturen verwendet + - Variablen können nur einmal gebunden werden! + - Der Wert einer Variablen kann also nicht mehr verändert werden, nachdem er einmal gesetzt wurde: *N = N + 1 VERBOTEN!* + - Einzige Ausnahmen: Die anonyme Variable "_" (kein Lesen möglich) und das Löschen einer Variable im Interpreter mit f(N). +- Komplexe Datenstrukturen: + - [{{person,'Joe', 'Armstrong'}, {telephoneNumber, [3,5,9,7]}, {shoeSize, 42}, {pets, [{cat, tubby},{cat, tiger}]}, {children,[{thomas, 5},{claire,1}]}}, {{person,'Mike','Williams'}, {shoeSize,41}, {likes,[boats, beer]}, ... }] + - Erläuterungen: + - Beliebig komplexe Strukturen können erzeugt werden + - Datenstrukturen können durch einfaches Hinschreiben erzeugt werden (keine explizite Speicherbelegung oder -freigabe) + - Datenstrukturen können gebundene Variablen enthalten +- Pattern Matching: + - $A = 10$ erfolgreich, bindet A zu 10 + - ${B, C, D} = {10, foo, bar}$ erfolgreich, bindet B zu 10, C zu foo and D zu bar + - ${A, A, B} = {abc, abc, foo}$ erfolgreich, bindet A zu abc, B zu foo + - ${A, A, B} = {abc, def, 123}$ schlägt fehl (“fails”) + - $[A,B,C] = [1,2,3]$ erfolgreich, bindet A zu 1, B zu 2, C zu 3 + - $[A,B,C,D] = [1,2,3]$ schlägt fehl + - $[A,B|C] = [1,2,3,4,5,6,7]$ erfolgreich bindet A zu 1, B zu 2, C zu [3,4,5,6,7] + - $[H|T] = [1,2,3,4]$ erfolgreich, bindet H zu 1, T zu [2,3,4] + - $[H|T] = [abc]$ erfolgreich, bindet H zu abc, T zu [] + - $[H|T] = []$ schlägt fehl + - ${A,_, [B|_],{B}} = {abc,23,[22,x],{22}}$ erfolgreich, bindet A zu abc, B zu 22 + - Erläuterungen: + - „Pattern Matching“, zu Deutsch „Mustervergleich“, spielt eine zentrale Rolle bei der Auswahl der „richtigen“ Anweisungsfolge für einen konkreten Funktionsaufruf und dem Binden der Variablen für die Funktionsparameter (siehe spätere Erklärungen) + - Beachte die Verwendung von "_", der anonymen (“don't care”) Variable (diese Variable kann beliebig oft gebunden, jedoch nie ausgelesen werden, da ihr Inhalt keine Rolle spielt). + - Im letzten Beispiel wird die Variable B nur einmal an den Wert 22 gebunden (das klappt, da der letzte Wert genau {22} ist) +- Funktionsaufrufe: + - module:func(Arg1, Arg2, ... Argn) + - func(Arg1, Arg2, .. Argn) + - Erläuterungen: + - Arg1 .. Argn sind beliebige Erlang-Datenstrukturen + - Die Funktion und die Modulnamen müssen Atome sein (im obigen Beispiel module und func) + - Eine Funktion darf auch ohne Parameter (Argumente) sein (z.B. date() – gibt das aktuelle Datum zurück) + - Funktionen werden innerhalb von Modulen definiert + - Funktionen müssen exportiert werden, bevor sie außerhalb des Moduls, in dem sie definiert sind, verwendet werden + - Innerhalb ihres Moduls können Funktionen ohne den vorangestellten Modulnamen aufgerufen werden (sonst nur nach einer vorherigen Import-Anweisung) +- Modul-Deklaration: + ```erlang + -module(demo). + -export([double/1]). + double(X) -> times(X, 2). + times(X, N) -> X * N. + ``` + - Erläuterungen: + - Die Funktion double kann auch außerhalb des Moduls verwendet werden, times ist nur lokal in dem Modul verwendbar + - Die Bezeichnung double/1 deklariert die Funktion double mit einem Argument + - Beachte: double/1 und double/2 bezeichnen zwei unterschiedliche Funktionen +- Eingebaute Funktionen (Built In Functions, BIFs) + - date() + - time() + - length([1,2,3,4,5]) + - size({a,b,c}) + - atom_to_list(an_atom) + - list_to_tuple([1,2,3,4]) + - integer_to_list(2234) + - tuple_to_list({}) + - Erläuterungen: + - Eingebaute Funktionen sind im Modul erlang deklariert + - Für Aufgaben, die mit normalen Funktionen nicht oder nur sehr schwierig in Erlang realisiert werden können + - Verändern das Verhalten des Systems + - Beschrieben im Erlang BIFs Handbuch +- Definition von Funktionen: + ```erlang + func(Pattern1, Pattern2, ...) -> + ... ; % Vor dem ; steht der Rumpf + func(Pattern1, Pattern2, ...) -> + ... ; % Das ; kündigt weitere Alternativen an + ... % Beliebig viele Alternativen möglich + func(Pattern1, Pattern2, ...) -> + ... . % Am Ende muss ein Punkt stehen! + ``` + - Erläuterungen: + - Funktionen werden als Sequenz von Klauseln definiert + - Sequentielles Testen der Klauseln bis das erste Muster erkannt wird (Pattern Matching) + - Das Pattern Matching bindet alle Variablen im Kopf der Klausel + - Variablen sind lokal zu jeder Klausel (automatische Speicherverw.) + - Der entsprechende Anweisungsrumpf wird sequentiell ausgeführt + +Was passiert wenn wir mathstuff:factorial() mit einem negativen Argument aufrufen? Der Interpreter reagiert nicht mehr? +- Erste Reaktion: rette das Laufzeitsystem durch Eingabe von CTRL-G + - User switch command + 01. --> h + 02. c [nn] - connect to job + 03. i [nn] - interrupt job + 04. k [nn] - kill job + 05. j - list all jobs + 06. s [shell] - start local shell + 07. r [node [shell]] - start remote shell + 08. q - quit erlang + 09. ? | h - this message + 10. --> + - Liste durch Eingabe von j alle Jobnummern auf + - Beende den entsprechenden Shell-Job durch k + - Starte eine neue Shell durch Eingabe von s + - Liste durch erneute Eingabe von j die neuen Jobnummern auf + - Verbinde durch Eingabe von c mit neuer Shell +- Zweite Reaktion: Ergänze factorial() um zusätzliche Bedingung: + - „Beschütze“ die Funktion vor Endlosrekursion durch Ergänzung eines sogenannten Wächters (Guards) bei dem entsprechenden Fallmuster (Pattern) + - Erläuterungen: + - Der Guard wird durch das Atom when und eine Bedingung vor dem Pfeil -> formuliert + - Vollständig „beschützte“ Klauseln können in beliebiger Reihenfolge angeordnet werden + - Achtung: Ohne Guard führt diese Reihenfolge zu Endlosschleifen + - Beispiele für Guards: + - number(X) % X is a number + - integer(X) % X is an integer + - float(X) % X is a float + - atom(X) % X is an atom + - tuple(X) % X is a tuple + - list(X) % X is a list + - length(X) == 3 % X is a list of length 3 + - size(X) == 2 % X is a tuple of size 2. + - X > Y + Z % X is > Y + Z + - X == Y % X is equal to Y + - X =:= Y % X is exactly equal to Y (i.e. 1 == 1.0 succeeds but 1 =:= 1.0 fails) + - Alle Variablen in einem Wächter müssen zuvor gebunden werden + +- Traversieren (“Ablaufen”) von Listen: + ``` + average(X) -> sum(X) / len(X). + sum([H|T]) -> H + sum(T); % summiert alle Werte auf + sum([]) -> 0. + len([_|T]) -> 1 + len(T); % Wert des Elements + len([]) -> 0. % interessiert nicht + ``` + - Die Funktionen sum und len verwenden das gleiche Rekursionsmuster + - Zwei weitere gebräuchliche Rekursionsmuster: + ``` + double([H|T]) -> [2*H|double(T)]; % verdoppelt alle + double([]) -> []. % Listenelemente + + member(H, [H|_]) -> true; % prüft auf + member(H, [_|T]) -> member(H, T); % Enthaltensein + member(_, []) -> false. % in Liste + ``` +- Listen und Akkumulatoren: + ``` + average(X) -> average(X, 0, 0). + average([H|T], Length, Sum) -> average(T, Length + 1, Sum + H); + average([], Length, Sum) -> Sum / Length. + ``` + - Interessant sind an diesem Beispiel: + - Die Liste wird nur einmal traversiert + - Der Speicheraufwand bei der Ausführung ist konstant, da die Funktion “endrekursiv” ist (nach Rekursion steht Ergebnis fest) + - Die Variablen Length und Sum spielen die Rolle von Akkumulatoren + - Bemerkung: average([]) ist nicht definiert, da man nicht den Durchschnitt von 0 Werten berechnen kann (führt zu Laufzeitfehler) +- „Identisch“ benannte Funktionen mit unterschiedlicher Parameterzahl: + ``` + sum(L) -> sum(L, 0). + sum([], N) -> N; + sum([H|T], N) -> sum(T, H+N). + ``` + - Erläuterungen: + - Die Funktion sum/1 summiert die Elemente einer als Parameter übergebenen Liste + - Sie verwendet eine Hilfsfunktion, die mit sum/2 benannt ist + - Die Hilfsfunktion hätte auch irgendeinen anderen Namen haben können + - Für Erlang sind sum/1 und sum/2 tatsächlich unterschiedliche Funktionsnamen +- Shell-Kommandos: + - h() - history . Print the last 20 commands. + - b() - bindings. See all variable bindings. + - f() - forget. Forget all variable bindings. + - f(Var) - forget. Forget the binding of variable X. This can ONLY be used as a command to the shell - NOT in the body of a function! + - e(n) - evaluate. Evaluate the n:th command in history. + - e(-1) Evaluate the previous command. + - Erläuterungen: Die Kommandozeile kann wie mit dem Editor Emacs editiert werden (werl.exe unterstützt zusätzlich Historie mit Cursortasten) +- Spezielle Funktionen: + ``` + apply(Func, Args) + apply(Mod, Func, Args) % old style, deprecated + ``` + - Erläuterungen: + - Wendet die Funktion Func (im Modul Mod bei der zweiten Variante) auf die Argumente an, die in der Liste Args enthalten sind + - Mod und Func müssen Atome sein bzw. Ausdrücke, die zu Atomen evaluiert werden und die eine Funktion bzw. Modul referenzieren + - Jeder Erlang-Ausdruck kann für die Formulierung der an die Funktion zu übergebenden Argumente verwendet werden + - Die Stelligkeit der Funktion ist gleich der Länge der Argumentliste + - Beispiel: ```` 1> apply( lists1,min_max,[[4,1,7,3,9,10]]).``` -> {1, 10} + - Bemerkung: Die Funktion min_max erhält hier ein (!) Argument +- Anonyme Funktionen: + ``` + Double = fun(X) -> 2*X end. + > Double(4). + > 8 + ``` + - Erläuterung: + - Mittels “fun” können anonyme Funktionen deklariert werden + - Diese können auch einer Variablen (im obigen Beispiel Double) zugewiesen werden + - Interessant wird diese Art der Funktionsdefinition, da anonyme Funktionen auch als Parameter übergeben bzw. als Ergebniswert zurückgegeben werden können + - Die Funktionen, die anonyme Funktionen als Parameter akzeptieren bzw. als Ergebnis zurückgeben nennt man Funktionen höherer Ordnung + +Kap 3a seite 48-84 + +## Lambda Kalkül +[comment]: <> (Kapitel 3b) + +# Multithreading & Parallele Programmierung +[comment]: <> (Kapitel 4) +## Grundlagen + +## Parallele Programmierung in Erlang + +## Parallele Programmierung in C++ +### Threads +Thread („Faden“) := leichtgewichtige Ausführungseinheit oder Kontrollfluss (Folge von Anweisungen) innerhalb eines sich in Ausführung befindlichen Programms +- Threads teilen sich den Adressraum des ihres Prozesses +- in C++: Instanzen der Klasse std::thread +- führen eine (initiale) Funktion aus + +```cpp +#include +#include + +void say_hello() { + std::cout << "Hello Concurrent C++\n"; +} + +int main() { + std::thread t(say_hello); + t.join(); +} +``` +Alternative Erzeugung von Threads über Lamda Ausdruck: +```cpp +std::thread t([]() { do_something(); }); +``` +oder mit Instanz einer Klasse - erfordert Überladen von operator() +```cpp +struct my_task { + void operator()() const { do_something(); } +}; + +my_task tsk; +std::thread t1(tsk); // mit Objekt +std::thread t2{ my_task() }; // über Konstruktor +``` + +Parameter-Übergabe bei Thread-Erzeugung über zusätzliche Argumente des thread-Konstruktors. Vorsicht bei Übergabe von Referenzen, wenn +Eltern-Thread vor dem erzeugten Thread beendet wird. +```cpp +void fun(int n, const std::string& s) { + for (auto i = 0; i < n; i++) + std::cout << s << " "; + std::cout << std::endl; +} +std::thread t(fun, 2, "Hello"); +t.join(); +``` + +Warten auf Threads +- t.join() wartet auf Beendigung des Threads t +- blockiert aktuellen Thread +- ohne join() keine Garantie, dass t zur Ausführung kommt +- Freigabe der Ressourcen des Threads +```cpp +std::thread t([]() { do_something(); }); +t.join(); +``` + +Hintergrund Threads +- Threads können auch im Hintergrund laufen, ohne dass auf Ende gewartet werden muss +- „abkoppeln“ durch detach() +- Thread läuft danach unter Kontrolle des C++-Laufzeitsystems, join nicht mehr möglich + +Thread-Identifikation +- Thread-Identifikator vom Typ `std::thread::id` +- Ermittlung über Methode get_id() +```cpp +void fun() { + std::cout << "Hello from " + << std::this_thread::get_id() + << std::endl; +} +std::thread t(fun); +t.join(); +``` + + +### Datenparallele Verarbeitung +### Kommunikation zwischen Threads +### Taskparallelität ... \ No newline at end of file diff --git a/README.md b/README.md index bf72609..e66741a 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,39 @@ -# Informatik -Unterlagen zu Informatik Vorlesungen der TU Ilmenau -> Kein Mensch kann Wissen besitzen. Wissen ist frei und muss weitergegeben werden - -bisher: -- [Algorithmen und Datenstrukturen](Algorithmen%20und%20Datenstrukturen.md) -- [Einführung in die Medizinische Informatik](Einführung%20in%20die%20Medizinische%20Informatik.md) -- [Grundlagen und diskrete Strukturen](Grundlagen%20und%20Diskrete%20Strukturen.md) - - [GudS - Cheatsheet](Grundlagen%20und%20Diskrete%20Strukturen%20-%20Cheatsheet.pdf) - - [GudS - Short Paper](Grundlagen%20und%20Diskrete%20Strukturen%20-%20short.pdf) -- [Neurobiologische Informationsverarbeitung](Neurobiologische%20Informationsverarbeitung.md) -- [Neuroinformatik](Neuroinformatik.md) -- [Programmierparadigmen](Programmierparadigmen.md) -- [Rechnerarchitekturen 1](Rechnerarchitekturen%201.md) -- [Telematik 1](Telematik%201.md) - - [Telematik Cheatsheet](Telematik1-cheatsheet.pdf) - -Keine Garantie auf Vollständigkeit/Korrektheit! Hilf uns Fehler zu korrigieren und noch weitere Fächer abzudecken. - -## Verwendung -Alle Dokumente werden in Markdown (bevorzugt) oder LaTex geschrieben. Bilder etc erhalten einen eigenen Ordner "Assets". Bei Fragen zu Markdown könnt ihr Google fragen, Cheatsheets lesen (da steht meistens alles drauf) oder im Notfall den Admin fragen. -Dieses Repo ist zum Selbststudium und erlernen neuen Wissens gedacht. Kein Inhalt oder Teile dieses Repositories darf kommerziell verwendet werden. Es steht frei zu Teilen, Klonen und Mitzuarbeiten. -Wir freuen uns über jeden der mitmacht. - -## Mitmachen -- Erstelle ein 'issue'. Gehe davor die offene 'issues' durch. (Oder überlege dir welches Fach noch fehlt) -- Klone das repository oder erstelle einen Fork: ```git clone https://github.com/wieerwill/Informatik.git``` -- Erstelle deinen eigenen feature branch: ```git checkout -b my-new-feature``` -- Stelle deine Änderungen bereit: ```git commit -m "Add some feature"``` (in "" kommt dein Kommentar) -- Lade auf deinen Branch hoch: ```git push origin your-new-feature``` -- Erstelle ein 'pull request' damit deine Änderungen in diesem Repository übernommen werden. - -## Bild- und Textrechte -Der Inhalt aller Dokumente hier ist die Mitschrift aus besuchten Vorlesungen. Es werden keine Bücher kopiert oder anderweitig Copyright verletzt. Die Verletzung des Copyright oder anderer Rechte Dritte wird mit einem Ausschluss aus dem Repository gehandelt. Sollte Ihnen ein Verstoß auffallen geben Sie uns bitte umgehend bescheid, wir werden jedem Fall nachgehen. -Bilder werden zum Großteil von uns selbst erstellt oder unter ausführlicher Quellangabe verwendet. - -## Lizenz -Dieses Repository und sein Inhalt sind unter der GNU GENERAL PUBLIC LICENSE Version 3 veröffentlicht. Was das bedeutet könnt ihr [hier](LICENSE) nachlesen. +# Informatik +Unterlagen zu Informatik Vorlesungen der TU Ilmenau +> Kein Mensch kann Wissen besitzen. Wissen ist frei und muss weitergegeben werden + +bisher: +- [Algorithmen und Datenstrukturen](Algorithmen%20und%20Datenstrukturen.md) +- [Einführung in die Medizinische Informatik](Einführung%20in%20die%20Medizinische%20Informatik.md) +- [Grundlagen und diskrete Strukturen](Grundlagen%20und%20Diskrete%20Strukturen.md) + - [GudS - Cheatsheet](Grundlagen%20und%20Diskrete%20Strukturen%20-%20Cheatsheet.pdf) + - [GudS - Short Paper](Grundlagen%20und%20Diskrete%20Strukturen%20-%20short.pdf) +- [Neurobiologische Informationsverarbeitung](Neurobiologische%20Informationsverarbeitung.md) +- [Neuroinformatik](Neuroinformatik.md) +- [Programmierparadigmen](Programmierparadigmen.md) +- [Rechnerarchitekturen 1](Rechnerarchitekturen%201.md) +- [Stochastik](Stochastik.md) +- [Telematik 1](Telematik%201.md) + - [Telematik Cheatsheet](Telematik1-cheatsheet.pdf) + +Keine Garantie auf Vollständigkeit/Korrektheit! Hilf uns Fehler zu korrigieren und noch weitere Fächer abzudecken. + +## Verwendung +Alle Dokumente werden in Markdown (bevorzugt) oder LaTex geschrieben. Bilder etc erhalten einen eigenen Ordner "Assets". Bei Fragen zu Markdown könnt ihr Google fragen, Cheatsheets lesen (da steht meistens alles drauf) oder im Notfall den Admin fragen. +Dieses Repo ist zum Selbststudium und erlernen neuen Wissens gedacht. Kein Inhalt oder Teile dieses Repositories darf kommerziell verwendet werden. Es steht frei zu Teilen, Klonen und Mitzuarbeiten. +Wir freuen uns über jeden der mitmacht. + +## Mitmachen +- Erstelle ein 'issue'. Gehe davor die offene 'issues' durch. (Oder überlege dir welches Fach noch fehlt) +- Klone das repository oder erstelle einen Fork: ```git clone https://github.com/wieerwill/Informatik.git``` +- Erstelle deinen eigenen feature branch: ```git checkout -b my-new-feature``` +- Stelle deine Änderungen bereit: ```git commit -m "Add some feature"``` (in "" kommt dein Kommentar) +- Lade auf deinen Branch hoch: ```git push origin your-new-feature``` +- Erstelle ein 'pull request' damit deine Änderungen in diesem Repository übernommen werden. + +## Bild- und Textrechte +Der Inhalt aller Dokumente hier ist die Mitschrift aus besuchten Vorlesungen. Es werden keine Bücher kopiert oder anderweitig Copyright verletzt. Die Verletzung des Copyright oder anderer Rechte Dritte wird mit einem Ausschluss aus dem Repository gehandelt. Sollte Ihnen ein Verstoß auffallen geben Sie uns bitte umgehend bescheid, wir werden jedem Fall nachgehen. +Bilder werden zum Großteil von uns selbst erstellt oder unter ausführlicher Quellangabe verwendet. + +## Lizenz +Dieses Repository und sein Inhalt sind unter der GNU GENERAL PUBLIC LICENSE Version 3 veröffentlicht. Was das bedeutet könnt ihr [hier](LICENSE) nachlesen. diff --git a/Rechnerarchitekturen 1.md b/Rechnerarchitekturen 1.md index 347d396..74d6251 100644 --- a/Rechnerarchitekturen 1.md +++ b/Rechnerarchitekturen 1.md @@ -1,156 +1,156 @@ -# Grundprinzipien -- Ein- und Ausgabe -- Programmspeicher -- Datenspeicher - -Unterschieden in: -- Harvard Architektur: direkt mit Prozessor verbunden -- Princeton-Architektur (von-Neumann-Architektur): über Systembus verbunden - -## Eigenschaften -Fast alle der heute üblichen Rechner gehen auf folgende Eigenschaften zurück: -1. Die Rechenanlage besteht aus den Funktionseinheiten Speicher, Steuerwerk (engl. controller), dem Rechenwerk (engl. data path) und Ein-/Ausgabe-Einheiten. -2. Die Struktur der Anlage ist unabhängig vom bearbeiteten Problem. Die Anlage ist speicherprogrammierbar. -3. Der Speicher wird in Zellen gleicher Größe geteilt. Die Zellnummern heißen Adressen. -4. Das Programm besteht aus einer Folge von elementaren Befehlen, die in der Reihenfolge der Speicherung bearbeitet werden. -5. Abweichungen von der Reihenfolge sind mit (bedingten oder unbedingten) Sprungbefehlen möglich. -6. Es werden Folgen von Binärzeichen (nachfolgend Bitvektoren genannt) verwendet, um alle Größen darzustellen. -7. Die Bitvektoren erlauben keine explizite Angabe des repräsentierten Typs. Aus dem Kontext heraus muss stets klar sein, wie die Bitvektoren zu interpretieren sind. - -# Befehlssatz -Adressierung ohne Speicherzugriff -- Registeradressierung: ausschließlich Operanden aus & Ziele in Registern -- Unmittelbare Adressierung, Direktoperanden, immediate addressing: Operanden sind Teil des Befehlsworts -- Direkte Adressierung, absolute Adressierung: Adresse ist ausschließlich im Befehlswort enthalten -- Register-indirekte Adressierung: Adresse ist ausschließlich im Register enthalten - - Varianten: pre/post-increment/decrement zur Realisierung von Stapeloperationen -- Relative Adressierung, indizierte Adressierung, Basis-Adressierung: Adresse ergibt sich aus der Addition eines Registerinhalts und einer Konstanten im Befehl - -## n-Adressmaschinen -Klassifikation von Befehlssätzen bzw. Befehlen nach der Anzahl der Adressen bei 2-stelligen Arithmetik-Befehlen -- 3-Adressmaschinen: Operanden und Ziel einer Operation werden explizit angegeben -- 2-Adressmaschinen: Überschreiben eines Operanden mit dem Ergebnis -- 1 1⁄2-Adressmaschinen: wie 2-Adressmaschinen, nur unter Verwendung von Registern -- 1-Adressmaschinen: Nutzung von nur 1 Register -- 0-Adressmaschinen: Kellermaschinen - -## Programmiermodelle, Instruction Set Architectures (ISAs) -Klassifikation von Befehlssätzen nach der Gestaltung/Ausprägung der -vorhandenen Maschinenbefehle -- CISC – Complex Instruction Set Computers - - Relativ kompakte Codierung von Programmen - - Für jeden Befehl wurden mehrere Taktzyklen benötigt. Die Anzahl der Zyklen pro Befehl war groß - - (Mikro-) Programm zur Interpretation der Befehle nötig - - Compiler konnten viele Befehle gar nicht nutzen -- RISC – Reduced Instruction Set Computers - - Wenige, einfache Befehle - - Hohe Ausführungsgeschwindigkeit - - durch kleine Anzahl von Taktzyklen pro Befehl - - durch Fließbandverarbeitung (siehe später) - - Programmlaufzeit = Anzahl auszuführender Befehle * CPI-Wert * Dauer eines Taktzyklus - - Eigenschaften - - feste Befehlswortlänge - - LOAD/STORE-Architektur - - einfache Adressierungsarten - - „semantische Lücke“ zwischen Hochsprachen & Assemblerbefehlen durch Compiler überbrückt - - statt aufwändiger Hardware zur Beseitigung von Besonderheiten (z.B. 16-Bit Konstanten) wird diese Aufgabe der Software übertragen - - rein in Hardware realisierbar, keine Mikroprogrammierung - -## Technologien zum Speichern von Daten -- Arten - - **Modifikation von Strukturen**: Lochkarte, Schallplatte - - **Rückkopplung**: Flip-Flops, SRAM - - **Elektrische Ladungen**: Kondensator, DRAM - - **Magnetismus**: Magnetkernspeicher, Magnetband, Diskette, Festplatte - - **Optik**: Bar-Codes, CD-ROM, DVD -- Vergleichskriterien - - Kapazität - - Energiebedarf - - Geschwindigkeit - - Robustheit - - Speicherdichte - - Kosten -- Zugriffsmethoden - - Sequentieller Zugriff - - Zugriffszeit ist abhängig vom Speicherort und vom vorherigen Zugriff - - Beispiele: Magnetbänder, Festplatten, CD-ROM, DVD, BluRay - - Bei Plattenspeicher schneller Zugriff durch Überspringen von Spuren - - Wahlfreier Zugriff - - Zugriffszeit ist unabhängig vom Speicherort und vom vorherigen Zugriff - - Eindeutige Adresse identifiziert den Speicherort - - RAM (Random Access Memory) -- Einteilung des Speichers in - - Flüchtigen Speicher - - Informationen gehen nach Ausschalten der Versorgungsspannung verloren! - - Register innerhalb des Prozessors - - Static RAM (SRAM) für Caches - - Dynamic RAM (DRAM) für den Arbeitsspeicher - - Nichtflüchtige Speicher: - - Informationen bleiben auch ohne Versorgungsspannung über längere Zeit (typischerweise einige Jahre) erhalten! - - Beispiele: Flash, Magnetspeicher (Festplatte, Disketten, Magnetbänder) - - Bei einem ROM (Read Only Memory) ist nur lesender Zugriff möglich - -Zweierpotenzen -- 1 KibiByte = 1 KiB = 1024 Bytes = 2^10 Bytes -- 1 MebiByte = 1 MiB = 1024 KiB = 2^20 Bytes = 1.048.576 Bytes -- 1 GibiByte = 1 GiB = 1024 MiB = 2^30 Bytes = 1.073.741.824 Bytes -- 1 TebiByte = 1 TiB = 1024 GiB = 2^40 Bytes = 1.099.511.627.776 Bytes - - -## Blocktransfer (Burst) -Auslesen des kompletten Zeilenpuffers durch automatisches Inkrementieren der Spaltenadresse - -## Cache -= schneller Speicher, der vor einen größeren, langsamen Speicher geschaltet wird -- Im weiteren Sinn: Puffer zur Aufnahme häufig benötigter Daten -- Für Daten die schon mal gelesen wurden oder in der Nähe von diesen liegen -- 90% der Zeit verbringt ein Programm in 10% des Codes -- Im engeren Sinn: Puffer zwischen Hauptspeicher und Prozessor -- Ursprung: cacher (frz.) – verstecken („versteckter Speicher“) - -Organisation von Caches -- Prüfung anhand der Adresse, ob benötigte Daten im Cache vorhanden sind („Treffer“; cache hit) -- Falls nicht (cache miss): Zugriff auf den (Haupt-) Speicher, Eintrag in den Cache - - -# Ein- und Ausgabe -## Übertragungsprotokolle -- Synchrone Busse - - Keine Rückmeldung bei der Übertragung - - Unidirektionales Timing -- Asynchrone Busse - - Rückmeldung der Datenannahme - - Bidirektionales Timing - -| | unidirektional | bidirektional | -| -- | -- | -- | -| Beschreibung | Kommunikationspartner verlassen sich darauf, dass Partner innerhalb festgelegter Zeit reagieren. | Kommunikationspartner bestätigen per Kontrollsignal (senden ein acknowledgment), dass sie in der erwarteten Weise reagiert haben. | -| Vorteile | einfach; bei konstanten Antwortzeiten schnell | passt sich unterschiedlichen Geschwindigkeiten an; hoher Grad an Flusskontrolle möglich | -| Nachteile | Kommunikationspartner muss in bestimmter Zeit | antworten komplexer; Zeitüberwachung notwendig; evtl. langsam | -| Einsatzgebiet | synchrone Busse, Speicherbusse | asynchrone Busse, E/A- und Peripheriebusse | - -Programmierbarer Interrupt Controller (PIC) - -# Prozessorergänzung -## Prozessor-Leistung -Leistung = (Durchschnitts-)Befehle pro Zeit\ -Berechnung: $L=\frac{IPC}{t_{cycle}}$ mit $IPC = \frac{1}{CPI}$ und $CPI = \sum t_i *p_i$ -- IPC: Instructions Per Cycle (Anzahl Durchschnittsbefehle pro Taktzyklus) -- CPI: Cycles Per Instruction (Mittlere Anzahl Taktzyklen pro Befehl) -- $t_i$ : Anzahl Taktzyklen des i-ten Befehls -- $p_i$ : Relative Häufigkeit des i-ten Befehls -- $t_cycle$ : Taktzykluszeit [$μs$] - -## Befehlspalette -Pipelining: Fließbandverarbeitung (seriell vs parallel) -- IF / ID / EX: Befehl lesen / dekodieren / ausführen -- OF / WB: Operand lesen / schreiben (Register) -- Probleme: Unterschiedliche Phasenlänge, bedingte Sprünge, Datenabhängigkeiten - -Superskalare Architektur: \ -Befehl lesen -> Befehl dekodieren -> Operand lesen -> Befehl ausführen -> Operand schreiben - -dRam: mit Kondensator\ -sRam: mit FlipFlop\ -RAM: Random Access Memory\ -ROM: Read Only Memory\ +# Grundprinzipien +- Ein- und Ausgabe +- Programmspeicher +- Datenspeicher + +Unterschieden in: +- Harvard Architektur: direkt mit Prozessor verbunden +- Princeton-Architektur (von-Neumann-Architektur): über Systembus verbunden + +## Eigenschaften +Fast alle der heute üblichen Rechner gehen auf folgende Eigenschaften zurück: +1. Die Rechenanlage besteht aus den Funktionseinheiten Speicher, Steuerwerk (engl. controller), dem Rechenwerk (engl. data path) und Ein-/Ausgabe-Einheiten. +2. Die Struktur der Anlage ist unabhängig vom bearbeiteten Problem. Die Anlage ist speicherprogrammierbar. +3. Der Speicher wird in Zellen gleicher Größe geteilt. Die Zellnummern heißen Adressen. +4. Das Programm besteht aus einer Folge von elementaren Befehlen, die in der Reihenfolge der Speicherung bearbeitet werden. +5. Abweichungen von der Reihenfolge sind mit (bedingten oder unbedingten) Sprungbefehlen möglich. +6. Es werden Folgen von Binärzeichen (nachfolgend Bitvektoren genannt) verwendet, um alle Größen darzustellen. +7. Die Bitvektoren erlauben keine explizite Angabe des repräsentierten Typs. Aus dem Kontext heraus muss stets klar sein, wie die Bitvektoren zu interpretieren sind. + +# Befehlssatz +Adressierung ohne Speicherzugriff +- Registeradressierung: ausschließlich Operanden aus & Ziele in Registern +- Unmittelbare Adressierung, Direktoperanden, immediate addressing: Operanden sind Teil des Befehlsworts +- Direkte Adressierung, absolute Adressierung: Adresse ist ausschließlich im Befehlswort enthalten +- Register-indirekte Adressierung: Adresse ist ausschließlich im Register enthalten + - Varianten: pre/post-increment/decrement zur Realisierung von Stapeloperationen +- Relative Adressierung, indizierte Adressierung, Basis-Adressierung: Adresse ergibt sich aus der Addition eines Registerinhalts und einer Konstanten im Befehl + +## n-Adressmaschinen +Klassifikation von Befehlssätzen bzw. Befehlen nach der Anzahl der Adressen bei 2-stelligen Arithmetik-Befehlen +- 3-Adressmaschinen: Operanden und Ziel einer Operation werden explizit angegeben +- 2-Adressmaschinen: Überschreiben eines Operanden mit dem Ergebnis +- 1 1⁄2-Adressmaschinen: wie 2-Adressmaschinen, nur unter Verwendung von Registern +- 1-Adressmaschinen: Nutzung von nur 1 Register +- 0-Adressmaschinen: Kellermaschinen + +## Programmiermodelle, Instruction Set Architectures (ISAs) +Klassifikation von Befehlssätzen nach der Gestaltung/Ausprägung der +vorhandenen Maschinenbefehle +- CISC – Complex Instruction Set Computers + - Relativ kompakte Codierung von Programmen + - Für jeden Befehl wurden mehrere Taktzyklen benötigt. Die Anzahl der Zyklen pro Befehl war groß + - (Mikro-) Programm zur Interpretation der Befehle nötig + - Compiler konnten viele Befehle gar nicht nutzen +- RISC – Reduced Instruction Set Computers + - Wenige, einfache Befehle + - Hohe Ausführungsgeschwindigkeit + - durch kleine Anzahl von Taktzyklen pro Befehl + - durch Fließbandverarbeitung (siehe später) + - Programmlaufzeit = Anzahl auszuführender Befehle * CPI-Wert * Dauer eines Taktzyklus + - Eigenschaften + - feste Befehlswortlänge + - LOAD/STORE-Architektur + - einfache Adressierungsarten + - „semantische Lücke“ zwischen Hochsprachen & Assemblerbefehlen durch Compiler überbrückt + - statt aufwändiger Hardware zur Beseitigung von Besonderheiten (z.B. 16-Bit Konstanten) wird diese Aufgabe der Software übertragen + - rein in Hardware realisierbar, keine Mikroprogrammierung + +## Technologien zum Speichern von Daten +- Arten + - **Modifikation von Strukturen**: Lochkarte, Schallplatte + - **Rückkopplung**: Flip-Flops, SRAM + - **Elektrische Ladungen**: Kondensator, DRAM + - **Magnetismus**: Magnetkernspeicher, Magnetband, Diskette, Festplatte + - **Optik**: Bar-Codes, CD-ROM, DVD +- Vergleichskriterien + - Kapazität + - Energiebedarf + - Geschwindigkeit + - Robustheit + - Speicherdichte + - Kosten +- Zugriffsmethoden + - Sequentieller Zugriff + - Zugriffszeit ist abhängig vom Speicherort und vom vorherigen Zugriff + - Beispiele: Magnetbänder, Festplatten, CD-ROM, DVD, BluRay + - Bei Plattenspeicher schneller Zugriff durch Überspringen von Spuren + - Wahlfreier Zugriff + - Zugriffszeit ist unabhängig vom Speicherort und vom vorherigen Zugriff + - Eindeutige Adresse identifiziert den Speicherort + - RAM (Random Access Memory) +- Einteilung des Speichers in + - Flüchtigen Speicher + - Informationen gehen nach Ausschalten der Versorgungsspannung verloren! + - Register innerhalb des Prozessors + - Static RAM (SRAM) für Caches + - Dynamic RAM (DRAM) für den Arbeitsspeicher + - Nichtflüchtige Speicher: + - Informationen bleiben auch ohne Versorgungsspannung über längere Zeit (typischerweise einige Jahre) erhalten! + - Beispiele: Flash, Magnetspeicher (Festplatte, Disketten, Magnetbänder) + - Bei einem ROM (Read Only Memory) ist nur lesender Zugriff möglich + +Zweierpotenzen +- 1 KibiByte = 1 KiB = 1024 Bytes = 2^10 Bytes +- 1 MebiByte = 1 MiB = 1024 KiB = 2^20 Bytes = 1.048.576 Bytes +- 1 GibiByte = 1 GiB = 1024 MiB = 2^30 Bytes = 1.073.741.824 Bytes +- 1 TebiByte = 1 TiB = 1024 GiB = 2^40 Bytes = 1.099.511.627.776 Bytes + + +## Blocktransfer (Burst) +Auslesen des kompletten Zeilenpuffers durch automatisches Inkrementieren der Spaltenadresse + +## Cache += schneller Speicher, der vor einen größeren, langsamen Speicher geschaltet wird +- Im weiteren Sinn: Puffer zur Aufnahme häufig benötigter Daten +- Für Daten die schon mal gelesen wurden oder in der Nähe von diesen liegen +- 90% der Zeit verbringt ein Programm in 10% des Codes +- Im engeren Sinn: Puffer zwischen Hauptspeicher und Prozessor +- Ursprung: cacher (frz.) – verstecken („versteckter Speicher“) + +Organisation von Caches +- Prüfung anhand der Adresse, ob benötigte Daten im Cache vorhanden sind („Treffer“; cache hit) +- Falls nicht (cache miss): Zugriff auf den (Haupt-) Speicher, Eintrag in den Cache + + +# Ein- und Ausgabe +## Übertragungsprotokolle +- Synchrone Busse + - Keine Rückmeldung bei der Übertragung + - Unidirektionales Timing +- Asynchrone Busse + - Rückmeldung der Datenannahme + - Bidirektionales Timing + +| | unidirektional | bidirektional | +| -- | -- | -- | +| Beschreibung | Kommunikationspartner verlassen sich darauf, dass Partner innerhalb festgelegter Zeit reagieren. | Kommunikationspartner bestätigen per Kontrollsignal (senden ein acknowledgment), dass sie in der erwarteten Weise reagiert haben. | +| Vorteile | einfach; bei konstanten Antwortzeiten schnell | passt sich unterschiedlichen Geschwindigkeiten an; hoher Grad an Flusskontrolle möglich | +| Nachteile | Kommunikationspartner muss in bestimmter Zeit | antworten komplexer; Zeitüberwachung notwendig; evtl. langsam | +| Einsatzgebiet | synchrone Busse, Speicherbusse | asynchrone Busse, E/A- und Peripheriebusse | + +Programmierbarer Interrupt Controller (PIC) + +# Prozessorergänzung +## Prozessor-Leistung +Leistung = (Durchschnitts-)Befehle pro Zeit\ +Berechnung: $L=\frac{IPC}{t_{cycle}}$ mit $IPC = \frac{1}{CPI}$ und $CPI = \sum t_i *p_i$ +- IPC: Instructions Per Cycle (Anzahl Durchschnittsbefehle pro Taktzyklus) +- CPI: Cycles Per Instruction (Mittlere Anzahl Taktzyklen pro Befehl) +- $t_i$ : Anzahl Taktzyklen des i-ten Befehls +- $p_i$ : Relative Häufigkeit des i-ten Befehls +- $t_cycle$ : Taktzykluszeit [$μs$] + +## Befehlspalette +Pipelining: Fließbandverarbeitung (seriell vs parallel) +- IF / ID / EX: Befehl lesen / dekodieren / ausführen +- OF / WB: Operand lesen / schreiben (Register) +- Probleme: Unterschiedliche Phasenlänge, bedingte Sprünge, Datenabhängigkeiten + +Superskalare Architektur: \ +Befehl lesen -> Befehl dekodieren -> Operand lesen -> Befehl ausführen -> Operand schreiben + +dRam: mit Kondensator\ +sRam: mit FlipFlop\ +RAM: Random Access Memory\ +ROM: Read Only Memory\ diff --git a/Stochastik.md b/Stochastik.md new file mode 100644 index 0000000..92ee94e --- /dev/null +++ b/Stochastik.md @@ -0,0 +1,47 @@ +--- +title: Stochastik +date: Wintersemester 20/21 +author: Wieerwill +--- + +# Stochastik ist +- Wahrscheinlichkeitstheorie: mathematische "Sprache" zur Modellierung zufälliger Phänomene + - Ziel: über gegebene Eigenschaften des Systems präzise Aussagen über zukünftige, zufällige Beobachtungen +- und Statistik: + - Beschreibung beobachteter Daten + - Schätzen unbekannter Parameter + - Testen von Hypothesen + - Vorhersagen unbeobachteter zufälliger Werte + - Modellwahl und -überprüfung + - Ziel: basierend auf zufälligen Beobachtungen auf Eigenschaften des Systems“ schließen + +## Wahrscheinlichkeiten +### Wahrscheinlichkeitsraum $(\Omega , P)$ +- $\Omega$: Grundraum, Menge der Elementarereignisse (oder Ausgänge) (Bsp: $\Omega={heil, kaputt}^x$) +- $\omega \in \Omega$: Elementarereignis, Ausgang (Bsp: $\omega=(heil, heil, heil, kaputt, heil...)$) +- $A \subseteq \Omega$: Ereignis (Bsp: $A={\omega: Anzahl kaputt = 2 }$) +- $P$: Wahrscheinlichkeitsmaß, d.h. + - Wahrscheinlichkeit, dass A eintritt: $\Omega \supseteq A \rightarrow P(A) \in [0,1]$ + - $\sigma$-Additivität: $P(U_{k\in N} A_k)= \sum_{k\in N} P(A_k)$ für disjunkte $A_k, k\in N$ + - sicheres Ereignis $\Omega$: $P(\Omega)= 1$ + +## Laplace Expriment +$\Omega$ sei eindlich und $P(\omega)=\frac{1}{*\Omega} \rightarrow$ Laplace-Verteilung oder diskrete Gleichverteilung $\rightarrow$ für $A \subseteq \Omega: P(A)=\sum_{\omega \in A} P(\omega)=\frac{*A}{*\Omega}=\frac{\text{Anzahl "günstige" Ausgänge"}}{\text{Anzahl "alle" Ausgänge}}$ + +Laplace-Verteilung: Alle Ausgänge sind gleichwahrscheinlich $\rightarrow$ Symmetrie + +## Urnenmodell +Eine Urne enthält schwarze (S) und weiße (W) Kugeln, insgesamt also $N=S+W$. Man zieht zufällig eine Kugel und nummeriert durch. +- P(i-te Kugel wird gezogen)= $\frac{1}{N}$ für $i=1,..,N$ +- P(Kugel ist schwarz)=$\sum_{i=1}^S P(\text{i-te Kugel wird gezogen}) = S \frac{1}{N}=\frac{S}{N}$ + +### Ziehen ohne zurücklegen +Was, wenn man noch eine Kugel zieht (ohne Zurücklegen)? +$\rightarrow$ Zweistufiges Experiment! Modellieren mit bedingten Wahrscheinlichkeiten. + +## Bedingte Wahrscheinlichkeiten +$A,B \subseteq \Omega$ mit $P(B)> 0$; man beobachtet, dass B eintritt + +die bedingte Wahrscheinlichkeit von "A gegeben B": $P(A|B)=\frac{P(A \cap B)}{P(B)}$ + +die totale Wahrscheinlichkeit: $P(A)=\sum_{i=1}^n P(A|B_i)P(B_i)$ diff --git a/Telematik 1-cheatsheet.tex b/Telematik 1-cheatsheet.tex index 4f5f0ed..45e8aa1 100644 --- a/Telematik 1-cheatsheet.tex +++ b/Telematik 1-cheatsheet.tex @@ -1,957 +1,957 @@ -\documentclass[10pt,landscape]{article} -\usepackage{multicol} -\usepackage{calc} -\usepackage{ifthen} -\usepackage[landscape]{geometry} -\usepackage{amsmath,amsthm,amsfonts,amssymb} -\usepackage{color,graphicx,overpic} -\usepackage{hyperref} - - -\pdfinfo{ - /Title (Telematik 1 - Cheatsheet) - /Creator (TeX) - /Producer (pdfTeX 1.40.0) - /Author (Robert Jeutter) - /Subject (Telematik 1) - /Keywords (Telematik, ISO/OSI, TCP/IP)} - -% This sets page margins to .5 inch if using letter paper, and to 1cm -% if using A4 paper. (This probably isn't strictly necessary.) -% If using another size paper, use default 1cm margins. -\ifthenelse{\lengthtest { \paperwidth = 11in}} - { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} } - {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}} - {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } - {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } - } - -% Turn off header and footer -\pagestyle{empty} - -% Redefine section commands to use less space -\makeatletter -\renewcommand{\section}{\@startsection{section}{1}{0mm}% - {-1ex plus -.5ex minus -.2ex}% - {0.5ex plus .2ex}%x - {\normalfont\large\bfseries}} -\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}% - {-1explus -.5ex minus -.2ex}% - {0.5ex plus .2ex}% - {\normalfont\normalsize\bfseries}} -\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}% - {-1ex plus -.5ex minus -.2ex}% - {1ex plus .2ex}% - {\normalfont\small\bfseries}} -\makeatother - -% Define BibTeX command -\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em - T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} - -% Don't print section numbers -\setcounter{secnumdepth}{0} - - -\setlength{\parindent}{0pt} -\setlength{\parskip}{0pt plus 0.5ex} - -%My Environments -\newtheorem{example}[section]{Example} -% ----------------------------------------------------------------------- - -\begin{document} -\raggedright -\footnotesize -\begin{multicols}{3} - - -% multicol parameters -% These lengths are set only within the two main columns -%\setlength{\columnseprule}{0.25pt} -\setlength{\premulticols}{1pt} -\setlength{\postmulticols}{1pt} -\setlength{\multicolsep}{1pt} -\setlength{\columnsep}{2pt} - -\section{Multiplexing} -Optionen für die Auswahl des nächsten Hops bei großen Netzwerken: -\begin{description} - \item[Fluten] Sende das Paket an alle Nachbarn - \item[Hot Potato Routing] Sende an einen zufälligen Nachbarn - \item[Routingtabellen] In jedem Switch mit einem Eintrag pro Ziel. Enthält Info über kürzeste Wege -\end{description} - -\section{Serviceprimitive} -\begin{description} - \item[Request (Req)] Anfrage an ein Layer einen Service auzuführen - \item[Indication (Ind)] Ein Layer zeigt seinem Nutzer, dass etwas passiert ist (asynchrone Benachrichtigung) - \item[Response (Res)] Ein Nutzer von höherem Layer beantwortet eine Indication - \item[Confirmation (Conf)] Der ursprüngliche Dienstaufrufer wird über die Beendigung des Servicerequests informiert -\end{description} - -\section{Korrektheitsanforderung} -\begin{description} - \item[Completeness] Alle gesendeten Nachrichten werden irgendwann zugestellt - \item[Correctness] Alle Daten die ankommen, sind auch genau die, die losgeschickt wurden (unverändert, ohne Bitfehler) - \item[Reihenfolgegetreu] Nachrichten und Bytesequenzen kommen in der korrekten Reihenfolge an - \item[Verlässlich] Sicher, Verfügbar, … - \item[Bestätigt] Erhalt von Daten wird dem Sender bestätigt -\end{description} - -\section{Verbindungsorientiert} -Verbindungsorientierte Dienste müssen Primitive Bereitstellen um Verbindungen handhaben zu können: -\begin{description} - \item[CONNECT] Einrichtung der Verbindung - \item[LISTEN] Warten auf Verbindungsanfragen - \item[INCOMING\_CONN] Anzeige eingehender Connectionrequests - \item[ACCEPT] Annahme einer Verbindung - \item[DISCONNECT] Terminierung einer Verbindung -\end{description} - -\section{Layering} -\begin{tabular}{ p{3.5cm} | p{3.5cm} } - Vorteile & Nachteile \\ - \hline - Komplexität verwalten \& beherrschen & Funktionen vl redundant \\ - Änderung der Implementierung transparent & selbe Information für verschiedene Layer nötig \\ - Ideales Netzwerk & Layer n benötigt eventuell Einblick in Layern n+x \\ -\end{tabular} - -\section{Architekturvoraussetzungen} -für das Internet -\begin{description} - \item[Generalität] Unterstütze alle möglichen Sets von Applikationen - \item[Heterogenität] Verbinde alle Arten von Netzwerktechnologien - \item[Robustheit] Wichtiger als Effizienz - \item[Erweiterbarkeit] Wichtiger als Effizienz - \item[Skalierbarkeit] Spätere Entdeckung -\end{description} - -\section{Medium Access Control (MAC)} -\subsection{Annahmen für die dynamische Kanalzuweisung} -\begin{itemize} - \item Stationsmodell - \begin{itemize} - \item N unabhängige Stationen - \item Mögliches Lastmodell: Wahrscheinlichkeit des Generierens eines Pakets im Intervall t ist x*T, mit x konstant - \end{itemize} - \item Einkanalannahme: Nur ein Kanal für alle Stationen und für alle Nachrichten - \item Kollisionsannahme: Nur je ein Frame zeitgleich fehlerfrei übertragbar - \item Zeitmodell - \begin{itemize} - \item Kontinuierlich: Übertragungen können jederzeit stattfinden - \item Geslottet: Zeit ist in Slots eingeteilt, Übertragung kann nur an Slotgrenzen beginnen - \end{itemize} - \item Carrier Sensing (CSMA) - \begin{itemize} - \item Stationen können (oder auch nicht) erkennen, ob der Kanal frei oder in Benutzung ist - \item Falls Kanal als belegt angesehen, so wird nichts übertragen - \end{itemize} -\end{itemize} - -\subsection{Carrier Sensing} -\begin{description} - \item[] Höre bevor du redest, und sende nichts, wenn das Medium gerade belegt ist - \item[1-Persistent CSMA] Falls belegt, so warte bis frei und sende dann -> Probleme entstehen, wenn mehrere nach der jetzigen Nachricht senden wollen - \item[Non-Persistent CSMA] Wenn Kanal frei so übertrage, wenn Kanal belegt, so warte eine zufällige Zeit vor dem nächsten Freiheitstest - \item[P-Persistent CSMA] Kombiniert bisherige Ideen + geslottete Zeit, Warte ständig auf freiwerden des Kanals übertrage aber nicht sofort -\end{description} - -\subsection{Collision Detetion - CSMA/CD} -Abhängig vom physischen Layer können Kollisionen erkannt werden, so warte eine zufällige Zeit k - -\subsection{Bit-Map-Protokoll} -Stationen melden Sendewunsch während eines Reservierungsslots an -\begin{itemize} - \item Verhalten bei geringer Last: Wenn kaum ein Paket versendet werden soll, so wiederholt das Medium die Contentionslots -> Wartezeit - \item Verhalten bei großer Last: Hoher und stabiler Durchsatz mit vernachlässigbarem Overhead - \item Bit-Map ist ein Carrier Sense Protokoll -\end{itemize} - -\subsection{Limited Contention Protokoll} -\begin{itemize} - \item Idee 1: - \begin{itemize} - \item Anpassen der Stationsanzahl per Contentionslot - \item Contentionslots sind gut für den Durchsatz, bei geringer Last können wir es uns aber nicht leisten, auf die Antworten zu warten -> Stationen müssen sich dynamisch einen Slot teilen - \end{itemize} - \item Idee 2: Adaptives Baumprotokoll := Verwende verschiedene Auflösungslevel für die Wettbewerbsslots -\end{itemize} - -\subsection{Ethernetversionen} -\begin{description} - \item[Switched Ethernet] mehrere Stationen über ein Kabel - \item[Fast Ethernet] wie Switched nur mit 10ns Bitzeit - \item[Gigabit Ethernet] jedes Kabel hat genau zwei Maschinen angehängt - \begin{itemize} - \item mit Switch - \begin{itemize} - \item Keine geteilten Kollisionsdomönen, benötigen kein CSMA-CD - \item Fullduplexoperation auf jedem Link - \end{itemize} - \item mit Hub - \begin{itemize} - \item Kollisionen, Halbduples, CSMA-CD - \item Maximale Kabellänge 25 Meter - \end{itemize} - \end{itemize} -\end{description} - -\section{Internetworking} -\subsection{Pfaderkennung - Selbstlernen} -\begin{itemize} - \item Jeder Switch hat eine Switchtabelle - \item Eintrag: (MAC-Adresse, Interface, Zeitstempel) - \item Beim Empfang eines Frames lernt der Switch den Ort des Senders kennen (Rückwärtslernen) -\end{itemize} - -\subsection{Weiterleiten} -\begin{itemize} - \item Falls Ziel bekannt so prüfe, ob es in das selbe Segment gehört aus dem es kommt -> verwerfen, - \item sonst leite es passend weiter - \item andernfalls flute das Netzwerk damit -\end{itemize} - -\subsection{Rückwärtslernen in Bridges - Bootstrapping} -\begin{itemize} - \item Flute, falls nicht bekannt wohin gesendet werden muss, oder - \item verwerfe, wenn bekannt, dass es nicht nötig ist, oder - \item leite spezifisch weiter, wenn das Ziel bekannt ist -\end{itemize} - -\subsection{Gateways} -Wenn selbst Router nicht ausreichend, dann sind Higher-Layer-Verbindungen notwendig; Arbeit auf dem Transportlevel und oberhalb, zum Beispiel für Transcodierung - -\subsection{Verbindung einzelner LANs} -\begin{itemize} - \item Physisches Layer - Repeater und Hub - \item Data-Link-Layer - Bridges und Switches - \item Netzwerklayer - Routing - \item Higher-Layer - Gateways -\end{itemize} - -\section{Netzwerklayer} -\subsection{Durchsuchen der Routingtabelle} -\begin{itemize} - \item Suche nach übereinstimmender Hostadresse (Flag H gesetzt) - \item Suche dann nach passender Netzwerkadresse - \item Drittens, Suche nach einem Defaulteintrag -\end{itemize} - -\subsection{Switching Fabric} -\begin{itemize} - \item Switching mittels Speicher - \begin{itemize} - \item Herkömmliche Rechner mit Switching unter direkter CPU-Kontrolle - \item Kopieren der Pakete in den Systemspeicher - \item Geschwindigekeit limitiert durch die Speicherbandbreite - \end{itemize} - \item Switching mittels BUS - \begin{itemize} - \item Übertragung von Datagrammen intern über einen Bus - \item Switchinggeschwindikeit limitiert durch die Busbandbreite - \item typ. 1Gbps Bus, ausreichend für Heim und Businessrouter - \end{itemize} - \item Switching mittels Verbindungsnetzwerk (Crossbar) - \begin{itemize} - \item Überwinden der Bandbreitenbeschränkungen von Busen - \item Design: Fragmentierung von Datagrammen in Zellen fester Größe, wobei nun die Zellen durch das Fabric geswitcht werden - \item Bis zu 1.28 Tbps Switchinggeschwindigkeit - \end{itemize} -\end{itemize} - -\subsection{IP Paketformat} -\begin{itemize} - \item Version: Versionsnummer des eingesetzten IP - \item IHL: IP Header Length in 32 Bit Worten - \item Typ des Dienstes: Infos zur Priorisierung - \item Totale Länge: Die gesamtlänge in Bytes inklusive Header - \item Identifier: Wenn Fragmentierung auftritt, bekommt jedes zugehörige Paket den selben Identifier - \item Flags: DF (don't fragment), MF (more fragments, alle außer das letzte Paket haben dies gesetzt) - \item Fragment Offset: Position des Fragments im ursprünglichen Paket - \item TTL: Zähler für die Hopanzahl, wird an jedem Router dekrementiert, sobald gleich 0 -> verwerfen - \item Protokoll: Spezifiziert verwendetes Protokoll - \item Headerchecksum: Erlaubt Verifizierung der Inhalte im IP Header - \item Quell und Zieladressen: identifizieren der Quelle und des Ziels - \item Optionen: bis 40 Byte, zur Erweiterung verwendet -\end{itemize} - -\subsection{Klassen von IP-Adressen} -\begin{itemize} - \item Class A: rießige Organisationen, bis 16 Mil. Hosts - \item Class B: große Organisationen, bis 65 Tausend Hosts - \item Class C: kleine Organisationen, bis 255 Hosts - \item Class D: Multicast, keine Netzwerk/Host Hierarchie - \item Class E: reserviert - \item Loopback: 127.xxx.xxx.xxx ist zum Testen reserviert, hierauf versendete Pakete werden als eingehende behandelt - \item Broadcast: alles 1en -\end{itemize} - -\subsection{IP-Adressierung} -\begin{itemize} - \item IPv4 Adresse: 32 Bit Identifier für Hosts oder Routinginterfaces - \item Interface: Verbindung zwischen Host und dem physischen Link. IP Adressen werden an das jeweilige Interface vergeben -\end{itemize} - -\subsection{CIDR: Classless Inter Domain Routing} -\begin{itemize} - \item Überwinden der Klassengrenzen durch Supernetting - \item ISPs können nun Class C Blocks zu einem großen Block zusammenfassen - \item "Longest match routing" auf maskierten Adressen - \item Beispiel: Alle in Europa vergebenen Adressen teilen sich einen gemeinsamen Prefix -> Nur ein Eintrag für alle Verbindungen nach Europa in den meisten amerikanischen Routern -\end{itemize} - -\subsection{NAT - Network Address Translation} -\begin{itemize} - \item Lokale Netzwerke haben nur eine der Außenwelt bekannte IP-Adresse, somit hat nicht jedes Gerät eine vom ISP bereitgestellte Adresse - \begin{itemize} - \item Möglichkeit intern Adressen zu vergeben ohne die Außenwelt informieren zu müssen - \item Wechsel des ISPs möglich, ohne intern Adressen zu verändern - \item Geräte im Netzwerk nicht von außen ansprechbar (Sicherheitsfaktor) - \end{itemize} - \item 16 Bit Portnummernfeld -> 60 000 simultane Verbindung mit nur einer einzigen LAN-Side Adresse -\end{itemize} - -\subsection{ICMP: Internet Control Message Protocol} -\begin{itemize} - \item Verwendet von Hosts und Routern um auf Netzwerkebene Informationen auszutauschen - \item In Netzwerkebenen oberhalb von IP werden ICMP Nachrichten als IP Datagramme versendet - \item ICMP Nachrichten: Typ, Code + erste 8 Bytes des den Fehler auslösenden IP-Datagramms -\end{itemize} - -\subsection{IPv6} -\begin{itemize} - \item Header mit 40 Byte Größe (also 20 Byte mehr als bei IPv4 mit 32 Bit Adressen) - \item Fragmentierung ist nicht mehr erlaubt - \item Headerformat hilft bei schneller Verarbeitung und Weiterleitung - \item Checksummen -> komplett entfernt - \item Optionen -> Erlaubt, aber außerhalb des Headers - \item ICMPv6 -> Zusätzliche Nachrichtentypen + Multicastgruppenmanagementfunktionen -\end{itemize} - -\subsubsection{IPv6 Header} -\begin{itemize} - \item Priority: Signalisiert die Priotität der Datagramme im Fluss - \item Flow Label: Identifiziert Datagramme im selben Fluss - \item Next Header: Identifiziert das Layer der höheren Schicht für Daten -\end{itemize} - -\subsection{Routing Algorithmen} -\begin{itemize} - \item Ein Router führt einen Routingalgorithmus aus, um zu entscheiden, an welchem Ausgang ein eingehendes Paket weiter übertragen werden sollte. - \begin{itemize} - \item Verbindungsorientiert: nur beim Verbindungsaufbau - \item Verbindungslos: entweder für jedes Paket oder periodisch ausgeführt - \end{itemize} - \item Oftmals unter Verwendung von Metriken -> Zuweisung eines Kostenfaktors an jeden Link, bspw. Anzahl an Hops, Kosten eines Links,… - \item Zwei grundlegende Typen existieren: - \item \begin{itemize} - \item Nichtadaptive Routingalgorithmen: Nehmen keine Rücksicht auf aktuellen Netzwerkzustand (z.B. Fluten) - \item Adaptive Routingalgorithmen: Berücksichtigen aktuellen Netzwerkzustand (z.B. Distanzvekotrrouting, Link State Routing) - \end{itemize} -\end{itemize} -\begin{description} - \item[Fluten] jedes eingehende Paket wird auf jede ausgehende Linie geschickt, außer auf die Herkunftslinie - \item[Zufallsrouting] Jedes ankommende Paket wird auf einen zufälligen Ausgang geschickt, außer auf den Quellausgang -> es bahnt sich seinen Weg sozusagen durch den Router - \item[Adaptive Routingalgorithmen] \ - \begin{description} - \item[Zentralisiertes adaptives Routing] Anpassen an die vorherrschende Verkehrslast; Ein Routingkontrollcenter muss ins Netzwerk eingebaut sein, welches periodisch den Linkstatus der Router erhält und kürzeste Routen berechnet und diese an die Router sendet - \item[Isoliertes adaptives Routing] benötigt keinen Informationsaustausch zwischen Routern; Routingentscheidungen werden nur anhand der Informationen des lokalen Routers getroffen, wie bei Hotpotato oder Rückwärtslernen - \item[Verteiltes adaptives Routing] Router tauschen periodisch Infos aus und aktualisieren Weiterleitungstabellen; Finde einen guten Pfad durch das Netzwerk, welcher einen von der Quelle zum Ziel führt; Graphabstraktion für Routingalgorithmen mit Linkkosten und Pfadkosten - \end{description} -\end{description} - -\subsection{Distanzvektorrouting Algorithmen} -\begin{description} - \item[Iterativ] Läuft bis keine Knoten mehr Informationen austauschen. Selbstterminierend -> kein Stoppsignal - \item[Asynchron] Knoten müssen Informationen nicht getaktet austauschen - \item[Verteilt] Jeder Knoten kommuniziert nur mit seinem direkten Nachbarn - \item[Distanztabellendatenstruktur] Jeder Knoten hat seine eigene Spalte für jedes mögliche Ziel und Zeile für jeden direkt angeschlossenen Nachbarknoten -\end{description} - -\subsubsection{Vergleich zwischen Link-State und Distanzvektoralgorithmen} -\begin{itemize} - \item Nachrichtenkomplexität: - \begin{itemize} - \item LS: mit N Knoten und E Links werden $O(n-e)$ Nachrichten versandt - \item DV: Austausch nur zwischen Nachbarn - \end{itemize} - \item Konvergenzgeschwindigkeit - \begin{itemize} - \item LS: $O(n^2)$ Algorithmus benötigt $O(N-E)$ Nachrichten (teils mit Oszillation) - \item DV: Konvergenzzeit variiert (Routingschleifen, Count to Infinity Problem, Oszillation) - \end{itemize} - \item Robustheit: (im Falle eines Routerausfalls) - \begin{itemize} - \item LS: Ein Knoten kann falsche Linkkosten ausgeben; Jeder Knoten berechnet nur seine eigene Tabelle - \item DV: DV Knoten kann falsche Gewichte ausgeben; Jede Tabelle wird nun noch von anderen Routern verwendet -> Fehler breiten sich über das ganze Netzwerk aus - \end{itemize} -\end{itemize} - -\subsection{Routing im Internet - Autonome Systeme} -Das globale Internet besteht aus miteinander verbundenen AS -\begin{description} - \item[Stub AS] kleine Unternehmen (ein Link zum Internet) - \item[Multihomed AS] große Unternehmen (mehrere Links, ohne Transitverkehr) - \item[Transit AS] Netzbetreiber -\end{description} -Zwei Level Routing: -\begin{description} - \item[Intra-AS] Administrator verantwortlich für die Auswahl (RIP, OSPF, IGRP) - \item[Inter-AS] Einheitlicher Standard (BGP) -\end{description} - -\subsection{Intra-AS und Inter-AS Routing} -\begin{itemize} - \item Policy: - \begin{itemize} - \item Inter AS: Admin möchte Kontrolle über sein Netz haben - \item Intra AS: ein einziger Admin, also keine Policyentscheidungen nötig - \end{itemize} - \item Skalierbarkeit: Hierarchisches Routing spart Tabellenplatz und sorgt für weniger Updateverkehr - \item Performance: - \begin{itemize} - \item Inter-AS: Policy wichtiger als Performance - \item Intra-AS: Performance als oberstes Gut - \end{itemize} -\end{itemize} - - -\section{Transport Layer} -\subsection{Multiplexing und Demultiplexing} -Hosts verwenden IP-Adressen und Portnummern um Segmente an korrekte Sockets zuzustellen -\begin{description} - \item[Multiplexing auf Sendeseite] Sammeln von Daten an mehreren Sockets, verpacken der Daten mit Header zum Demultiplexing - \item[Demultiplexing auf Empfangsseite] Zustellen empfangener Segmente an den korrekten Socket -\end{description} -\begin{description} - \item[Verbindungslos (UDP)] Erstelle Sockets mit Portnummern; Sockets werden übber Zweiertupel aus Ziel IP und Ziel Port identifiziert - \item[Verbindungsorientiert (TCP)] TCP Sockets werden durch ein Vierertupel aus Quell-IP, Quellport, ZielIP und Zielport identifiziert -\end{description} - -\subsection{verbindungsorientierte Kontrolle} -Connect $\rightarrow$ Data $\rightarrow$ Disconnect -\begin{itemize} - \item T-Connect.Request(Zieladr., Quelladr) - \item T-Connect.Indication(Zieladr., Quelladr.) - \item T-Connect.Response(Antwortadresse) - \item T-Connect.Confirmation(Antwortadresse) -\end{itemize} -CR (Connection Request) oder CC (Connection Confirm) TPDU - -\subsection{Drei Wege Handshake} -\begin{itemize} - \item Verbindung wird Aufgabaut, sobald beide Verbindungsaufbau TPDUs bestätigt wurden - \item Benötigt zusätzliches ACK (Acknowledgement) oder DT (Data) - \item Packe hierzu eine Sequenznummer in die CR, ACK, CC, DATA TPDUs - \item Muss durch die Gegenseite kopiert werden, und erlaubt den Verbindungsaufbau nur dann, wenn die korrekte Nummer bereit gestellt wird. Verwende Sequenznummern deshalb möglichst nicht schnell hintereinander erneut. -\end{itemize} - -\subsection{Verbindunsabbau} -\begin{description} - \item[implizit] Abbau der Netzwerklayerverbindung - \item[explizit] Verbindungsfreigabe mit Disconnect-TPDUs -\end{description} -Kann den Verlust von nicht bestätigten Daten nach sich ziehen, TCP verhindert dies, indem alle gesendeten PDUs vor Beenden der Verbindung bestätigt werden müssen - - -\section{Flusskontrolle} -\subsection{Pufferallokation} -\begin{itemize} - \item Flusskontrolle abhängig von der Puffermöglichkeit - \item Um ausstehdene Pakete zu unterstützen müssen diese entweder sofort und in korrekter Reihenfolge beim Empfänger ankommen, oder es muss genügend Puffer vorhanden sein - \item Empfänger verlangsamt den Sender oder Anforderung von Pufferspeicher durch den Sender - \item Mitteilung des Empfängers an den Sender, dass nur noch so viel Puffer verfügbar ist (bei Sliding Window einfach das Sendefenster anpassen) -\end{itemize} - -\subsection{Continue und Stop} -Einfachste Lösung: Sende Stopnachrichten wenn der Empfänger nicht schritthalten kann und Continue, sobald wieder Ressourcen vorhanden sind. \ -Beispiel: XON/XOFF: funktioniert aber nur bei Fullduplexverbindungen. - -\subsection{Implizite Flusskontrolle} -Idee: Halte ACKs oder NACKs zurück, um den Sender zu verlangsamen, somit werden Fehlerkontrollmechanismen nun zur Flusskontrolle missbraucht werden.\ -Nachteil: Senderseitig keine Unterscheidung mehr möglich, ob Pakete verloren gingen, oder er verlangsamt werden soll, was in unnötigen Wiederholungsübertragungen resultiert. - -\subsection{Kreditbasierte Flusskontrolle} -Der Empfänger gewährt dem Sender expliziten Kredit, sodass dieser meherere Pakete senden kann. Ist der Kredit aufgebraucht, so muss der Sender warten, bis er wieder neuen zugeteilt bekommt. Hierbei benötigen wir Fehlerkontrolle um auf verlorene Kreditnachrichten resultieren zu können - -\subsection{Permits und Acknowledgements} -\begin{itemize} - \item Permits = Empfänger hat Pufferspeicher, sende also weiter - \item Acknowledgements = Empfänger hat Anzahl X an Paketen empfangen - \item Kombinierbar mit dynamisch wachsendem Pufferplatz beim Emfänger (Beispiel TCP) -\end{itemize} - -\section{Staukontrolle} -Jedes Netzwerk kann nur eine gewisse Anzahl an Traffic pro Zeit transportieren, wenn nun mehr Traffic von den Quellen ausgeht, als das Netzwerk als nominelle Kapazität hat, so kommt es zu Staukollapsen und verlorenen Paketen. Immer $\lambda$-in = $\lambda$-out (goodput)\ -Staukontrolle ist essentiell, um Schneeballeffekte zu vermeiden: Sobald ein Netzwerk einmal überladen ist, wird es Pakete verlieren. Nach Erkennung von Paketverlusten durch ein zuverlässiges Transportprotokoll, werden Pakete erneut übertragen, was die Last abermals erhöht -\begin{itemize} - \item Die Senderate jeder Quelle muss an die aktuelle Kapazität des Netzwerks angepasst werden - \item Staukontrolle ist ein globales Problem, da dies abhängig von allen Routern, Weiterleitungsdisziplinen, Lastinjektionenund so weiter ist. - \item Flusskontrolle wiederum ist ein lokales Problem: Die Quelle darf das Ziel nicht überlasten, also sind nur Ziel und Quelle involviert -\end{itemize} - -\subsection{Design/Aktions Optionen} -\begin{description} - \item[Open Loop] Designe das System von Beginn an so, dass es korrekt funktioniert und man keine Korrekturen zur Laufzeit vornehmen muss - \item[Closed Loop] Verwende Feedback, um zu erlauben, dass sich der Sender an die Situation anpasst - \item[Explizited Feedback] Die Stelle, an welcher der Stau auftritt informiert den Sender - \item[Implizites Feedback] der Sender extrahiert aus dem Netzwerkverhalten Informationen darüber, wie er sich verhalten sollte -\end{description} -\begin{itemize} - \item Erhöhen der Kapzität -> teuer, kurzfristig nicht umsetzbar - \item Reservierungen und Zugriffskontrolle - erlaube also keinen zusätzlichen Verkehr wenn das Netzwerk stark ausgelastet ist -> nur für schaltkreisbasierende Netzwerke verfügbar - \item Reduzierung der Last in kleiner Granularität -> Bringe einzelne Quellen dazu ihre Last zu reduzieren, sodass nichts terminiert werden muss (benötigt Feedback vom Netz: closed loop) - \item Verwerfen von Paketen -> Pufferplatz ist voll und alte Pakete werden verworfen. Für Medieninhalte sind neue wichtiger als alte Pakete -\end{itemize} - -\subsection{Choke Pakete} -Sobald ein Stau der Router einen Stau erkannt hat -> Sende Chokepakete. Chokepakete sagen dem Ziel, dass es seine Senderate verringern soll - -\subsection{Warnungsbits} -Sobald ein Router feststellt, dass er von Stau betroffen ist, setzt er ein Warnbit in allen Paketen die er verschickt -> Da das Ziel das Warnungsbit in sein ACK Paket aufnimmt, erfährt die Quelle vom Stau und kann ihre Sendeleistung minimieren. - -\subsection{Random Early Detection} -nutze verworfene Pakete als implizites Feedback, bereits bevor die Warteschlange voll ist, wirf also vorzeitig Pakete weg um Feedback zu geben. -Mit steigender Staubelastung am Router kann die Entwurfswahrscheinlichkeit erhöht werden - -\section{TCP} -\subsection{Drei Wege Handshake} -\begin{itemize} - \item Client sendet ein TCP SYN (SYN = 1, ACK = 0) an den Server -> spezifiziert initiale, nie benutzte Sequenznummer - \item Server erhält das SYN Paket und antwortet mit einem SYNACK (SYN = 1, ACK = 1) -> Server alloziert Puffer und spezifikation der initialen Sequenznummer des Servers - \item Der Client erhält das SYNACK und antwortet hierauf mit einem ACK (SYN = 0, ACK = 1), hier können nun erstmals Daten enthalten sein -\end{itemize} -Terminieren einer Verbindung -\begin{itemize} - \item Client sendet ein TCP FIN - \item Server empfängt das FIN, antwortet mit einem ACK und sendet ebenfalls ein FIN - \item Client erhält ein FIN Segment, antwortet darauf mit ACK und geht in timed Wait Zustand, antwortet auf alle FINs mit ACKs - \item Server erhält ein ACK, die Verbindung ist geschlossen -\end{itemize} - -\subsection{Sende- und Empfangspuffer} -\begin{itemize} - \item Sender: Puffer um Fehlerkontrolle bereit zu stellen - \item Empfänger: Zwischenspeichern von noch nicht abgerufenen, oder nicht reihenfolgegetreu angekommenen Paketen -\end{itemize} -\subsection{Flusskontrolle: Angebotenes Fenster} -Der Empfänger kann seine Empfangpufferkapazitäten verkünden - -\subsection{Nagles Algorithmus - Selbsttaktung und Fenster} -\begin{itemize} - \item TCP Selbsttaktung: Ankunft eines ACKs ist ein Zeichen dafür, dass neue Daten auf das Netzwerk geschickt werden können - \item falls sowohl angebotene Daten und das angebotene Fenster >= MSS -> Sende ein volles Segment - \item falls unbestätigte Daten auf dem Weg sind, so puffere neue Daten bis das MSS voll ist, - \item andernfalls schicke die Daten sofort -\end{itemize} - -\subsection{Staukontrolle} -\begin{itemize} - \item Implizites Feedback durch verworfene Pakete. Annahme: Stau als Hauptgrund für verworfene Pakete - \item Fensterbasierte Staukontrolle: TCP führt Buch über die Anzahl an Bytes die es noch in das Netzwerk injezieren darf, diese Fenstergröße kann wachsen oder schrumpfen -\end{itemize} - -\subsection{AIMD - Sägezahnmuster der Last} -\begin{itemize} - \item TCP verwendet AIMD, also additive increase, multiplicative decrease Taktik - \item Es wird also kontinuierich auf zusätzliche Bandbreite geprüft und durch die Erhöhung der Bandbreitengrenze wird das Netzwerk regelmäßig die multiplikative Verringerung ausführen -> Sägezahnmuster -\end{itemize} - - -\section{Application Layer} -\subsection{HTTP Statuscodes} -\begin{itemize} - \item 200 OK - Anfrage okay, das angefragte Objekt folgt - \item 301 Moved Permanently - das angefragte Objekt wurde verschoben, der neue Pfad folgt - \item 400 Bad Request - Anfrage wurde nicht verstanden - \item 404 Not Found - angefordertes Objekt konnte auf dem Server nicht gefunden werden - \item 505 HTTP Version not supported -\end{itemize} - -\subsection{Cookies} -\begin{itemize} - \item Cookieheaderzeile in der Antwort - \item Cookieheaderzeile in der Anfrage - \item Die Cookiedatei wird auf dem Rechner des Hosts gespeichert und vom Browser verwaltet - \item Speichern der Cookieinformationen in einer Backenddatenbank der Webseite -\end{itemize} - -\subsection{Webcaches (Proxyserver)} -Bedienen der Clientanfrage ohne den urpsrünglichen Webserver dabei zu involvieren -\begin{itemize} - \item Der Nutzer stellt den Browser so ein, dass dieser über einen Cache auf das Netz zugreift - \item Alle Anfragen des Browsers gehen zuerst an den Cache, hat er das angefragte Material, so wird er dieses an den Client schicken, oder andernfalls beim Webserver besorgen und dem Client dann weiterleiten - \item Der Cache agiert sowohl als Client als auch als Server - \item Reduzieren von Antwortzeiten für Clientanfragen - \item Reduzieren von Verkehr auf dem Zugangslink des ISPs - \item Ein Internet voller Caches erlaubt es armen Anbietern effektiv Inhalte zu übertragen -\end{itemize} - -\subsection{Webserver} -\subsubsection{Grundlegende Webserveraufgaben} -\begin{itemize} - \item Zum Empfang von Anfragen bereitmachen - \item Annehmen von Verbindungen und Anfragen - \item Lesen und Verarbeiten von Anfragen - \item Antworten auf Anfragen - \item Bereitmachen und Annehmen von Anfragen -\end{itemize} -\begin{enumerate} - \item Prozessmodell - \begin{itemize} - \item Einem Prozess werden alle benötigten Schritte zugewiesen, welche benötigt werden, um eine Anfrage zu bearbeiten - \item Wenn die Bearbeitung abgeschlossen ist, so ist der Prozess wieder in der Lage neue Verbindungen zu akzeptieren - \item Typischerweise werden mehrere Prozesse benötigt - \item Ein Prozess blockiert, beispielsweise read(), dann entscheidet das OS, welcher Prozess als nächstes ausgeführt werden darf - \item Die Parallelität wird durch die Anzahl an Prozessen limitiert - \item Vorteile: Synchronisation dem Prozessmodell inhärent; Absicherung zwischen Prozessen - \item Nachteile: Langsam; Schwere Ausführbarkeit von Operationen, welche auf globalen Informationen beruhen - \end{itemize} - \item Threadmodell - \begin{itemize} - \item Verwende Threads anstelle von Prozessen - \item Vorteile: Schneller als Prozesse; Teilen standardmäßig aktiv - \item Nachteile: Benötigt OS Unterstützung; Kann per Prozess Limitierungen überlasten; Beschränkte Kontrolle über Schedulingentscheidungen - \end{itemize} - \item In-Kernel Modell - \begin{itemize} - \item möglich: ganzer Server im Kernel - \item Meist: nur statische Dateien werden vom Kernel bedient, andere Anfragen gehen an den regulären User-Space-Server - \item Dedizierter Kernelthread für HTTP Anfragen - \item Vorteile: Vermeidet das Kopieren von und in den Userspace; Sehr schnell, solange es eng in den Kernel integriert ist - \item Nachteile: Bugs können das OS, also die ganze Maschine crashen; Schwer zu debuggen und zu Erweitern; Inhärent OS-spezifisch - \end{itemize} - \item Eventbasiertes Modell - \begin{itemize} - \item Verwenden eines einzelnen Webserverprozesses um mehrere Anfragen zu behandeln - \item Vorteile: Sehr schnell, kein Kontextwechsel; Inhärentes Teilen ohne Locks; Komplette Kontrolle über die Schedulingentscheidungen; Kein komplexer OS-Support benötigt - \item Nachteile: Per-Prozess Begrenzungen; Nicht jedes OS mit voll asynchroner E/A, so können beim Lesen immernoch Blockierungen entstehen; Flash verwendet immerhin Hilfsprozesse um dies zu verhindern - \end{itemize} -\end{enumerate} - -\subsection{Mailzugriffsprotokolle} -\begin{description} - \item[SMTP] Zustellen/Speichern auf dem Empfangsserver - \item[POP] Post Office Protocol: Autorisierung und Download; POP3 ist zustandlos über mehrere Sitzungen - \item[IMAP] Internet Mail Access Protocol: Mehr Features aber komplexer; Behält alle Nachrichten am Server - \item[HTTP] Yahoo Mail, Hotmail, etc. -\end{description} - -\subsection{DNS - Domain Name System} -verteilte Datenbank implementiert in der Hierarchie von vielen verschiedenen Nameservern -Anwendungsschichtprotokoll für Hosts, Router und Nameserver zum Kommunizieren zur Namensauflösung - -\section{Sicherheit} -\subsection{Sicherheitsziele} -\begin{description} - \item[Vertraulichkeit] Verschickte oder gespeicherte Daten sollen nur einem bestimmten Nutzerkreis zugänglich sein; Vertraulichkeit von Instanzen wird auch als Anonymität bezeichnet - \item[Datenintegrität] Es sollte möglich sein, jede Veränderung von Daten zu erkennen, dies benötigt unter anderem, die Möglichkeit den Ersteller von Daten identifizieren zu können - \item[Verantwortlichkeit] Es sollte möglich sein, eine Instanz zu identifizieren, welche für irgendein Kommunikationsereignis zuständig ist - \item[Verfügbarkeit] Dienste sollten verfügbar sein und auch funktionieren - \item[Kontrollierter Zugriff] Nur autorisierte Instanzen solle in der Lage sein auf bestimmte Dienste oder Daten zuzugreifen -\end{description} -\subsection{Bedrohnungen technisch definiert} -\begin{description} - \item[Maskerade (Spoofing)] Eine Instanz behauptet jemand Anderes zu sein - \item[Abhören (Sniffing)] Jemand versucht Daten zu lesen, welche er nicht lesen darf und soll - \item[Autorisierungsverletzungen] Eine Instanz verwendet Ressourcen die sie nicht verwenden darf - \item[Verlust oder Veränderung von übertragener Information] Veränderung oder Zerstörung von Daten - \item[Fälschung von Daten] Eine Instanz erzeugt Daten im Namen einer Anderen - \item[Abstreiten von Kommunikationsereignissen] Eine Instanz streitet seine Beteiligung an einem Kommunikationsereignis ab - \item[Sabotage] Jede Art von Aktion welche darauf abzielt, die Verfügbarkeit oder korrekte Funktion von Diensten zu reduzieren -\end{description} -\subsection{Sicherheitsanalyse von gelayerten Protokollarchitekturen} -Dimension 1: Auf welchem Interface findet der Angriff statt?\ -Dimension 2: Auf welchem Layer findet der Angriff statt? -\subsection{Sicherheitsmechanismen} -\begin{description} - \item[Physische Sicherheit] Abschließen der Betriebsräume, Zutrittskontrolle; Schutz vor Überwachung der Umgebung - \item[Personelle Sicherheit] Sensitivität bei Mitarbeitern erzeugen; Überprüfung der Angestellten; Sicherheitstraining - \item[Administrative Sicherheit] Kontrollieren neuer Software; Prozeduren um Sicherheitsverstöße zu erkennen; Ansehen und Reagieren auf Audittrails - \item[Ausstrahlungssicherheit] Steuerung von Frequenzen und anderer elektromagnetischer Ausstrahlungen - \item[Mediensicherheit] Kontrollieren der Erstellung, Reproduktion und Zerstörung von Informationen; Scannen von Medien auf Schadsoftware - \item[Lifecyclekontrollen] Vertrauenswürdiges Systemdesign der Implementierung, Evaluation und Unterstüzung; Dokumentierung; Einhalten von Programmierstandards - \item[Computersicherheit] Schutz der Informationen, während diese auf Rechnern gespeichert oder verarbeitet werden; Schutz der Rechner selbst - \item[Kommunikationssicherheit] Schutz der Informationen beim Transport von einem zum anderen System; Schutz der Kommunikationsinfrastruktur an sich -\end{description} -\subsection{Sicherheitsdienste} -\begin{description} - \item[Authentisierung] Grundlegender Sicherheitsdienst, welcher sicherstellt, dass eine Instanz tatsächlich die Identität hat, welche sie vorgibt zu haben - \item[Integrität] Kleiner Bruder der Authentisierung, da er sicherstellt, dass Daten, welche von einer gewissen Einheit erstellt worden sind, nicht ohne Erkennung verändert werden können - \item[Vertraulichkeit] Stellt sicher, dass die geschützen Daten geheim bleiben - \item[Zugriffskontrolle] Kontrolliert, dass jede Identität nur auf die Informationen und Dienste zugreift, zu welchen sie auch zugriffsberechtigt ist - \item[Nicht Ablehnung] Schütz davor, dass andere Einheiten nach einer Kommunikation behaupten können, nie daran teilgenommen zu haben -\end{description} - -\subsection{Wichtige Eigenschaften von Verschlüsselungsalgorithmen} -Fehlerausbreitung: Charakterisiert die Effekte von Bitfehlern während der Übertragung von Ciphertext zum rekonstruierten Klartext\ -Synchronisation: Charakterisiert die Effekte von verlorenen Ciphertexten auf den rekonstruierten Klartext - -\subsection{Sicherheitsziele von IPSec} -\begin{description} - \item[Datenherkunftsauthentisierung/Datenintegrität] maskierte Quell- oder Zieladresse zu versenden, Pakete während der Übertragung zu verändern, gespeichertes Paket zu späterem Zeitpunkt zu versenden soll unmöglich sein (dass der Empfänger dies nicht merkt) - \item[Vertrauenswürdigkeit] Es soll nicht möglich sein, den Inhalt der IP Datagramme auszuspähen; Es soll weiterhin eine begrenzte Traffic Flow Confidentiality geben - \item[Sicherheitsrichtlinie] Sender, Empfänger und zwischenliegende Knoten sollen erkennen können, ob ein Paket ihrer Sicherheitsrichtlinie entspricht und dieses gegebenenfalls verwerfen -\end{description} - - -\subsection{Pakete} -\subsubsection{DHCP} -DHCP Discover an Broadcast (255.255.255.255), Server sendet DHCP Offer zurück mit Payload, DHCP Request (gleich wie Discover)\\ - -DHCP: Discover/Offer/Request/ACK\\ -UDP/TCP: SrcPort \& DstPort\\ -IP: SrcIP \& DstIP\\ -MAC: SrcAddr \& DestAddr\\ -Payload: (optional) - -\subsubsection{ARP} -ARP-Request/Response:\ - ARP: ARP-Request Payload: XXXX\\ - MAC: SrcAddr XXXX DestAddr XXX - -\subsubsection{DNS} -(A-Records bilden URL auf IP ab)\\ -DNS: DNS Query "A random.org"/ DNS Response "A random.org 123.45.67.890"\\ -UDP/TCP: SrcPort \& DstPort\\ -IP: SrcIP \& DstIP\\ -MAC: SrcAddr \& DestAddr - -\section{Ports} -\begin{tabular}{l| l} - UDP DHCP & 67/68 \\ -FTP & 21 \\ -SSH & 22 \\ -Telnet & 23 \\ -SMTP & 25 \\ -DNS & 53 \\ -IMAP & 143 \\ -IMAP TLS/SSL & 993 \\ -Non-privileg & >1023 \\ -\end{tabular} - - -\newpage -\section{Begriffe} -\begin{description} - \item[Simplex] nur ein Nutzer kann immer senden - \item[Half Duplex] beide Nutzer senden abwechselnd (Time Division Duplex) - \item[Full Duplex] beide Nutzer senden gleichzeitig (Frequency/Time Division Duplex) - \item[Circuit Switching] einfach; einmal aufgesetzt verbleiben die Ressourcen beim Nutzer; Circuit muss hergestellt werden, bevor kommuniziert werden kann - \item[Packet Switching] Aufteilen von Daten in kleinere Pakete die nach und nach gesendet werden; Problem: Informationen zu Sender/Empfänger und Start/Endzeitpunkt eines Pakets müssen mit übermittelt werden; Wird deshalb 'Store and Forward' Netzwerk genannt - \item[Broadcast Medium] Nur ein Sender zu jeder Zeit; Zugriffskontrolle (MUX o. Absprache) - \item[Baudrate] beschreibt die Anzahl der Symbole welche innerhalb einer Zeiteinheit übertragen werden; Symbolrate * Informationsgehalt je Symbol - \item[Protokoll] Protokolle sind Regelsätze, welche beschreiben wie zwei oder mehr entfernte Teile (peers oder protocol entities) eines Layers kooperieren, um den Dienst des gegebenen Layers zu implementieren. Ein Protokoll ist die Implementierung eines Services - \item[Signale] sind die physische Repräsentation von Daten in der Form einer charakteristischen Variation in Zeit oder Ausbreitung… - \item[Delay d] = distance / speed v - \item[Strict Layering] Jedes Layer verwendet nur den Service des darunter liegenden Layers - \item[Hammingdistanz] Anzahl an Stellen an denen sich zwei Frames x und y in binärer Darstellung unterscheiden lösbar mittels (x XOR y). - \item[Fehlerkontrolle vorwärts] Sender sendet redundante Infos so, dass der Empfänger selbst ausbessern kann - \item[Fehlerkontrolle rückwärts] Sender sendet redundante Infos so, dass der Empfänger fehlerhafte Pakete wahrscheinlich erkennt und Pakete in dem Fall nochmal verschickt werden können - \item[Burst Traffic] - \item[Broadcastkanal] Völllig dezentralisiert und so einfach wie möglich mit Rate b/s - \item[Statisches Multiplexing] einzelne Ressource statisch gemultiplext durch feste Sendezeiten und mehrere Frequenzbänder - \item[Polling] Masterknoten läd Slaveknoten zum Übertragen in Reihenfolge ein - \item[Tokenweitergabe] Kontrolltoken wird von einem zum anderen Knoten übertragen - \item[Hub] Eingehende Bits werden an alle Ausgänge mit selber Rate und ohne Puffern verteilt; Kein CSMA-CD am Hub; Alle verbundenen Kabel formen eine Kollisionsdomäne - \item[Switch] nicht nur eine einfache elektrische Verbindung für sternförmige Topologie; Switches enthalten Puffer, welche direkt ankommende Pakete zwischenspeichern, bevor sie diese weiterleiten - \item[Repeater] Physical Layer Gerät, verbindet zwei Kabel und verstärkt die ankommenden Signale und leitet dieses weiter; Versteht den Inhalt der Pakete nicht und interessiert sich nicht dafür - \item[Bridge] Jedes mit einer Bridge verbundene Netzwerk ist eine eigene Kollisionsdomäne und auch verschiedene LAN-Typen können miteinander verbunden werden - \item[Effizienz] Definiert als die Rate der Zeit, in welcher der Sender neue Informationen sendet (für den fehlerfreien Kanal) - \item[Bustoplogie] Alle Geräte sind an einem Kabel angebunden und sind in einer Kollisionsdomäne - \item[Sterntopologie] einfachere automatische Verwaltung und Wartung bei fehlerhaften Adaptern - \item[Spannbaum] Gegeben sei ein Graph G=(V,E), ein Spannbaum T = (V,E-T) ist ein Subgrap von V, wobei E-T ein Teil von E ist, welcher ein Spannbaum, der verbunden und azyklisch ist. - \item[Weiterleiten] Bewege Pakete vom Routereingang auf den entsprechenden Ausgang - \item[Routing] Berechnen der Route, die die Pakete von Quelle bis zum Ziel gegangen sind - \item[DHCP] Dynamic Host Configuration Protocol. beziehe die Adresse dynamisch von einem Server - \item[ARP] Adress Resolution Protocol Broadcast auf das LAN, mit der Frage, welcher Node IP X.X.X.X hat -> Antwort des Nodes mit der MAC-Adresse -> Zustellung möglich - \item[Hot Potato Routing] Wenn ein Paket ankommt, so leite es auf schnellste Art und Weise an den Ausgang mit der kleinsten Ausgangswarteschlange, ganz egal wohin dieser Ausgang dann führt - \item[Rückwärtslernen (Routing)] Paketheader enthalten wichtige Infos, wie Quelle, Ziel, Hopzähler -> Netzwerkknoten lernen etwas über die Netzwerktopologie während sie Pakete behandeln - \item[RIP] Routing Information Protocol. Distanzvektoralgorithmus mit Hops als Metrik. Falls nach 180s kein Advertisement empfangen wurde, so deklariere den Nachbarn als tot - \item[BGP] Border Gateway Protocol. Routerpaare tauschen Routinginformationen über semipermanente TCP Verbindungen aus - \item[OSPF] Open Shortes Paths First. annocieren nun keine Wege sondern Linkzustände mit je einem Eintrag pro Nachbarknoten - \item[Poisoned Reverse] Wenn Z durch Y routet um zu X zu gelangen: Z sagt Y, dass seine eigene Distanz zu X unendlich ist (somit routet Y nicht über X nach Z) - \item[Link State Routing] Berechnung des kleinsten Kostenpfades von einem Knoten S zu allen andern Knoten V erzielt durch den Link-State-Broadcast - \item[Gateway Router] Spezielle Router innerhalb des AS, führen das Intra-AS Routingprotokoll mit allen anderen Routern im AS aus. Zusätzlich verantwortlich für das Routing an exteren Ziele -> Inter-AS Routingprotokolle mit anderen Gatewayroutern - \item[Unicast] Ein Sender, ein Empfänger - \item[Multicast] Ein Sender, eine Gruppe von Empfänger - \item[Broadcast] Ein Sender, alle Teilnehmer eines Netzes - \item[TCP] Zuverlässige, in-Order Zustellung, Stau- \& Flusskontrolle, Verbindungsaufbau - \item[UDP] Unzuverlässige, ungeordente Zustellung, Einfache Erweiterung des best Effort IP Ansatzes - \item[RTT] Round Trip Time: Benötigte Zeit um ein kleines Paket so zu senden, dass es vom Client zum Server und zurück geschickt wird. - \item[CSMA] Carrier Sense Multiple Access - \item[CSMA/CD] + Collision Detection - \item[CSMA/CA] + Collision Avoidance - \item[HTTP] Hyper Text Transfer Protocol; Das Anwendungsnachrichtenprotokoll des Webs - \item[Nichtpersistentes HTTP] höchstens ein Objekt wird über die TCP Verbindung verschickt - \item[Persistentes HTTP ] Mehrere Objekte können über eine TCP Verbindung zwischen Client und Server ausgetauscht werden - \item[Server] ständig eingeschaltet und mit permanenter IP-Adresse; Serverfarmen zur Skalierung - \item[Client] Kommunizieren zeitweise mit Server; Können dynamische IP-Adressen haben; Kommunizieren nie direkt miteinander - \item[Peer to Peer] Ohne ständig eingeschalteten Server. Beliebige Endsysteme kommunizieren direkt miteinander, sind dabei zeitweise verbunden und haben wechselnde IP Adressen. - \item[POST Methode] Webseiten beinhalten oft Formulareingaben, die Eingabe wird dann im Entity Body an den Server geschickt - \item[URL Methode] Verwendet die GET Methode; Die Eingaben werden im URL Feld der Requestline hochgeladen - \item[FTP] File-Transfer-Protokoll: Dateitransferprotokoll, Übertrage Daten von und zum Server - \item[Mail Useragent] Erlaubt das Schreiben, Lesen und Bearbeiten von Nachrichten; Ein- und ausgehende Nachrichten werden auf einem Server gespeichert - \item[Mailserver] Die Mailbox beinhaltet eingehende Nachrichten, die Nachrichtenschlange die ausgehenden Nachrichten - \item[SMTP] Mailübertragungsprotokoll: Verwendet TCP um Nachrichten zuverlässig vom Client zum Server zu übertragen, verwendet Port 25; Direkte Übertragung vom Sender zum Empfänger - \item[IMAP] Internet Message Access Control - \item[MIME] Multimedia Mail Extensions: Zusätzliche Zeilen im Nachrichtenheader deklarieren den MIME Inhaltstyp - \item[TLP Server] Top Level Domain Server: Verantwortlich für .com, .org, .net, .edu und die Landesdomains - \item[Authorative DNS Server] DNS Server einer Organisation, stellen den authorativen Hostnamen für das IP Mapping der Organisationsserver - \item[Lokal DNS Server] Jeder ISP hat einen eigenen; Wenn ein Host eine DNS Anfrage stellt, so wird die Frage zuerst zum lokalen DNS Server gesendet (fungiert also als ein Proxy) - \item[Ressource Records (RR)] in DNS Datenbank; Format: (name, value, type, ttl) - \item[P2P Filesharing] Ein Peer ist sowohl ein Webclient als auch ein transienter Webserver; Alle Peers sind Server -> Hoch Skalierbar; Dateiübertragung ist dezentralisiert, die Lokalisierung findet allerdings zentral statt. - \item[Socket] Ein lokal auf dem Host laufendes, von einer Anwendung erstelltes, OS-kontrolliertes Interface, durch welches ein Anwendungsprozess sowohl Nachrichten vom und zu anderen Anwendungsprozessen Senden, als auch Empfangen kann. - \item[Bedrohnung] Eine Bedrohung in einem Kommunikationsnetzwerk ist jedes mögliche Ereignis oder eine Sequenz von Aktionen, welche zu einer Verletzung einer oder mehrerer Sicherheitsziele führen - \item[Kryptologie] Wissenschaft, die sich mit Kommunikation in sicherer und geheimer Art befasst - \item[Kryptographie] (graphein = schreiben): Die Lehre der Prinzipien und Techniken, durch welche Informationen in Ciphertext verpackt und später durch legitimierte Nutzer, wieder durch einen geheimen Schlüssel entschlüsselt werden können - \item[Kryptoanalyse] (analyein = etwas lösen): Die Wissenschaft und Kunst Informationen von Ciphern wiederherzustellen und dies ohne das Wissen über den Schlüssel zu schaffen - \item[Cipher] Methode eine Nachricht so zu transformieren, dass die Bedeutung nicht mehr erkannt werden kann - \item[Verschlüsseln von Daten] Transformiert Plaintext in Ciphertext um die Inhalte zu verschleiern - \item[Signieren von Daten] Berechnet einen Checkwert oder eine digitale Signatur zu einem gegebenen Plaintext oder Ciphertext, sodass dieser durch alle oder einige Instanzen mit Zugriff verifiziert werden kann - \item[Symmetrische Kryptographie] verwendet einen Schlüssel für Ver- und Entschlüsselung oder Signieren und Überprüfen - \item[Assymmetrische Kryptographie] verwendet zwei Schlüssel für Ver- und Entschlüsselung - \item[IPSec Authentication Header (AH)] Im Tunnelmodus stellt der Payload nochmals ein ganzes IP Paket dar; Wichtig: AH funktioniert nur in NAT freien Umgebungen - \item[IPSec Encapsulating Security Protocol (ESP)] Dem ESP Header folgt direkt ein IP Header oder ein AH-Header; Das next-header Feld vom vorhergehenden Header indiziert 50 für ESP - \item[Firewall] Eine oder eine Menge an Komponenten, welche den Zugriff zwischen einem geschützten Netzwerk und dem Internet oder zwischen einer Menge an Netzwerken beschränkt - \item[Paketfiltern/Screening] Die Aktion, welche ein Gerät ausführt, um selektiv den Fluss an Daten in und aus einem Netzwerk zu kontrollieren. Paketfiltern ist eine wichtige Technik um Zugriffskontrolle auf dem Subnetzwerklevel für paketorientierte Netzwerke zu implementieren - \item[Bastion Host] Ein Computer, welcher besonders gesichert werden muss, da er anfälliger für Angriffe ist, als andere Computer im Subnetz - \item[Dual Homed Host] Ein Computer mit > 2 Netzwerkinterfaces - \item[Proxy] ein Programm, welches sich im Auftrag interner Clients mit externen Servern beschäftigt. Proxies leiten genehmigte Clientanfragen an die Server, und die Antworten auch wieder an den Client weiter - \item[Network Address Translation (NAT)] eine Prozedur, durch welche ein Router die Daten in Paketen ändert um die Netzwerkadressen zu modifizieren; Dies erlaubt es die interne Netzwerkstruktur zu verschleiern - \item[Perimeternetzwerk] Ein Subnetz, welches zwischen einem externen und einem internen Netzwerk hinzugefügt wird, um eine weitere Sicherheitseben bereitzustellen; Ein Synonym hierfür ist DMZ (De Militarized Zone) - \item[QPSK] Quadrature Phase Shift Keying; Phasenverschiebung für Multiplexing - \item[Medium Access Control (MAC)] Verteilter Algorithmus, der bestimmt, wie Knoten auf ein geteiltes Medium zugreifen -\end{description} - -\end{multicols} - - -\section{Formeln} -\begin{multicols}{2} - Bitzeit $t_{Bit}=\frac{1}{Bitrate}$ - - Bitlänge $l_{Bit}=v_s * t_{Bit}$ - - Ausbreitungsverzögerung $d_{prop} = \frac{dist}{v_s}$ - - Übertragungszeit $d_{trans} = \frac{L}{R} = [\frac{bit}{s}]$ - - Ende-zu-Ende-Verzögerung $d_{e2e} = d_{prop} + d_{trans}$ - - Leitungsverm. Übertragung $t_L = \frac{L_{Nachricht}}{R}$ - - Nachrichtenver. Übertragung $t_N = (k + 1)\frac{L_{Nachricht}}{R}$ - - Paketver. Übertragung $t_{P} = (k + \frac{Laenge_{Nachricht}}{Laenge_{Pakete}})*\frac{L_{Packet}}{R} = (1+ \frac{k}{n})* \frac{L_{Nachricht}}{R}$ - - Kanalkap. Nyquist $R_{max} = 2* H * log_2n$ - - Kanalkap. Shannon $R_{max} = H* log_2(1+\frac{P_signalleistung}{P_rauschleistung})$ mit $r=10*log_{10}*{\frac{P_s}{P_n}}$ - - Bandwirth Delay - - Link Last - - LAN last - - Fehlerfrei Send and Wait $S = \frac{1}{(1+2a)}$ wobei $a = \frac{T_{prop}}{T_{trans}}$ - - Fehlerhaft Send and Wait $S = \frac{1-P}{1+2a}$ - - Fehlerfreies Sliding Window $S = {1, falls W >= 2a+1, W/(2a+1) sonst}$ - - Selective Reject $S = {1-P, falls W >= 2a+1, (W(1-P))/(2a+1) sonst}$ - - Go-Back-N $S = {\frac{1-P}{1+2aP}, falls W >= 2a+1, \frac{W(1-P)}{(2a+1)(1-P+WP)} sonst}$ - - Effizienz $\frac{T_{packet} }{ T_{packet} + d + T_{ack} + d}$ - - efficiency $\frac{1}{ (1+ 5 * \frac{t_{prop}}{t_{trans}}}$ - - Round Trip Time $EstimatedRTT = (1-a) * EstimatedRTT + a * SampleRTT$ - - ~ TCP Durchsatz $ 0,75 * \frac{W}{RTT}$ - - -\end{multicols} -\newpage - -\section{ISO/OSI - sehr nützliches Modell, keine existierenden Protokolle} -Jedes Layer nimmt Daten vom darüberliegenden Layer, fügt eine Headereinheit hinzu und erstellt eine neue Dateneinheit und schickt diese an das Layer darunter -\begin{tabular}{l | l | l} - PH & Physisches Layer & - Bietet eine bittransparente Schnittstelle zum physischen Medium\\ - &&Spezifiziert mechanische, elektrische, funktionale und prozedurale Mittel um die physische Verbindung zwischen zwei offenen Systemen zu unterstützen.\\ - &&In-sequence Zustellung der Bits ist sichergestellt\\ - &&Fehlererkennung ist manchmal inkludiert\\ - && Zeitliche Synchronisation (Non-Return to Zero Level oder Manchstercodierung)\\ - && Breitband- vs Basisbandübertragung (Amplituden-/Phasen-/Frequenzmodulation ) Bsp: QPSK, 16-QAM \\ - && Digital vs Analog \\ - \hline - L & Link Layer & - Unterstützt Übertragung von service data units (SDU) größer als "word" unter Systemen, welche über einen einzigen physischen Pfad verbunden sind.\\ - &&Essentielle Funktion ist block synchronization\\ - &&Im Fall von Halb-duplex oder multipoint links muss der Zugriff auf das Medium kontrolliert werden und Peersysteme müssen addressiert werden.\\ - && Framing durch Charakterzählen, Flagbitmuster/Bitstuffing oder Codeverletzung \\ - && Fehlererkennung \& -kontrolle (vorwärts/rückwärts) mit Redundanz (Parität), Hemmingdistanz, Cyclic Redundancy Check (CRC)\\ - && Send and Wait (Sliding Window) , Go-Back-N, Selective Reject \\ - && Verbindungsaufbau \& Flusskontrolle \\ - \hline - N & Network Layer & - Erschafft eine logischen Kommunikation zwischen offenen Systemen, welche verbunden sind mit verschiedenen Subnetworks\\ - &&Diese Netzwerkebene unterstützt Routing, also müssen sich N-Service Benutzer nicht um den Pfad kümmern\\ - &&Der N-Service ist uniform, unabhängig von der Variation an Subnetwork Technologien, Topologien, QoS und der Organisation\\ - &&Netzwerk Addresse = Endsystem Addresse\\ - \hline - T & Transport Layer & - logische Kommunikation zwischen zwei Prozessen/Nutzern, unabhängig von der Netzwerkstruktur\\ - &&Verschiedene Klassen von Protokollen mit verschiedenen Funktionalitäten sind festgelegt (connectionoriented/connectionless; reliable/unreliable)\\ - && Sendeseite: Segmentiert Anwendungsnachrichten und leitet diese Segmente an die Netzwerkschicht \\ - && Empfangsseite: Reassembliert Segmente in Nachrichten und leitet diese an die Anwendungsschicht weiter \\ - && Als Transportprotokolle werden im Internet hauptsächlich TCP und UDP verwendet \\ - && Fehlerkontrolle: Durch Sequenznummern, ACKs und Neuübertragungen\\ - && Flusskontrolle: Durch Inspizieren von ACKs und Permits\\ - && Staukontrolle: Durch das Verlangsamen des Senders, wenn Pakete oder ACKs verloren gehen\\ - \hline - S & Session Layer & - Unterstützt die Synchronisation des Dialogs und die Verwaltung des Datenaustausches\\ - &&Quarantine Data delivery - Eine ganze Gruppe von übertragenen S-SDUs wird zugestellt auf explizite Anfrage des Senders\\ - &&Interaktionsverwaltung erlaubt ausdrücklich festzulegen, welcher S-User das Recht bekommt zu übertragen\\ - &&Zurücksetzen der Verbindung auf vordefinierte Synchronisationspunkte\\ - \hline - P & Presentation Layer & - Unterstützt die Übersetzung von Daten und Datenstrukturen in einzigartige Repräsentation\\ - &&Ausschließlich die Syntax wird modifiziert um die Semantik beizubehalten\\ - &&Auswahl von einer der allgemein anerkannten Transfersyntax\\ - &&Die lokale Syntax von jedem Endsystem wird in oder von der ausgewählten Transfer Syntax übersetzt\\ - \hline - A & Application Layer & - Unterstützt den direkten Endnutzer durch die Bereitstellung einer Vielzahl an application services\\ - &&Genereller Typ (z.B. Entfernte prozedurale Anrufe, Transaktionsdurchführung,...)\\ - &&Spezifischer Typ (z.B. Virtuelles Terminal, Dateiübertragungszugriff und Verwaltung, Arbeitswechsel,...)\\ - &&Ein typisches Beispiel: virtuelles Terminal (Funktionen des reellen Terminals werden in virtuelle Funktionen gemappt)\\ -\end{tabular} - -\section{TCP/IP - nicht existentes Modell, sehr nützliches Protokoll} -\begin{tabular}{l | l} - Internetlayer & Packetswitching, Adressierung, Routing und Forwarding. Insbesondere für hierarchische Netze \\ - \hline - Transportlayer & zuverlässiger Bytestrom: TCP (Transport Control Protokoll) \\ - & unzuverlässiges Datagramm: UDP (User Datagramm Protokoll)\\ -\end{tabular} - -\section{UDP vs TCP} -\begin{tabular}{l | l} - UDP & TCP \\ \hline - minimalistisch & Punkt-zu-Punkt: Ein Sender, ein Empfänger \\ - Best Effort Dienst: Segmente können verloren gehen, nicht reihenfolgegetreu & Zuverlässiger, reihenfolgegetreuer Bytestrom \\ - Verbindungslos: Kein Handshaking und unabhängige Behandlung der Pakete & Pipelined: Staukontrolle und Flusskontrolle \\ - oftmals für das Streamen von Multimediainhalten & Sende und Empfangspuffer \\ - Überprüfung durch Checksummen & Vollduplex Daten: Bidirektionaler Datenfluss \\ - & Zuverlässsiger Datenverkehr benötigt eine Behandlung von Timeouts (RTT) \\ -\end{tabular} - +\documentclass[10pt,landscape]{article} +\usepackage{multicol} +\usepackage{calc} +\usepackage{ifthen} +\usepackage[landscape]{geometry} +\usepackage{amsmath,amsthm,amsfonts,amssymb} +\usepackage{color,graphicx,overpic} +\usepackage{hyperref} + + +\pdfinfo{ + /Title (Telematik 1 - Cheatsheet) + /Creator (TeX) + /Producer (pdfTeX 1.40.0) + /Author (Robert Jeutter) + /Subject (Telematik 1) + /Keywords (Telematik, ISO/OSI, TCP/IP)} + +% This sets page margins to .5 inch if using letter paper, and to 1cm +% if using A4 paper. (This probably isn't strictly necessary.) +% If using another size paper, use default 1cm margins. +\ifthenelse{\lengthtest { \paperwidth = 11in}} + { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} } + {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}} + {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } + {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} } + } + +% Turn off header and footer +\pagestyle{empty} + +% Redefine section commands to use less space +\makeatletter +\renewcommand{\section}{\@startsection{section}{1}{0mm}% + {-1ex plus -.5ex minus -.2ex}% + {0.5ex plus .2ex}%x + {\normalfont\large\bfseries}} +\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}% + {-1explus -.5ex minus -.2ex}% + {0.5ex plus .2ex}% + {\normalfont\normalsize\bfseries}} +\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}% + {-1ex plus -.5ex minus -.2ex}% + {1ex plus .2ex}% + {\normalfont\small\bfseries}} +\makeatother + +% Define BibTeX command +\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em + T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}} + +% Don't print section numbers +\setcounter{secnumdepth}{0} + + +\setlength{\parindent}{0pt} +\setlength{\parskip}{0pt plus 0.5ex} + +%My Environments +\newtheorem{example}[section]{Example} +% ----------------------------------------------------------------------- + +\begin{document} +\raggedright +\footnotesize +\begin{multicols}{3} + + +% multicol parameters +% These lengths are set only within the two main columns +%\setlength{\columnseprule}{0.25pt} +\setlength{\premulticols}{1pt} +\setlength{\postmulticols}{1pt} +\setlength{\multicolsep}{1pt} +\setlength{\columnsep}{2pt} + +\section{Multiplexing} +Optionen für die Auswahl des nächsten Hops bei großen Netzwerken: +\begin{description} + \item[Fluten] Sende das Paket an alle Nachbarn + \item[Hot Potato Routing] Sende an einen zufälligen Nachbarn + \item[Routingtabellen] In jedem Switch mit einem Eintrag pro Ziel. Enthält Info über kürzeste Wege +\end{description} + +\section{Serviceprimitive} +\begin{description} + \item[Request (Req)] Anfrage an ein Layer einen Service auzuführen + \item[Indication (Ind)] Ein Layer zeigt seinem Nutzer, dass etwas passiert ist (asynchrone Benachrichtigung) + \item[Response (Res)] Ein Nutzer von höherem Layer beantwortet eine Indication + \item[Confirmation (Conf)] Der ursprüngliche Dienstaufrufer wird über die Beendigung des Servicerequests informiert +\end{description} + +\section{Korrektheitsanforderung} +\begin{description} + \item[Completeness] Alle gesendeten Nachrichten werden irgendwann zugestellt + \item[Correctness] Alle Daten die ankommen, sind auch genau die, die losgeschickt wurden (unverändert, ohne Bitfehler) + \item[Reihenfolgegetreu] Nachrichten und Bytesequenzen kommen in der korrekten Reihenfolge an + \item[Verlässlich] Sicher, Verfügbar, … + \item[Bestätigt] Erhalt von Daten wird dem Sender bestätigt +\end{description} + +\section{Verbindungsorientiert} +Verbindungsorientierte Dienste müssen Primitive Bereitstellen um Verbindungen handhaben zu können: +\begin{description} + \item[CONNECT] Einrichtung der Verbindung + \item[LISTEN] Warten auf Verbindungsanfragen + \item[INCOMING\_CONN] Anzeige eingehender Connectionrequests + \item[ACCEPT] Annahme einer Verbindung + \item[DISCONNECT] Terminierung einer Verbindung +\end{description} + +\section{Layering} +\begin{tabular}{ p{3.5cm} | p{3.5cm} } + Vorteile & Nachteile \\ + \hline + Komplexität verwalten \& beherrschen & Funktionen vl redundant \\ + Änderung der Implementierung transparent & selbe Information für verschiedene Layer nötig \\ + Ideales Netzwerk & Layer n benötigt eventuell Einblick in Layern n+x \\ +\end{tabular} + +\section{Architekturvoraussetzungen} +für das Internet +\begin{description} + \item[Generalität] Unterstütze alle möglichen Sets von Applikationen + \item[Heterogenität] Verbinde alle Arten von Netzwerktechnologien + \item[Robustheit] Wichtiger als Effizienz + \item[Erweiterbarkeit] Wichtiger als Effizienz + \item[Skalierbarkeit] Spätere Entdeckung +\end{description} + +\section{Medium Access Control (MAC)} +\subsection{Annahmen für die dynamische Kanalzuweisung} +\begin{itemize} + \item Stationsmodell + \begin{itemize} + \item N unabhängige Stationen + \item Mögliches Lastmodell: Wahrscheinlichkeit des Generierens eines Pakets im Intervall t ist x*T, mit x konstant + \end{itemize} + \item Einkanalannahme: Nur ein Kanal für alle Stationen und für alle Nachrichten + \item Kollisionsannahme: Nur je ein Frame zeitgleich fehlerfrei übertragbar + \item Zeitmodell + \begin{itemize} + \item Kontinuierlich: Übertragungen können jederzeit stattfinden + \item Geslottet: Zeit ist in Slots eingeteilt, Übertragung kann nur an Slotgrenzen beginnen + \end{itemize} + \item Carrier Sensing (CSMA) + \begin{itemize} + \item Stationen können (oder auch nicht) erkennen, ob der Kanal frei oder in Benutzung ist + \item Falls Kanal als belegt angesehen, so wird nichts übertragen + \end{itemize} +\end{itemize} + +\subsection{Carrier Sensing} +\begin{description} + \item[] Höre bevor du redest, und sende nichts, wenn das Medium gerade belegt ist + \item[1-Persistent CSMA] Falls belegt, so warte bis frei und sende dann -> Probleme entstehen, wenn mehrere nach der jetzigen Nachricht senden wollen + \item[Non-Persistent CSMA] Wenn Kanal frei so übertrage, wenn Kanal belegt, so warte eine zufällige Zeit vor dem nächsten Freiheitstest + \item[P-Persistent CSMA] Kombiniert bisherige Ideen + geslottete Zeit, Warte ständig auf freiwerden des Kanals übertrage aber nicht sofort +\end{description} + +\subsection{Collision Detetion - CSMA/CD} +Abhängig vom physischen Layer können Kollisionen erkannt werden, so warte eine zufällige Zeit k + +\subsection{Bit-Map-Protokoll} +Stationen melden Sendewunsch während eines Reservierungsslots an +\begin{itemize} + \item Verhalten bei geringer Last: Wenn kaum ein Paket versendet werden soll, so wiederholt das Medium die Contentionslots -> Wartezeit + \item Verhalten bei großer Last: Hoher und stabiler Durchsatz mit vernachlässigbarem Overhead + \item Bit-Map ist ein Carrier Sense Protokoll +\end{itemize} + +\subsection{Limited Contention Protokoll} +\begin{itemize} + \item Idee 1: + \begin{itemize} + \item Anpassen der Stationsanzahl per Contentionslot + \item Contentionslots sind gut für den Durchsatz, bei geringer Last können wir es uns aber nicht leisten, auf die Antworten zu warten -> Stationen müssen sich dynamisch einen Slot teilen + \end{itemize} + \item Idee 2: Adaptives Baumprotokoll := Verwende verschiedene Auflösungslevel für die Wettbewerbsslots +\end{itemize} + +\subsection{Ethernetversionen} +\begin{description} + \item[Switched Ethernet] mehrere Stationen über ein Kabel + \item[Fast Ethernet] wie Switched nur mit 10ns Bitzeit + \item[Gigabit Ethernet] jedes Kabel hat genau zwei Maschinen angehängt + \begin{itemize} + \item mit Switch + \begin{itemize} + \item Keine geteilten Kollisionsdomönen, benötigen kein CSMA-CD + \item Fullduplexoperation auf jedem Link + \end{itemize} + \item mit Hub + \begin{itemize} + \item Kollisionen, Halbduples, CSMA-CD + \item Maximale Kabellänge 25 Meter + \end{itemize} + \end{itemize} +\end{description} + +\section{Internetworking} +\subsection{Pfaderkennung - Selbstlernen} +\begin{itemize} + \item Jeder Switch hat eine Switchtabelle + \item Eintrag: (MAC-Adresse, Interface, Zeitstempel) + \item Beim Empfang eines Frames lernt der Switch den Ort des Senders kennen (Rückwärtslernen) +\end{itemize} + +\subsection{Weiterleiten} +\begin{itemize} + \item Falls Ziel bekannt so prüfe, ob es in das selbe Segment gehört aus dem es kommt -> verwerfen, + \item sonst leite es passend weiter + \item andernfalls flute das Netzwerk damit +\end{itemize} + +\subsection{Rückwärtslernen in Bridges - Bootstrapping} +\begin{itemize} + \item Flute, falls nicht bekannt wohin gesendet werden muss, oder + \item verwerfe, wenn bekannt, dass es nicht nötig ist, oder + \item leite spezifisch weiter, wenn das Ziel bekannt ist +\end{itemize} + +\subsection{Gateways} +Wenn selbst Router nicht ausreichend, dann sind Higher-Layer-Verbindungen notwendig; Arbeit auf dem Transportlevel und oberhalb, zum Beispiel für Transcodierung + +\subsection{Verbindung einzelner LANs} +\begin{itemize} + \item Physisches Layer - Repeater und Hub + \item Data-Link-Layer - Bridges und Switches + \item Netzwerklayer - Routing + \item Higher-Layer - Gateways +\end{itemize} + +\section{Netzwerklayer} +\subsection{Durchsuchen der Routingtabelle} +\begin{itemize} + \item Suche nach übereinstimmender Hostadresse (Flag H gesetzt) + \item Suche dann nach passender Netzwerkadresse + \item Drittens, Suche nach einem Defaulteintrag +\end{itemize} + +\subsection{Switching Fabric} +\begin{itemize} + \item Switching mittels Speicher + \begin{itemize} + \item Herkömmliche Rechner mit Switching unter direkter CPU-Kontrolle + \item Kopieren der Pakete in den Systemspeicher + \item Geschwindigekeit limitiert durch die Speicherbandbreite + \end{itemize} + \item Switching mittels BUS + \begin{itemize} + \item Übertragung von Datagrammen intern über einen Bus + \item Switchinggeschwindikeit limitiert durch die Busbandbreite + \item typ. 1Gbps Bus, ausreichend für Heim und Businessrouter + \end{itemize} + \item Switching mittels Verbindungsnetzwerk (Crossbar) + \begin{itemize} + \item Überwinden der Bandbreitenbeschränkungen von Busen + \item Design: Fragmentierung von Datagrammen in Zellen fester Größe, wobei nun die Zellen durch das Fabric geswitcht werden + \item Bis zu 1.28 Tbps Switchinggeschwindigkeit + \end{itemize} +\end{itemize} + +\subsection{IP Paketformat} +\begin{itemize} + \item Version: Versionsnummer des eingesetzten IP + \item IHL: IP Header Length in 32 Bit Worten + \item Typ des Dienstes: Infos zur Priorisierung + \item Totale Länge: Die gesamtlänge in Bytes inklusive Header + \item Identifier: Wenn Fragmentierung auftritt, bekommt jedes zugehörige Paket den selben Identifier + \item Flags: DF (don't fragment), MF (more fragments, alle außer das letzte Paket haben dies gesetzt) + \item Fragment Offset: Position des Fragments im ursprünglichen Paket + \item TTL: Zähler für die Hopanzahl, wird an jedem Router dekrementiert, sobald gleich 0 -> verwerfen + \item Protokoll: Spezifiziert verwendetes Protokoll + \item Headerchecksum: Erlaubt Verifizierung der Inhalte im IP Header + \item Quell und Zieladressen: identifizieren der Quelle und des Ziels + \item Optionen: bis 40 Byte, zur Erweiterung verwendet +\end{itemize} + +\subsection{Klassen von IP-Adressen} +\begin{itemize} + \item Class A: rießige Organisationen, bis 16 Mil. Hosts + \item Class B: große Organisationen, bis 65 Tausend Hosts + \item Class C: kleine Organisationen, bis 255 Hosts + \item Class D: Multicast, keine Netzwerk/Host Hierarchie + \item Class E: reserviert + \item Loopback: 127.xxx.xxx.xxx ist zum Testen reserviert, hierauf versendete Pakete werden als eingehende behandelt + \item Broadcast: alles 1en +\end{itemize} + +\subsection{IP-Adressierung} +\begin{itemize} + \item IPv4 Adresse: 32 Bit Identifier für Hosts oder Routinginterfaces + \item Interface: Verbindung zwischen Host und dem physischen Link. IP Adressen werden an das jeweilige Interface vergeben +\end{itemize} + +\subsection{CIDR: Classless Inter Domain Routing} +\begin{itemize} + \item Überwinden der Klassengrenzen durch Supernetting + \item ISPs können nun Class C Blocks zu einem großen Block zusammenfassen + \item "Longest match routing" auf maskierten Adressen + \item Beispiel: Alle in Europa vergebenen Adressen teilen sich einen gemeinsamen Prefix -> Nur ein Eintrag für alle Verbindungen nach Europa in den meisten amerikanischen Routern +\end{itemize} + +\subsection{NAT - Network Address Translation} +\begin{itemize} + \item Lokale Netzwerke haben nur eine der Außenwelt bekannte IP-Adresse, somit hat nicht jedes Gerät eine vom ISP bereitgestellte Adresse + \begin{itemize} + \item Möglichkeit intern Adressen zu vergeben ohne die Außenwelt informieren zu müssen + \item Wechsel des ISPs möglich, ohne intern Adressen zu verändern + \item Geräte im Netzwerk nicht von außen ansprechbar (Sicherheitsfaktor) + \end{itemize} + \item 16 Bit Portnummernfeld -> 60 000 simultane Verbindung mit nur einer einzigen LAN-Side Adresse +\end{itemize} + +\subsection{ICMP: Internet Control Message Protocol} +\begin{itemize} + \item Verwendet von Hosts und Routern um auf Netzwerkebene Informationen auszutauschen + \item In Netzwerkebenen oberhalb von IP werden ICMP Nachrichten als IP Datagramme versendet + \item ICMP Nachrichten: Typ, Code + erste 8 Bytes des den Fehler auslösenden IP-Datagramms +\end{itemize} + +\subsection{IPv6} +\begin{itemize} + \item Header mit 40 Byte Größe (also 20 Byte mehr als bei IPv4 mit 32 Bit Adressen) + \item Fragmentierung ist nicht mehr erlaubt + \item Headerformat hilft bei schneller Verarbeitung und Weiterleitung + \item Checksummen -> komplett entfernt + \item Optionen -> Erlaubt, aber außerhalb des Headers + \item ICMPv6 -> Zusätzliche Nachrichtentypen + Multicastgruppenmanagementfunktionen +\end{itemize} + +\subsubsection{IPv6 Header} +\begin{itemize} + \item Priority: Signalisiert die Priotität der Datagramme im Fluss + \item Flow Label: Identifiziert Datagramme im selben Fluss + \item Next Header: Identifiziert das Layer der höheren Schicht für Daten +\end{itemize} + +\subsection{Routing Algorithmen} +\begin{itemize} + \item Ein Router führt einen Routingalgorithmus aus, um zu entscheiden, an welchem Ausgang ein eingehendes Paket weiter übertragen werden sollte. + \begin{itemize} + \item Verbindungsorientiert: nur beim Verbindungsaufbau + \item Verbindungslos: entweder für jedes Paket oder periodisch ausgeführt + \end{itemize} + \item Oftmals unter Verwendung von Metriken -> Zuweisung eines Kostenfaktors an jeden Link, bspw. Anzahl an Hops, Kosten eines Links,… + \item Zwei grundlegende Typen existieren: + \item \begin{itemize} + \item Nichtadaptive Routingalgorithmen: Nehmen keine Rücksicht auf aktuellen Netzwerkzustand (z.B. Fluten) + \item Adaptive Routingalgorithmen: Berücksichtigen aktuellen Netzwerkzustand (z.B. Distanzvekotrrouting, Link State Routing) + \end{itemize} +\end{itemize} +\begin{description} + \item[Fluten] jedes eingehende Paket wird auf jede ausgehende Linie geschickt, außer auf die Herkunftslinie + \item[Zufallsrouting] Jedes ankommende Paket wird auf einen zufälligen Ausgang geschickt, außer auf den Quellausgang -> es bahnt sich seinen Weg sozusagen durch den Router + \item[Adaptive Routingalgorithmen] \ + \begin{description} + \item[Zentralisiertes adaptives Routing] Anpassen an die vorherrschende Verkehrslast; Ein Routingkontrollcenter muss ins Netzwerk eingebaut sein, welches periodisch den Linkstatus der Router erhält und kürzeste Routen berechnet und diese an die Router sendet + \item[Isoliertes adaptives Routing] benötigt keinen Informationsaustausch zwischen Routern; Routingentscheidungen werden nur anhand der Informationen des lokalen Routers getroffen, wie bei Hotpotato oder Rückwärtslernen + \item[Verteiltes adaptives Routing] Router tauschen periodisch Infos aus und aktualisieren Weiterleitungstabellen; Finde einen guten Pfad durch das Netzwerk, welcher einen von der Quelle zum Ziel führt; Graphabstraktion für Routingalgorithmen mit Linkkosten und Pfadkosten + \end{description} +\end{description} + +\subsection{Distanzvektorrouting Algorithmen} +\begin{description} + \item[Iterativ] Läuft bis keine Knoten mehr Informationen austauschen. Selbstterminierend -> kein Stoppsignal + \item[Asynchron] Knoten müssen Informationen nicht getaktet austauschen + \item[Verteilt] Jeder Knoten kommuniziert nur mit seinem direkten Nachbarn + \item[Distanztabellendatenstruktur] Jeder Knoten hat seine eigene Spalte für jedes mögliche Ziel und Zeile für jeden direkt angeschlossenen Nachbarknoten +\end{description} + +\subsubsection{Vergleich zwischen Link-State und Distanzvektoralgorithmen} +\begin{itemize} + \item Nachrichtenkomplexität: + \begin{itemize} + \item LS: mit N Knoten und E Links werden $O(n-e)$ Nachrichten versandt + \item DV: Austausch nur zwischen Nachbarn + \end{itemize} + \item Konvergenzgeschwindigkeit + \begin{itemize} + \item LS: $O(n^2)$ Algorithmus benötigt $O(N-E)$ Nachrichten (teils mit Oszillation) + \item DV: Konvergenzzeit variiert (Routingschleifen, Count to Infinity Problem, Oszillation) + \end{itemize} + \item Robustheit: (im Falle eines Routerausfalls) + \begin{itemize} + \item LS: Ein Knoten kann falsche Linkkosten ausgeben; Jeder Knoten berechnet nur seine eigene Tabelle + \item DV: DV Knoten kann falsche Gewichte ausgeben; Jede Tabelle wird nun noch von anderen Routern verwendet -> Fehler breiten sich über das ganze Netzwerk aus + \end{itemize} +\end{itemize} + +\subsection{Routing im Internet - Autonome Systeme} +Das globale Internet besteht aus miteinander verbundenen AS +\begin{description} + \item[Stub AS] kleine Unternehmen (ein Link zum Internet) + \item[Multihomed AS] große Unternehmen (mehrere Links, ohne Transitverkehr) + \item[Transit AS] Netzbetreiber +\end{description} +Zwei Level Routing: +\begin{description} + \item[Intra-AS] Administrator verantwortlich für die Auswahl (RIP, OSPF, IGRP) + \item[Inter-AS] Einheitlicher Standard (BGP) +\end{description} + +\subsection{Intra-AS und Inter-AS Routing} +\begin{itemize} + \item Policy: + \begin{itemize} + \item Inter AS: Admin möchte Kontrolle über sein Netz haben + \item Intra AS: ein einziger Admin, also keine Policyentscheidungen nötig + \end{itemize} + \item Skalierbarkeit: Hierarchisches Routing spart Tabellenplatz und sorgt für weniger Updateverkehr + \item Performance: + \begin{itemize} + \item Inter-AS: Policy wichtiger als Performance + \item Intra-AS: Performance als oberstes Gut + \end{itemize} +\end{itemize} + + +\section{Transport Layer} +\subsection{Multiplexing und Demultiplexing} +Hosts verwenden IP-Adressen und Portnummern um Segmente an korrekte Sockets zuzustellen +\begin{description} + \item[Multiplexing auf Sendeseite] Sammeln von Daten an mehreren Sockets, verpacken der Daten mit Header zum Demultiplexing + \item[Demultiplexing auf Empfangsseite] Zustellen empfangener Segmente an den korrekten Socket +\end{description} +\begin{description} + \item[Verbindungslos (UDP)] Erstelle Sockets mit Portnummern; Sockets werden übber Zweiertupel aus Ziel IP und Ziel Port identifiziert + \item[Verbindungsorientiert (TCP)] TCP Sockets werden durch ein Vierertupel aus Quell-IP, Quellport, ZielIP und Zielport identifiziert +\end{description} + +\subsection{verbindungsorientierte Kontrolle} +Connect $\rightarrow$ Data $\rightarrow$ Disconnect +\begin{itemize} + \item T-Connect.Request(Zieladr., Quelladr) + \item T-Connect.Indication(Zieladr., Quelladr.) + \item T-Connect.Response(Antwortadresse) + \item T-Connect.Confirmation(Antwortadresse) +\end{itemize} +CR (Connection Request) oder CC (Connection Confirm) TPDU + +\subsection{Drei Wege Handshake} +\begin{itemize} + \item Verbindung wird Aufgabaut, sobald beide Verbindungsaufbau TPDUs bestätigt wurden + \item Benötigt zusätzliches ACK (Acknowledgement) oder DT (Data) + \item Packe hierzu eine Sequenznummer in die CR, ACK, CC, DATA TPDUs + \item Muss durch die Gegenseite kopiert werden, und erlaubt den Verbindungsaufbau nur dann, wenn die korrekte Nummer bereit gestellt wird. Verwende Sequenznummern deshalb möglichst nicht schnell hintereinander erneut. +\end{itemize} + +\subsection{Verbindunsabbau} +\begin{description} + \item[implizit] Abbau der Netzwerklayerverbindung + \item[explizit] Verbindungsfreigabe mit Disconnect-TPDUs +\end{description} +Kann den Verlust von nicht bestätigten Daten nach sich ziehen, TCP verhindert dies, indem alle gesendeten PDUs vor Beenden der Verbindung bestätigt werden müssen + + +\section{Flusskontrolle} +\subsection{Pufferallokation} +\begin{itemize} + \item Flusskontrolle abhängig von der Puffermöglichkeit + \item Um ausstehdene Pakete zu unterstützen müssen diese entweder sofort und in korrekter Reihenfolge beim Empfänger ankommen, oder es muss genügend Puffer vorhanden sein + \item Empfänger verlangsamt den Sender oder Anforderung von Pufferspeicher durch den Sender + \item Mitteilung des Empfängers an den Sender, dass nur noch so viel Puffer verfügbar ist (bei Sliding Window einfach das Sendefenster anpassen) +\end{itemize} + +\subsection{Continue und Stop} +Einfachste Lösung: Sende Stopnachrichten wenn der Empfänger nicht schritthalten kann und Continue, sobald wieder Ressourcen vorhanden sind. \ +Beispiel: XON/XOFF: funktioniert aber nur bei Fullduplexverbindungen. + +\subsection{Implizite Flusskontrolle} +Idee: Halte ACKs oder NACKs zurück, um den Sender zu verlangsamen, somit werden Fehlerkontrollmechanismen nun zur Flusskontrolle missbraucht werden.\ +Nachteil: Senderseitig keine Unterscheidung mehr möglich, ob Pakete verloren gingen, oder er verlangsamt werden soll, was in unnötigen Wiederholungsübertragungen resultiert. + +\subsection{Kreditbasierte Flusskontrolle} +Der Empfänger gewährt dem Sender expliziten Kredit, sodass dieser meherere Pakete senden kann. Ist der Kredit aufgebraucht, so muss der Sender warten, bis er wieder neuen zugeteilt bekommt. Hierbei benötigen wir Fehlerkontrolle um auf verlorene Kreditnachrichten resultieren zu können + +\subsection{Permits und Acknowledgements} +\begin{itemize} + \item Permits = Empfänger hat Pufferspeicher, sende also weiter + \item Acknowledgements = Empfänger hat Anzahl X an Paketen empfangen + \item Kombinierbar mit dynamisch wachsendem Pufferplatz beim Emfänger (Beispiel TCP) +\end{itemize} + +\section{Staukontrolle} +Jedes Netzwerk kann nur eine gewisse Anzahl an Traffic pro Zeit transportieren, wenn nun mehr Traffic von den Quellen ausgeht, als das Netzwerk als nominelle Kapazität hat, so kommt es zu Staukollapsen und verlorenen Paketen. Immer $\lambda$-in = $\lambda$-out (goodput)\ +Staukontrolle ist essentiell, um Schneeballeffekte zu vermeiden: Sobald ein Netzwerk einmal überladen ist, wird es Pakete verlieren. Nach Erkennung von Paketverlusten durch ein zuverlässiges Transportprotokoll, werden Pakete erneut übertragen, was die Last abermals erhöht +\begin{itemize} + \item Die Senderate jeder Quelle muss an die aktuelle Kapazität des Netzwerks angepasst werden + \item Staukontrolle ist ein globales Problem, da dies abhängig von allen Routern, Weiterleitungsdisziplinen, Lastinjektionenund so weiter ist. + \item Flusskontrolle wiederum ist ein lokales Problem: Die Quelle darf das Ziel nicht überlasten, also sind nur Ziel und Quelle involviert +\end{itemize} + +\subsection{Design/Aktions Optionen} +\begin{description} + \item[Open Loop] Designe das System von Beginn an so, dass es korrekt funktioniert und man keine Korrekturen zur Laufzeit vornehmen muss + \item[Closed Loop] Verwende Feedback, um zu erlauben, dass sich der Sender an die Situation anpasst + \item[Explizited Feedback] Die Stelle, an welcher der Stau auftritt informiert den Sender + \item[Implizites Feedback] der Sender extrahiert aus dem Netzwerkverhalten Informationen darüber, wie er sich verhalten sollte +\end{description} +\begin{itemize} + \item Erhöhen der Kapzität -> teuer, kurzfristig nicht umsetzbar + \item Reservierungen und Zugriffskontrolle - erlaube also keinen zusätzlichen Verkehr wenn das Netzwerk stark ausgelastet ist -> nur für schaltkreisbasierende Netzwerke verfügbar + \item Reduzierung der Last in kleiner Granularität -> Bringe einzelne Quellen dazu ihre Last zu reduzieren, sodass nichts terminiert werden muss (benötigt Feedback vom Netz: closed loop) + \item Verwerfen von Paketen -> Pufferplatz ist voll und alte Pakete werden verworfen. Für Medieninhalte sind neue wichtiger als alte Pakete +\end{itemize} + +\subsection{Choke Pakete} +Sobald ein Stau der Router einen Stau erkannt hat -> Sende Chokepakete. Chokepakete sagen dem Ziel, dass es seine Senderate verringern soll + +\subsection{Warnungsbits} +Sobald ein Router feststellt, dass er von Stau betroffen ist, setzt er ein Warnbit in allen Paketen die er verschickt -> Da das Ziel das Warnungsbit in sein ACK Paket aufnimmt, erfährt die Quelle vom Stau und kann ihre Sendeleistung minimieren. + +\subsection{Random Early Detection} +nutze verworfene Pakete als implizites Feedback, bereits bevor die Warteschlange voll ist, wirf also vorzeitig Pakete weg um Feedback zu geben. +Mit steigender Staubelastung am Router kann die Entwurfswahrscheinlichkeit erhöht werden + +\section{TCP} +\subsection{Drei Wege Handshake} +\begin{itemize} + \item Client sendet ein TCP SYN (SYN = 1, ACK = 0) an den Server -> spezifiziert initiale, nie benutzte Sequenznummer + \item Server erhält das SYN Paket und antwortet mit einem SYNACK (SYN = 1, ACK = 1) -> Server alloziert Puffer und spezifikation der initialen Sequenznummer des Servers + \item Der Client erhält das SYNACK und antwortet hierauf mit einem ACK (SYN = 0, ACK = 1), hier können nun erstmals Daten enthalten sein +\end{itemize} +Terminieren einer Verbindung +\begin{itemize} + \item Client sendet ein TCP FIN + \item Server empfängt das FIN, antwortet mit einem ACK und sendet ebenfalls ein FIN + \item Client erhält ein FIN Segment, antwortet darauf mit ACK und geht in timed Wait Zustand, antwortet auf alle FINs mit ACKs + \item Server erhält ein ACK, die Verbindung ist geschlossen +\end{itemize} + +\subsection{Sende- und Empfangspuffer} +\begin{itemize} + \item Sender: Puffer um Fehlerkontrolle bereit zu stellen + \item Empfänger: Zwischenspeichern von noch nicht abgerufenen, oder nicht reihenfolgegetreu angekommenen Paketen +\end{itemize} +\subsection{Flusskontrolle: Angebotenes Fenster} +Der Empfänger kann seine Empfangpufferkapazitäten verkünden + +\subsection{Nagles Algorithmus - Selbsttaktung und Fenster} +\begin{itemize} + \item TCP Selbsttaktung: Ankunft eines ACKs ist ein Zeichen dafür, dass neue Daten auf das Netzwerk geschickt werden können + \item falls sowohl angebotene Daten und das angebotene Fenster >= MSS -> Sende ein volles Segment + \item falls unbestätigte Daten auf dem Weg sind, so puffere neue Daten bis das MSS voll ist, + \item andernfalls schicke die Daten sofort +\end{itemize} + +\subsection{Staukontrolle} +\begin{itemize} + \item Implizites Feedback durch verworfene Pakete. Annahme: Stau als Hauptgrund für verworfene Pakete + \item Fensterbasierte Staukontrolle: TCP führt Buch über die Anzahl an Bytes die es noch in das Netzwerk injezieren darf, diese Fenstergröße kann wachsen oder schrumpfen +\end{itemize} + +\subsection{AIMD - Sägezahnmuster der Last} +\begin{itemize} + \item TCP verwendet AIMD, also additive increase, multiplicative decrease Taktik + \item Es wird also kontinuierich auf zusätzliche Bandbreite geprüft und durch die Erhöhung der Bandbreitengrenze wird das Netzwerk regelmäßig die multiplikative Verringerung ausführen -> Sägezahnmuster +\end{itemize} + + +\section{Application Layer} +\subsection{HTTP Statuscodes} +\begin{itemize} + \item 200 OK - Anfrage okay, das angefragte Objekt folgt + \item 301 Moved Permanently - das angefragte Objekt wurde verschoben, der neue Pfad folgt + \item 400 Bad Request - Anfrage wurde nicht verstanden + \item 404 Not Found - angefordertes Objekt konnte auf dem Server nicht gefunden werden + \item 505 HTTP Version not supported +\end{itemize} + +\subsection{Cookies} +\begin{itemize} + \item Cookieheaderzeile in der Antwort + \item Cookieheaderzeile in der Anfrage + \item Die Cookiedatei wird auf dem Rechner des Hosts gespeichert und vom Browser verwaltet + \item Speichern der Cookieinformationen in einer Backenddatenbank der Webseite +\end{itemize} + +\subsection{Webcaches (Proxyserver)} +Bedienen der Clientanfrage ohne den urpsrünglichen Webserver dabei zu involvieren +\begin{itemize} + \item Der Nutzer stellt den Browser so ein, dass dieser über einen Cache auf das Netz zugreift + \item Alle Anfragen des Browsers gehen zuerst an den Cache, hat er das angefragte Material, so wird er dieses an den Client schicken, oder andernfalls beim Webserver besorgen und dem Client dann weiterleiten + \item Der Cache agiert sowohl als Client als auch als Server + \item Reduzieren von Antwortzeiten für Clientanfragen + \item Reduzieren von Verkehr auf dem Zugangslink des ISPs + \item Ein Internet voller Caches erlaubt es armen Anbietern effektiv Inhalte zu übertragen +\end{itemize} + +\subsection{Webserver} +\subsubsection{Grundlegende Webserveraufgaben} +\begin{itemize} + \item Zum Empfang von Anfragen bereitmachen + \item Annehmen von Verbindungen und Anfragen + \item Lesen und Verarbeiten von Anfragen + \item Antworten auf Anfragen + \item Bereitmachen und Annehmen von Anfragen +\end{itemize} +\begin{enumerate} + \item Prozessmodell + \begin{itemize} + \item Einem Prozess werden alle benötigten Schritte zugewiesen, welche benötigt werden, um eine Anfrage zu bearbeiten + \item Wenn die Bearbeitung abgeschlossen ist, so ist der Prozess wieder in der Lage neue Verbindungen zu akzeptieren + \item Typischerweise werden mehrere Prozesse benötigt + \item Ein Prozess blockiert, beispielsweise read(), dann entscheidet das OS, welcher Prozess als nächstes ausgeführt werden darf + \item Die Parallelität wird durch die Anzahl an Prozessen limitiert + \item Vorteile: Synchronisation dem Prozessmodell inhärent; Absicherung zwischen Prozessen + \item Nachteile: Langsam; Schwere Ausführbarkeit von Operationen, welche auf globalen Informationen beruhen + \end{itemize} + \item Threadmodell + \begin{itemize} + \item Verwende Threads anstelle von Prozessen + \item Vorteile: Schneller als Prozesse; Teilen standardmäßig aktiv + \item Nachteile: Benötigt OS Unterstützung; Kann per Prozess Limitierungen überlasten; Beschränkte Kontrolle über Schedulingentscheidungen + \end{itemize} + \item In-Kernel Modell + \begin{itemize} + \item möglich: ganzer Server im Kernel + \item Meist: nur statische Dateien werden vom Kernel bedient, andere Anfragen gehen an den regulären User-Space-Server + \item Dedizierter Kernelthread für HTTP Anfragen + \item Vorteile: Vermeidet das Kopieren von und in den Userspace; Sehr schnell, solange es eng in den Kernel integriert ist + \item Nachteile: Bugs können das OS, also die ganze Maschine crashen; Schwer zu debuggen und zu Erweitern; Inhärent OS-spezifisch + \end{itemize} + \item Eventbasiertes Modell + \begin{itemize} + \item Verwenden eines einzelnen Webserverprozesses um mehrere Anfragen zu behandeln + \item Vorteile: Sehr schnell, kein Kontextwechsel; Inhärentes Teilen ohne Locks; Komplette Kontrolle über die Schedulingentscheidungen; Kein komplexer OS-Support benötigt + \item Nachteile: Per-Prozess Begrenzungen; Nicht jedes OS mit voll asynchroner E/A, so können beim Lesen immernoch Blockierungen entstehen; Flash verwendet immerhin Hilfsprozesse um dies zu verhindern + \end{itemize} +\end{enumerate} + +\subsection{Mailzugriffsprotokolle} +\begin{description} + \item[SMTP] Zustellen/Speichern auf dem Empfangsserver + \item[POP] Post Office Protocol: Autorisierung und Download; POP3 ist zustandlos über mehrere Sitzungen + \item[IMAP] Internet Mail Access Protocol: Mehr Features aber komplexer; Behält alle Nachrichten am Server + \item[HTTP] Yahoo Mail, Hotmail, etc. +\end{description} + +\subsection{DNS - Domain Name System} +verteilte Datenbank implementiert in der Hierarchie von vielen verschiedenen Nameservern +Anwendungsschichtprotokoll für Hosts, Router und Nameserver zum Kommunizieren zur Namensauflösung + +\section{Sicherheit} +\subsection{Sicherheitsziele} +\begin{description} + \item[Vertraulichkeit] Verschickte oder gespeicherte Daten sollen nur einem bestimmten Nutzerkreis zugänglich sein; Vertraulichkeit von Instanzen wird auch als Anonymität bezeichnet + \item[Datenintegrität] Es sollte möglich sein, jede Veränderung von Daten zu erkennen, dies benötigt unter anderem, die Möglichkeit den Ersteller von Daten identifizieren zu können + \item[Verantwortlichkeit] Es sollte möglich sein, eine Instanz zu identifizieren, welche für irgendein Kommunikationsereignis zuständig ist + \item[Verfügbarkeit] Dienste sollten verfügbar sein und auch funktionieren + \item[Kontrollierter Zugriff] Nur autorisierte Instanzen solle in der Lage sein auf bestimmte Dienste oder Daten zuzugreifen +\end{description} +\subsection{Bedrohnungen technisch definiert} +\begin{description} + \item[Maskerade (Spoofing)] Eine Instanz behauptet jemand Anderes zu sein + \item[Abhören (Sniffing)] Jemand versucht Daten zu lesen, welche er nicht lesen darf und soll + \item[Autorisierungsverletzungen] Eine Instanz verwendet Ressourcen die sie nicht verwenden darf + \item[Verlust oder Veränderung von übertragener Information] Veränderung oder Zerstörung von Daten + \item[Fälschung von Daten] Eine Instanz erzeugt Daten im Namen einer Anderen + \item[Abstreiten von Kommunikationsereignissen] Eine Instanz streitet seine Beteiligung an einem Kommunikationsereignis ab + \item[Sabotage] Jede Art von Aktion welche darauf abzielt, die Verfügbarkeit oder korrekte Funktion von Diensten zu reduzieren +\end{description} +\subsection{Sicherheitsanalyse von gelayerten Protokollarchitekturen} +Dimension 1: Auf welchem Interface findet der Angriff statt?\ +Dimension 2: Auf welchem Layer findet der Angriff statt? +\subsection{Sicherheitsmechanismen} +\begin{description} + \item[Physische Sicherheit] Abschließen der Betriebsräume, Zutrittskontrolle; Schutz vor Überwachung der Umgebung + \item[Personelle Sicherheit] Sensitivität bei Mitarbeitern erzeugen; Überprüfung der Angestellten; Sicherheitstraining + \item[Administrative Sicherheit] Kontrollieren neuer Software; Prozeduren um Sicherheitsverstöße zu erkennen; Ansehen und Reagieren auf Audittrails + \item[Ausstrahlungssicherheit] Steuerung von Frequenzen und anderer elektromagnetischer Ausstrahlungen + \item[Mediensicherheit] Kontrollieren der Erstellung, Reproduktion und Zerstörung von Informationen; Scannen von Medien auf Schadsoftware + \item[Lifecyclekontrollen] Vertrauenswürdiges Systemdesign der Implementierung, Evaluation und Unterstüzung; Dokumentierung; Einhalten von Programmierstandards + \item[Computersicherheit] Schutz der Informationen, während diese auf Rechnern gespeichert oder verarbeitet werden; Schutz der Rechner selbst + \item[Kommunikationssicherheit] Schutz der Informationen beim Transport von einem zum anderen System; Schutz der Kommunikationsinfrastruktur an sich +\end{description} +\subsection{Sicherheitsdienste} +\begin{description} + \item[Authentisierung] Grundlegender Sicherheitsdienst, welcher sicherstellt, dass eine Instanz tatsächlich die Identität hat, welche sie vorgibt zu haben + \item[Integrität] Kleiner Bruder der Authentisierung, da er sicherstellt, dass Daten, welche von einer gewissen Einheit erstellt worden sind, nicht ohne Erkennung verändert werden können + \item[Vertraulichkeit] Stellt sicher, dass die geschützen Daten geheim bleiben + \item[Zugriffskontrolle] Kontrolliert, dass jede Identität nur auf die Informationen und Dienste zugreift, zu welchen sie auch zugriffsberechtigt ist + \item[Nicht Ablehnung] Schütz davor, dass andere Einheiten nach einer Kommunikation behaupten können, nie daran teilgenommen zu haben +\end{description} + +\subsection{Wichtige Eigenschaften von Verschlüsselungsalgorithmen} +Fehlerausbreitung: Charakterisiert die Effekte von Bitfehlern während der Übertragung von Ciphertext zum rekonstruierten Klartext\ +Synchronisation: Charakterisiert die Effekte von verlorenen Ciphertexten auf den rekonstruierten Klartext + +\subsection{Sicherheitsziele von IPSec} +\begin{description} + \item[Datenherkunftsauthentisierung/Datenintegrität] maskierte Quell- oder Zieladresse zu versenden, Pakete während der Übertragung zu verändern, gespeichertes Paket zu späterem Zeitpunkt zu versenden soll unmöglich sein (dass der Empfänger dies nicht merkt) + \item[Vertrauenswürdigkeit] Es soll nicht möglich sein, den Inhalt der IP Datagramme auszuspähen; Es soll weiterhin eine begrenzte Traffic Flow Confidentiality geben + \item[Sicherheitsrichtlinie] Sender, Empfänger und zwischenliegende Knoten sollen erkennen können, ob ein Paket ihrer Sicherheitsrichtlinie entspricht und dieses gegebenenfalls verwerfen +\end{description} + + +\subsection{Pakete} +\subsubsection{DHCP} +DHCP Discover an Broadcast (255.255.255.255), Server sendet DHCP Offer zurück mit Payload, DHCP Request (gleich wie Discover)\\ + +DHCP: Discover/Offer/Request/ACK\\ +UDP/TCP: SrcPort \& DstPort\\ +IP: SrcIP \& DstIP\\ +MAC: SrcAddr \& DestAddr\\ +Payload: (optional) + +\subsubsection{ARP} +ARP-Request/Response:\ + ARP: ARP-Request Payload: XXXX\\ + MAC: SrcAddr XXXX DestAddr XXX + +\subsubsection{DNS} +(A-Records bilden URL auf IP ab)\\ +DNS: DNS Query "A random.org"/ DNS Response "A random.org 123.45.67.890"\\ +UDP/TCP: SrcPort \& DstPort\\ +IP: SrcIP \& DstIP\\ +MAC: SrcAddr \& DestAddr + +\section{Ports} +\begin{tabular}{l| l} + UDP DHCP & 67/68 \\ +FTP & 21 \\ +SSH & 22 \\ +Telnet & 23 \\ +SMTP & 25 \\ +DNS & 53 \\ +IMAP & 143 \\ +IMAP TLS/SSL & 993 \\ +Non-privileg & >1023 \\ +\end{tabular} + + +\newpage +\section{Begriffe} +\begin{description} + \item[Simplex] nur ein Nutzer kann immer senden + \item[Half Duplex] beide Nutzer senden abwechselnd (Time Division Duplex) + \item[Full Duplex] beide Nutzer senden gleichzeitig (Frequency/Time Division Duplex) + \item[Circuit Switching] einfach; einmal aufgesetzt verbleiben die Ressourcen beim Nutzer; Circuit muss hergestellt werden, bevor kommuniziert werden kann + \item[Packet Switching] Aufteilen von Daten in kleinere Pakete die nach und nach gesendet werden; Problem: Informationen zu Sender/Empfänger und Start/Endzeitpunkt eines Pakets müssen mit übermittelt werden; Wird deshalb 'Store and Forward' Netzwerk genannt + \item[Broadcast Medium] Nur ein Sender zu jeder Zeit; Zugriffskontrolle (MUX o. Absprache) + \item[Baudrate] beschreibt die Anzahl der Symbole welche innerhalb einer Zeiteinheit übertragen werden; Symbolrate * Informationsgehalt je Symbol + \item[Protokoll] Protokolle sind Regelsätze, welche beschreiben wie zwei oder mehr entfernte Teile (peers oder protocol entities) eines Layers kooperieren, um den Dienst des gegebenen Layers zu implementieren. Ein Protokoll ist die Implementierung eines Services + \item[Signale] sind die physische Repräsentation von Daten in der Form einer charakteristischen Variation in Zeit oder Ausbreitung… + \item[Delay d] = distance / speed v + \item[Strict Layering] Jedes Layer verwendet nur den Service des darunter liegenden Layers + \item[Hammingdistanz] Anzahl an Stellen an denen sich zwei Frames x und y in binärer Darstellung unterscheiden lösbar mittels (x XOR y). + \item[Fehlerkontrolle vorwärts] Sender sendet redundante Infos so, dass der Empfänger selbst ausbessern kann + \item[Fehlerkontrolle rückwärts] Sender sendet redundante Infos so, dass der Empfänger fehlerhafte Pakete wahrscheinlich erkennt und Pakete in dem Fall nochmal verschickt werden können + \item[Burst Traffic] + \item[Broadcastkanal] Völllig dezentralisiert und so einfach wie möglich mit Rate b/s + \item[Statisches Multiplexing] einzelne Ressource statisch gemultiplext durch feste Sendezeiten und mehrere Frequenzbänder + \item[Polling] Masterknoten läd Slaveknoten zum Übertragen in Reihenfolge ein + \item[Tokenweitergabe] Kontrolltoken wird von einem zum anderen Knoten übertragen + \item[Hub] Eingehende Bits werden an alle Ausgänge mit selber Rate und ohne Puffern verteilt; Kein CSMA-CD am Hub; Alle verbundenen Kabel formen eine Kollisionsdomäne + \item[Switch] nicht nur eine einfache elektrische Verbindung für sternförmige Topologie; Switches enthalten Puffer, welche direkt ankommende Pakete zwischenspeichern, bevor sie diese weiterleiten + \item[Repeater] Physical Layer Gerät, verbindet zwei Kabel und verstärkt die ankommenden Signale und leitet dieses weiter; Versteht den Inhalt der Pakete nicht und interessiert sich nicht dafür + \item[Bridge] Jedes mit einer Bridge verbundene Netzwerk ist eine eigene Kollisionsdomäne und auch verschiedene LAN-Typen können miteinander verbunden werden + \item[Effizienz] Definiert als die Rate der Zeit, in welcher der Sender neue Informationen sendet (für den fehlerfreien Kanal) + \item[Bustoplogie] Alle Geräte sind an einem Kabel angebunden und sind in einer Kollisionsdomäne + \item[Sterntopologie] einfachere automatische Verwaltung und Wartung bei fehlerhaften Adaptern + \item[Spannbaum] Gegeben sei ein Graph G=(V,E), ein Spannbaum T = (V,E-T) ist ein Subgrap von V, wobei E-T ein Teil von E ist, welcher ein Spannbaum, der verbunden und azyklisch ist. + \item[Weiterleiten] Bewege Pakete vom Routereingang auf den entsprechenden Ausgang + \item[Routing] Berechnen der Route, die die Pakete von Quelle bis zum Ziel gegangen sind + \item[DHCP] Dynamic Host Configuration Protocol. beziehe die Adresse dynamisch von einem Server + \item[ARP] Adress Resolution Protocol Broadcast auf das LAN, mit der Frage, welcher Node IP X.X.X.X hat -> Antwort des Nodes mit der MAC-Adresse -> Zustellung möglich + \item[Hot Potato Routing] Wenn ein Paket ankommt, so leite es auf schnellste Art und Weise an den Ausgang mit der kleinsten Ausgangswarteschlange, ganz egal wohin dieser Ausgang dann führt + \item[Rückwärtslernen (Routing)] Paketheader enthalten wichtige Infos, wie Quelle, Ziel, Hopzähler -> Netzwerkknoten lernen etwas über die Netzwerktopologie während sie Pakete behandeln + \item[RIP] Routing Information Protocol. Distanzvektoralgorithmus mit Hops als Metrik. Falls nach 180s kein Advertisement empfangen wurde, so deklariere den Nachbarn als tot + \item[BGP] Border Gateway Protocol. Routerpaare tauschen Routinginformationen über semipermanente TCP Verbindungen aus + \item[OSPF] Open Shortes Paths First. annocieren nun keine Wege sondern Linkzustände mit je einem Eintrag pro Nachbarknoten + \item[Poisoned Reverse] Wenn Z durch Y routet um zu X zu gelangen: Z sagt Y, dass seine eigene Distanz zu X unendlich ist (somit routet Y nicht über X nach Z) + \item[Link State Routing] Berechnung des kleinsten Kostenpfades von einem Knoten S zu allen andern Knoten V erzielt durch den Link-State-Broadcast + \item[Gateway Router] Spezielle Router innerhalb des AS, führen das Intra-AS Routingprotokoll mit allen anderen Routern im AS aus. Zusätzlich verantwortlich für das Routing an exteren Ziele -> Inter-AS Routingprotokolle mit anderen Gatewayroutern + \item[Unicast] Ein Sender, ein Empfänger + \item[Multicast] Ein Sender, eine Gruppe von Empfänger + \item[Broadcast] Ein Sender, alle Teilnehmer eines Netzes + \item[TCP] Zuverlässige, in-Order Zustellung, Stau- \& Flusskontrolle, Verbindungsaufbau + \item[UDP] Unzuverlässige, ungeordente Zustellung, Einfache Erweiterung des best Effort IP Ansatzes + \item[RTT] Round Trip Time: Benötigte Zeit um ein kleines Paket so zu senden, dass es vom Client zum Server und zurück geschickt wird. + \item[CSMA] Carrier Sense Multiple Access + \item[CSMA/CD] + Collision Detection + \item[CSMA/CA] + Collision Avoidance + \item[HTTP] Hyper Text Transfer Protocol; Das Anwendungsnachrichtenprotokoll des Webs + \item[Nichtpersistentes HTTP] höchstens ein Objekt wird über die TCP Verbindung verschickt + \item[Persistentes HTTP ] Mehrere Objekte können über eine TCP Verbindung zwischen Client und Server ausgetauscht werden + \item[Server] ständig eingeschaltet und mit permanenter IP-Adresse; Serverfarmen zur Skalierung + \item[Client] Kommunizieren zeitweise mit Server; Können dynamische IP-Adressen haben; Kommunizieren nie direkt miteinander + \item[Peer to Peer] Ohne ständig eingeschalteten Server. Beliebige Endsysteme kommunizieren direkt miteinander, sind dabei zeitweise verbunden und haben wechselnde IP Adressen. + \item[POST Methode] Webseiten beinhalten oft Formulareingaben, die Eingabe wird dann im Entity Body an den Server geschickt + \item[URL Methode] Verwendet die GET Methode; Die Eingaben werden im URL Feld der Requestline hochgeladen + \item[FTP] File-Transfer-Protokoll: Dateitransferprotokoll, Übertrage Daten von und zum Server + \item[Mail Useragent] Erlaubt das Schreiben, Lesen und Bearbeiten von Nachrichten; Ein- und ausgehende Nachrichten werden auf einem Server gespeichert + \item[Mailserver] Die Mailbox beinhaltet eingehende Nachrichten, die Nachrichtenschlange die ausgehenden Nachrichten + \item[SMTP] Mailübertragungsprotokoll: Verwendet TCP um Nachrichten zuverlässig vom Client zum Server zu übertragen, verwendet Port 25; Direkte Übertragung vom Sender zum Empfänger + \item[IMAP] Internet Message Access Control + \item[MIME] Multimedia Mail Extensions: Zusätzliche Zeilen im Nachrichtenheader deklarieren den MIME Inhaltstyp + \item[TLP Server] Top Level Domain Server: Verantwortlich für .com, .org, .net, .edu und die Landesdomains + \item[Authorative DNS Server] DNS Server einer Organisation, stellen den authorativen Hostnamen für das IP Mapping der Organisationsserver + \item[Lokal DNS Server] Jeder ISP hat einen eigenen; Wenn ein Host eine DNS Anfrage stellt, so wird die Frage zuerst zum lokalen DNS Server gesendet (fungiert also als ein Proxy) + \item[Ressource Records (RR)] in DNS Datenbank; Format: (name, value, type, ttl) + \item[P2P Filesharing] Ein Peer ist sowohl ein Webclient als auch ein transienter Webserver; Alle Peers sind Server -> Hoch Skalierbar; Dateiübertragung ist dezentralisiert, die Lokalisierung findet allerdings zentral statt. + \item[Socket] Ein lokal auf dem Host laufendes, von einer Anwendung erstelltes, OS-kontrolliertes Interface, durch welches ein Anwendungsprozess sowohl Nachrichten vom und zu anderen Anwendungsprozessen Senden, als auch Empfangen kann. + \item[Bedrohnung] Eine Bedrohung in einem Kommunikationsnetzwerk ist jedes mögliche Ereignis oder eine Sequenz von Aktionen, welche zu einer Verletzung einer oder mehrerer Sicherheitsziele führen + \item[Kryptologie] Wissenschaft, die sich mit Kommunikation in sicherer und geheimer Art befasst + \item[Kryptographie] (graphein = schreiben): Die Lehre der Prinzipien und Techniken, durch welche Informationen in Ciphertext verpackt und später durch legitimierte Nutzer, wieder durch einen geheimen Schlüssel entschlüsselt werden können + \item[Kryptoanalyse] (analyein = etwas lösen): Die Wissenschaft und Kunst Informationen von Ciphern wiederherzustellen und dies ohne das Wissen über den Schlüssel zu schaffen + \item[Cipher] Methode eine Nachricht so zu transformieren, dass die Bedeutung nicht mehr erkannt werden kann + \item[Verschlüsseln von Daten] Transformiert Plaintext in Ciphertext um die Inhalte zu verschleiern + \item[Signieren von Daten] Berechnet einen Checkwert oder eine digitale Signatur zu einem gegebenen Plaintext oder Ciphertext, sodass dieser durch alle oder einige Instanzen mit Zugriff verifiziert werden kann + \item[Symmetrische Kryptographie] verwendet einen Schlüssel für Ver- und Entschlüsselung oder Signieren und Überprüfen + \item[Assymmetrische Kryptographie] verwendet zwei Schlüssel für Ver- und Entschlüsselung + \item[IPSec Authentication Header (AH)] Im Tunnelmodus stellt der Payload nochmals ein ganzes IP Paket dar; Wichtig: AH funktioniert nur in NAT freien Umgebungen + \item[IPSec Encapsulating Security Protocol (ESP)] Dem ESP Header folgt direkt ein IP Header oder ein AH-Header; Das next-header Feld vom vorhergehenden Header indiziert 50 für ESP + \item[Firewall] Eine oder eine Menge an Komponenten, welche den Zugriff zwischen einem geschützten Netzwerk und dem Internet oder zwischen einer Menge an Netzwerken beschränkt + \item[Paketfiltern/Screening] Die Aktion, welche ein Gerät ausführt, um selektiv den Fluss an Daten in und aus einem Netzwerk zu kontrollieren. Paketfiltern ist eine wichtige Technik um Zugriffskontrolle auf dem Subnetzwerklevel für paketorientierte Netzwerke zu implementieren + \item[Bastion Host] Ein Computer, welcher besonders gesichert werden muss, da er anfälliger für Angriffe ist, als andere Computer im Subnetz + \item[Dual Homed Host] Ein Computer mit > 2 Netzwerkinterfaces + \item[Proxy] ein Programm, welches sich im Auftrag interner Clients mit externen Servern beschäftigt. Proxies leiten genehmigte Clientanfragen an die Server, und die Antworten auch wieder an den Client weiter + \item[Network Address Translation (NAT)] eine Prozedur, durch welche ein Router die Daten in Paketen ändert um die Netzwerkadressen zu modifizieren; Dies erlaubt es die interne Netzwerkstruktur zu verschleiern + \item[Perimeternetzwerk] Ein Subnetz, welches zwischen einem externen und einem internen Netzwerk hinzugefügt wird, um eine weitere Sicherheitseben bereitzustellen; Ein Synonym hierfür ist DMZ (De Militarized Zone) + \item[QPSK] Quadrature Phase Shift Keying; Phasenverschiebung für Multiplexing + \item[Medium Access Control (MAC)] Verteilter Algorithmus, der bestimmt, wie Knoten auf ein geteiltes Medium zugreifen +\end{description} + +\end{multicols} + + +\section{Formeln} +\begin{multicols}{2} + Bitzeit $t_{Bit}=\frac{1}{Bitrate}$ + + Bitlänge $l_{Bit}=v_s * t_{Bit}$ + + Ausbreitungsverzögerung $d_{prop} = \frac{dist}{v_s}$ + + Übertragungszeit $d_{trans} = \frac{L}{R} = [\frac{bit}{s}]$ + + Ende-zu-Ende-Verzögerung $d_{e2e} = d_{prop} + d_{trans}$ + + Leitungsverm. Übertragung $t_L = \frac{L_{Nachricht}}{R}$ + + Nachrichtenver. Übertragung $t_N = (k + 1)\frac{L_{Nachricht}}{R}$ + + Paketver. Übertragung $t_{P} = (k + \frac{Laenge_{Nachricht}}{Laenge_{Pakete}})*\frac{L_{Packet}}{R} = (1+ \frac{k}{n})* \frac{L_{Nachricht}}{R}$ + + Kanalkap. Nyquist $R_{max} = 2* H * log_2n$ + + Kanalkap. Shannon $R_{max} = H* log_2(1+\frac{P_signalleistung}{P_rauschleistung})$ mit $r=10*log_{10}*{\frac{P_s}{P_n}}$ + + Bandwirth Delay + + Link Last + + LAN last + + Fehlerfrei Send and Wait $S = \frac{1}{(1+2a)}$ wobei $a = \frac{T_{prop}}{T_{trans}}$ + + Fehlerhaft Send and Wait $S = \frac{1-P}{1+2a}$ + + Fehlerfreies Sliding Window $S = {1, falls W >= 2a+1, W/(2a+1) sonst}$ + + Selective Reject $S = {1-P, falls W >= 2a+1, (W(1-P))/(2a+1) sonst}$ + + Go-Back-N $S = {\frac{1-P}{1+2aP}, falls W >= 2a+1, \frac{W(1-P)}{(2a+1)(1-P+WP)} sonst}$ + + Effizienz $\frac{T_{packet} }{ T_{packet} + d + T_{ack} + d}$ + + efficiency $\frac{1}{ (1+ 5 * \frac{t_{prop}}{t_{trans}}}$ + + Round Trip Time $EstimatedRTT = (1-a) * EstimatedRTT + a * SampleRTT$ + + ~ TCP Durchsatz $ 0,75 * \frac{W}{RTT}$ + + +\end{multicols} +\newpage + +\section{ISO/OSI - sehr nützliches Modell, keine existierenden Protokolle} +Jedes Layer nimmt Daten vom darüberliegenden Layer, fügt eine Headereinheit hinzu und erstellt eine neue Dateneinheit und schickt diese an das Layer darunter +\begin{tabular}{l | l | l} + PH & Physisches Layer & + Bietet eine bittransparente Schnittstelle zum physischen Medium\\ + &&Spezifiziert mechanische, elektrische, funktionale und prozedurale Mittel um die physische Verbindung zwischen zwei offenen Systemen zu unterstützen.\\ + &&In-sequence Zustellung der Bits ist sichergestellt\\ + &&Fehlererkennung ist manchmal inkludiert\\ + && Zeitliche Synchronisation (Non-Return to Zero Level oder Manchstercodierung)\\ + && Breitband- vs Basisbandübertragung (Amplituden-/Phasen-/Frequenzmodulation ) Bsp: QPSK, 16-QAM \\ + && Digital vs Analog \\ + \hline + L & Link Layer & + Unterstützt Übertragung von service data units (SDU) größer als "word" unter Systemen, welche über einen einzigen physischen Pfad verbunden sind.\\ + &&Essentielle Funktion ist block synchronization\\ + &&Im Fall von Halb-duplex oder multipoint links muss der Zugriff auf das Medium kontrolliert werden und Peersysteme müssen addressiert werden.\\ + && Framing durch Charakterzählen, Flagbitmuster/Bitstuffing oder Codeverletzung \\ + && Fehlererkennung \& -kontrolle (vorwärts/rückwärts) mit Redundanz (Parität), Hemmingdistanz, Cyclic Redundancy Check (CRC)\\ + && Send and Wait (Sliding Window) , Go-Back-N, Selective Reject \\ + && Verbindungsaufbau \& Flusskontrolle \\ + \hline + N & Network Layer & + Erschafft eine logischen Kommunikation zwischen offenen Systemen, welche verbunden sind mit verschiedenen Subnetworks\\ + &&Diese Netzwerkebene unterstützt Routing, also müssen sich N-Service Benutzer nicht um den Pfad kümmern\\ + &&Der N-Service ist uniform, unabhängig von der Variation an Subnetwork Technologien, Topologien, QoS und der Organisation\\ + &&Netzwerk Addresse = Endsystem Addresse\\ + \hline + T & Transport Layer & + logische Kommunikation zwischen zwei Prozessen/Nutzern, unabhängig von der Netzwerkstruktur\\ + &&Verschiedene Klassen von Protokollen mit verschiedenen Funktionalitäten sind festgelegt (connectionoriented/connectionless; reliable/unreliable)\\ + && Sendeseite: Segmentiert Anwendungsnachrichten und leitet diese Segmente an die Netzwerkschicht \\ + && Empfangsseite: Reassembliert Segmente in Nachrichten und leitet diese an die Anwendungsschicht weiter \\ + && Als Transportprotokolle werden im Internet hauptsächlich TCP und UDP verwendet \\ + && Fehlerkontrolle: Durch Sequenznummern, ACKs und Neuübertragungen\\ + && Flusskontrolle: Durch Inspizieren von ACKs und Permits\\ + && Staukontrolle: Durch das Verlangsamen des Senders, wenn Pakete oder ACKs verloren gehen\\ + \hline + S & Session Layer & + Unterstützt die Synchronisation des Dialogs und die Verwaltung des Datenaustausches\\ + &&Quarantine Data delivery - Eine ganze Gruppe von übertragenen S-SDUs wird zugestellt auf explizite Anfrage des Senders\\ + &&Interaktionsverwaltung erlaubt ausdrücklich festzulegen, welcher S-User das Recht bekommt zu übertragen\\ + &&Zurücksetzen der Verbindung auf vordefinierte Synchronisationspunkte\\ + \hline + P & Presentation Layer & + Unterstützt die Übersetzung von Daten und Datenstrukturen in einzigartige Repräsentation\\ + &&Ausschließlich die Syntax wird modifiziert um die Semantik beizubehalten\\ + &&Auswahl von einer der allgemein anerkannten Transfersyntax\\ + &&Die lokale Syntax von jedem Endsystem wird in oder von der ausgewählten Transfer Syntax übersetzt\\ + \hline + A & Application Layer & + Unterstützt den direkten Endnutzer durch die Bereitstellung einer Vielzahl an application services\\ + &&Genereller Typ (z.B. Entfernte prozedurale Anrufe, Transaktionsdurchführung,...)\\ + &&Spezifischer Typ (z.B. Virtuelles Terminal, Dateiübertragungszugriff und Verwaltung, Arbeitswechsel,...)\\ + &&Ein typisches Beispiel: virtuelles Terminal (Funktionen des reellen Terminals werden in virtuelle Funktionen gemappt)\\ +\end{tabular} + +\section{TCP/IP - nicht existentes Modell, sehr nützliches Protokoll} +\begin{tabular}{l | l} + Internetlayer & Packetswitching, Adressierung, Routing und Forwarding. Insbesondere für hierarchische Netze \\ + \hline + Transportlayer & zuverlässiger Bytestrom: TCP (Transport Control Protokoll) \\ + & unzuverlässiges Datagramm: UDP (User Datagramm Protokoll)\\ +\end{tabular} + +\section{UDP vs TCP} +\begin{tabular}{l | l} + UDP & TCP \\ \hline + minimalistisch & Punkt-zu-Punkt: Ein Sender, ein Empfänger \\ + Best Effort Dienst: Segmente können verloren gehen, nicht reihenfolgegetreu & Zuverlässiger, reihenfolgegetreuer Bytestrom \\ + Verbindungslos: Kein Handshaking und unabhängige Behandlung der Pakete & Pipelined: Staukontrolle und Flusskontrolle \\ + oftmals für das Streamen von Multimediainhalten & Sende und Empfangspuffer \\ + Überprüfung durch Checksummen & Vollduplex Daten: Bidirektionaler Datenfluss \\ + & Zuverlässsiger Datenverkehr benötigt eine Behandlung von Timeouts (RTT) \\ +\end{tabular} + \end{document} \ No newline at end of file diff --git a/Telematik 1.md b/Telematik 1.md index f6d98f9..8522e71 100644 --- a/Telematik 1.md +++ b/Telematik 1.md @@ -1,3566 +1,3566 @@ ---- -title: Telematik 1 -date: Sommersemester 2020 -author: Felix Husslein, Robert Jeutter ---- - -- [Kapitel 1: Kurze Übersicht](#kapitel-1-kurze-übersicht) - - [Unterschiede zwischen Telefon und Internet](#unterschiede-zwischen-telefon-und-internet) - - [Verbindungsarten:](#verbindungsarten) - - [Phyische Verbindungen (Arten)](#phyische-verbindungen-arten) - - [Größere Netzwerke](#größere-netzwerke) - - [Multiplexing](#multiplexing) -- [Kapitel 2: Architektur](#kapitel-2-architektur) - - [Verbindungsorientiert vs. Verbindungslos](#verbindungsorientiert-vs-verbindungslos) - - [Protokolle](#protokolle) - - [Protokollspezikiationen:](#protokollspezikiationen) - - [Layering: Vor- und Nachteile](#layering-vor--und-nachteile) - - [ISO/OSI Referenzmodell](#isoosi-referenzmodell) - - [Kritik am ISO/OSI Modell](#kritik-am-isoosi-modell) - - [Architekturvoraussetzungen für das Internet](#architekturvoraussetzungen-für-das-internet) - - [Grundlagen der Internetarchitektur](#grundlagen-der-internetarchitektur) - - [TCP/IP Referenzmodell](#tcpip-referenzmodell) - - [Kritik am TCP/IP Modell](#kritik-am-tcpip-modell) - - [ISO/OSI vs TCP/IP](#isoosi-vs-tcpip) - - [Standardisierung](#standardisierung) - - [ISO Standardisierverfahren](#iso-standardisierverfahren) - - [Zusammenfassung Kapitel 2](#zusammenfassung-kapitel-2) -- [Kapitel 3: Physikalisches Layer](#kapitel-3-physikalisches-layer) - - [Synchronisation](#synchronisation) - - [Vereinfachtes Konzept:](#vereinfachtes-konzept) - - [Breitband- vs. Basisbandübertragung](#breitband--vs-basisbandübertragung) - - [Breitbandübertragung](#breitbandübertragung) - - [Digitales vs. Analoges Signal](#digitales-vs-analoges-signal) - - [Zusammenfassung Kapitel 3](#zusammenfassung-kapitel-3) -- [Kapitel 4: Data Link Layer](#kapitel-4-data-link-layer) - - [Services des Link Layers](#services-des-link-layers) - - [Einfache Linklayerfunktionen (Übersicht)](#einfache-linklayerfunktionen-übersicht) - - [Framing](#framing) - - [Fehlerkontrolle](#fehlerkontrolle) - - [Verbindungsaufbau](#verbindungsaufbau) - - [Flusskontrolle](#flusskontrolle) - - [Framing](#framing-1) - - [Framing durch Zählen der Charakter](#framing-durch-zählen-der-charakter) - - [Framing durch Flagbitmuster/Bitstuffing](#framing-durch-flagbitmusterbitstuffing) - - [Framing durch Codeverletzungen](#framing-durch-codeverletzungen) - - [Fehlerkontrolle - Redundanz](#fehlerkontrolle---redundanz) - - [Parität](#parität) - - [Checksummen](#checksummen) - - [Hammingdistanz](#hammingdistanz) - - [Frame Mengen - Code Books, Code](#frame-mengen---code-books-code) - - [Cyclic Redundancy Check - CRC](#cyclic-redundancy-check---crc) - - [Rückwärtsfehlerkontrolle](#rückwärtsfehlerkontrolle) - - [Send and Wait](#send-and-wait) - - [Alternating Bit Protokoll](#alternating-bit-protokoll) - - [ARQ - Sliding Windows](#arq---sliding-windows) - - [Übertragungsfehler und Empfangsfenstergröße](#übertragungsfehler-und-empfangsfenstergröße) - - [Go-Back-N](#go-back-n) - - [Selective Reject / Selective Repeat](#selective-reject--selective-repeat) - - [Duplexoperation und Piggybacking](#duplexoperation-und-piggybacking) - - [Leistungsverhalten:](#leistungsverhalten) - - [Folgerung Kapitel 4](#folgerung-kapitel-4) -- [Kapitel 5: Medium Access Control (MAC)](#kapitel-5-medium-access-control-mac) - - [Einführung: Multiple Access Link und Protokolle](#einführung-multiple-access-link-und-protokolle) - - [Multiple Access Protokoll](#multiple-access-protokoll) - - [Broadcastkanal mit Rate R b/s](#broadcastkanal-mit-rate-r-bs) - - [Statisches Multiplexing](#statisches-multiplexing) - - [Berstender Verkehr (Burst)](#berstender-verkehr-burst) - - [Statisches multiplexing berstenden Verkehrs - Verzögerung](#statisches-multiplexing-berstenden-verkehrs---verzögerung) - - [Dynamische Kanalzuweisung](#dynamische-kanalzuweisung) - - [Annahmen für die dynmaische Kanalzuweisung](#annahmen-für-die-dynmaische-kanalzuweisung) - - [Zahlen von Merit](#zahlen-von-merit) - - [Durchsatz und angebotene Last](#durchsatz-und-angebotene-last) - - [Grundlegende Optionen für MAC](#grundlegende-optionen-für-mac) - - [Kollisionsbehaftete Protokolle](#kollisionsbehaftete-protokolle) - - [Carrier Sensing](#carrier-sensing) - - [CSMA und die Ausbreitungsverzögerung](#csma-und-die-ausbreitungsverzögerung) - - [Collision Detetion - CSMA/CD](#collision-detetion---csmacd) - - [Wahl einer zufälligen Wartezeit](#wahl-einer-zufälligen-wartezeit) - - [Adaption von k an die Last](#adaption-von-k-an-die-last) - - [Binary exponential Backoff](#binary-exponential-backoff) - - [Wettbewerbsfreie Protokolle](#wettbewerbsfreie-protokolle) - - [Polling und Tokenweitergabe](#polling-und-tokenweitergabe) - - [Bit-Map-Protokoll](#bit-map-protokoll) - - [Limited Contention Protokolle](#limited-contention-protokolle) - - [Fallstudie Ethernet](#fallstudie-ethernet) - - [Topologien](#topologien) - - [Unzuverlässiger, verbindungsloser Dienst](#unzuverlässiger-verbindungsloser-dienst) - - [Physisches Layer](#physisches-layer) - - [Ethernet verwendet CSMA/CD](#ethernet-verwendet-csmacd) - - [Ethernet - CSMA-CD Algorithmus](#ethernet---csma-cd-algorithmus) - - [Effizienz](#effizienz) - - [Hubs](#hubs) - - [Switch](#switch) - - [Geschwindigkeiten der Ethernetversionen](#geschwindigkeiten-der-ethernetversionen) - - [Zusammenfassung Kapitel 5](#zusammenfassung-kapitel-5) -- [Kapitel 6 Internetworking](#kapitel-6-internetworking) - - [LAN Verbindungen](#lan-verbindungen) - - [Gründe für mehrere LANs](#gründe-für-mehrere-lans) - - [Möglichkeiten des Überwindens der Begrenzungen](#möglichkeiten-des-überwindens-der-begrenzungen) - - [Physical Layer Verbindungen](#physical-layer-verbindungen) - - [Repeater](#repeater) - - [Hub](#hub) - - [Data Link Layer](#data-link-layer) - - [Switch](#switch-1) - - [Pfaderkennung - Selbstlernen](#pfaderkennung---selbstlernen) - - [Weiterleiten](#weiterleiten) - - [Bridges](#bridges) - - [Rückwärtslernen in Bridges - Bootstrapping](#rückwärtslernen-in-bridges---bootstrapping) - - [Lösung 1: Einschränken des Flutens](#lösung-1-einschränken-des-flutens) - - [Lösung 2: Spanning Trees](#lösung-2-spanning-trees) - - [Higher-Layer Verbindungen](#higher-layer-verbindungen) - - [Router](#router) - - [Gateways](#gateways) - - [Weitere Probleme mit LAN/LAN Verbindungen](#weitere-probleme-mit-lanlan-verbindungen) - - [Zusammenfassung Kapitel 6](#zusammenfassung-kapitel-6) -- [Kapitel 7: Netzwerklayer](#kapitel-7-netzwerklayer) - - [Bauen großer Netzwerke](#bauen-großer-netzwerke) - - [Netzwerklayerfunktionen](#netzwerklayerfunktionen) - - [Weiterleitung](#weiterleitung) - - [Durchsuchen der Routingtabelle](#durchsuchen-der-routingtabelle) - - [Zusammenspiel zwischen Routing und Weiterleitung](#zusammenspiel-zwischen-routing-und-weiterleitung) - - [Verbindungsaufbau](#verbindungsaufbau-1) - - [Netzwerkservicemodell](#netzwerkservicemodell) - - [Virtuelle Schaltkreisbasierte vs. Datagrammorientierte Netzwerke](#virtuelle-schaltkreisbasierte-vs-datagrammorientierte-netzwerke) - - [Verbindungslose und Verbindungsbasierende Dienste auf dem Netzwerklayer](#verbindungslose-und-verbindungsbasierende-dienste-auf-dem-netzwerklayer) - - [Virtuelle Schaltkreise](#virtuelle-schaltkreise) - - [Implementierung virtueller Schaltkreise](#implementierung-virtueller-schaltkreise) - - [Weiterleitungstabellen](#weiterleitungstabellen) - - [VC Signalprotokolle](#vc-signalprotokolle) - - [Datagrammnetzwerke](#datagrammnetzwerke) - - [Longest Prefix Matching](#longest-prefix-matching) - - [Datagramm vs. VC-Netzwerk](#datagramm-vs-vc-netzwerk) - - [Wie ist ein Router eigentlich aufgebaut?](#wie-ist-ein-router-eigentlich-aufgebaut) - - [Eingangsportfunktionen](#eingangsportfunktionen) - - [Switching Fabric](#switching-fabric) - - [Ausgangsports](#ausgangsports) - - [Ausgangsportwarteschlangen](#ausgangsportwarteschlangen) - - [Eingangsportwarteschlangen](#eingangsportwarteschlangen) - - [IP - Datagrammformat und Paketverarbeitung](#ip---datagrammformat-und-paketverarbeitung) - - [IP Paketformat](#ip-paketformat) - - [IP Fragmentierung und Reassemblierung](#ip-fragmentierung-und-reassemblierung) - - [IP Adressierung](#ip-adressierung) - - [Scheitern von einfachen Adressierungsmethoden](#scheitern-von-einfachen-adressierungsmethoden) - - [Adressierung und hierarchisches Routing](#adressierung-und-hierarchisches-routing) - - [Nähe](#nähe) - - [internetnamen und Adressen](#internetnamen-und-adressen) - - [Klassen von IP-Adressen](#klassen-von-ip-adressen) - - [IP-Adressierung](#ip-adressierung-1) - - [Subnets](#subnets) - - [IP Adressen](#ip-adressen) - - [CIDR: Classless Inter Domain Routing](#cidr-classless-inter-domain-routing) - - [Wie bekommt man eigentlich eine IP-Adresse?](#wie-bekommt-man-eigentlich-eine-ip-adresse) - - [Wie kommt das Netzwerk eigentlich an seinen Subnetpart von IP-Adressen?](#wie-kommt-das-netzwerk-eigentlich-an-seinen-subnetpart-von-ip-adressen) - - [IP Adressierung: Allokation von Adressen](#ip-adressierung-allokation-von-adressen) - - [NAT - Network Address Translation](#nat---network-address-translation) - - [Schließen der letzten Lücke: ARP](#schließen-der-letzten-lücke-arp) - - [ARP Protokoll im gleichen LAN](#arp-protokoll-im-gleichen-lan) - - [Routing in ein anderes LAN](#routing-in-ein-anderes-lan) - - [ICMP und IPv6](#icmp-und-ipv6) - - [ICMP: Internet Control Message Protocol](#icmp-internet-control-message-protocol) - - [Traceroute und ICMP](#traceroute-und-icmp) - - [IPv6](#ipv6) - - [IPv6 Header](#ipv6-header) - - [Weitere Veränderungen zu IPv4](#weitere-veränderungen-zu-ipv4) - - [Übergang von IPv4 zu IPv6](#übergang-von-ipv4-zu-ipv6) - - [Routing Algorithmen](#routing-algorithmen) - - [Überblick über Routingalgorithmen](#überblick-über-routingalgorithmen) - - [Fluten](#fluten) - - [Mögliche Anwendungsfelder fürs Fluten](#mögliche-anwendungsfelder-fürs-fluten) - - [Zufallsrouting](#zufallsrouting) - - [Adaptive Routingalgorithmen](#adaptive-routingalgorithmen) - - [Zentralisiertes adaptives Routing](#zentralisiertes-adaptives-routing) - - [Isoliertes adaptives Routing](#isoliertes-adaptives-routing) - - [Rückwärtslernen](#rückwärtslernen) - - [Verteiltes adaptives Routing](#verteiltes-adaptives-routing) - - [Klassifikation von Algorithmen für dezentralisiertes adaptives Routing](#klassifikation-von-algorithmen-für-dezentralisiertes-adaptives-routing) - - [Distanzvektorrouting Algorithmen](#distanzvektorrouting-algorithmen) - - [Distanzvektorrouting - Übersicht](#distanzvektorrouting---übersicht) - - [Distanzvektoralgorithmus - Quelltext](#distanzvektoralgorithmus---quelltext) - - [Distanzvektor: Reaktion auf Veränderung der Linkkosten](#distanzvektor-reaktion-auf-veränderung-der-linkkosten) - - [Poisoned Reverse](#poisoned-reverse) - - [Link State Routing](#link-state-routing) - - [Dijkstrasalgorithmus zur Berechnung kürzester Pfade](#dijkstrasalgorithmus-zur-berechnung-kürzester-pfade) - - [Weiterführende Diskussion zu Dijkstras Algorithmus](#weiterführende-diskussion-zu-dijkstras-algorithmus) - - [Link State Routing mit Dijkstras Algorithmus](#link-state-routing-mit-dijkstras-algorithmus) - - [Vergleich zwischen Link-State und Distanzvektoralgorithmen](#vergleich-zwischen-link-state-und-distanzvektoralgorithmen) - - [Hierarchisches Routing](#hierarchisches-routing) - - [Autonome Systeme](#autonome-systeme) - - [Routing im Internet](#routing-im-internet) - - [Verschiedenes Intra-AS und Inter-AS Routing, aber warum?](#verschiedenes-intra-as-und-inter-as-routing-aber-warum) - - [Verbundene autonome Systeme](#verbundene-autonome-systeme) - - [Inter-AS Aufgaben](#inter-as-aufgaben) - - [Beispiel: Setzen der Weiterleitungstabelle in Router 1d](#beispiel-setzen-der-weiterleitungstabelle-in-router-1d) - - [Beispiel: Wählen aus mehreren ASen](#beispiel-wählen-aus-mehreren-asen) - - [Routing im Internet](#routing-im-internet-1) - - [Intra-AS Routing (IGP)](#intra-as-routing-igp) - - [RIP - Routing Information Protokoll](#rip---routing-information-protokoll) - - [RIP - Advertisements](#rip---advertisements) - - [RIP - Linkausfall und Linkrecovery](#rip---linkausfall-und-linkrecovery) - - [RIP - Tabellenverarbeitung](#rip---tabellenverarbeitung) - - [OSPF - Open Shortest Path First](#ospf---open-shortest-path-first) - - [Weiterführende Funktionen](#weiterführende-funktionen) - - [Hierarchisches OSPF](#hierarchisches-ospf) - - [BGP - Border Gateway Protokoll](#bgp---border-gateway-protokoll) - - [BGP - Grundlagen](#bgp---grundlagen) - - [Verteilung von Erreichbarkeitsinformationen](#verteilung-von-erreichbarkeitsinformationen) - - [Pfadattribute und BGP Routen](#pfadattribute-und-bgp-routen) - - [BGP Routenwahl](#bgp-routenwahl) - - [BGP Nachrichten](#bgp-nachrichten) - - [Zusammenfassung Kapitel 7](#zusammenfassung-kapitel-7) -- [Kapitel 8: Transport Layer](#kapitel-8-transport-layer) - - [Transportlayerdienste und Protokolle](#transportlayerdienste-und-protokolle) - - [Transport vs. Netzwerklayer](#transport-vs-netzwerklayer) - - [Transportlayerprotokolle im Internet](#transportlayerprotokolle-im-internet) - - [Adressierung und Multiplexing](#adressierung-und-multiplexing) - - [Multiplexing und Demultiplexing](#multiplexing-und-demultiplexing) - - [Wie funktioniert Demultiplexing?](#wie-funktioniert-demultiplexing) - - [Verbindungsloses Demultiplexing](#verbindungsloses-demultiplexing) - - [Verbindungsorierntiertes Demultiplexing](#verbindungsorierntiertes-demultiplexing) - - [Multithreaded-Webserver](#multithreaded-webserver) - - [Verbindungskontrolle](#verbindungskontrolle) - - [Aufbau der Transportverbindung](#aufbau-der-transportverbindung) - - [Datentransferdienst](#datentransferdienst) - - [Verbindungsabbau](#verbindungsabbau) - - [Probleme während des Verbindungsaufbaus](#probleme-während-des-verbindungsaufbaus) - - [Drei Wege Handshake](#drei-wege-handshake) - - [Verbindungsablehnung](#verbindungsablehnung) - - [Verbindungsabbbau](#verbindungsabbbau) - - [Verbindungsabbau in der Realität](#verbindungsabbau-in-der-realität) - - [Flusskontrolle](#flusskontrolle-1) - - [Motivation: Kontrolle von Überlastsituationen](#motivation-kontrolle-von-überlastsituationen) - - [Flaschenhälse auf der Empfängerseite](#flaschenhälse-auf-der-empfängerseite) - - [Flusskontrolle](#flusskontrolle-2) - - [Flusskontrolle - Pufferallokation](#flusskontrolle---pufferallokation) - - [Flusskontrolle durch Continue und Stop](#flusskontrolle-durch-continue-und-stop) - - [Implizite Flusskontrolle](#implizite-flusskontrolle) - - [Kreditbasierte Flusskontrolle](#kreditbasierte-flusskontrolle) - - [Flusskontrolle - Permits und Acknowledgements](#flusskontrolle---permits-und-acknowledgements) - - [Staukontrolle](#staukontrolle) - - [Warum benötigt man Staukontrolle?](#warum-benötigt-man-staukontrolle) - - [Gründe für Stau](#gründe-für-stau) - - [Zusammenfassung](#zusammenfassung) - - [Adaptiere die Senderate an die Netzwerkkapazität](#adaptiere-die-senderate-an-die-netzwerkkapazität) - - [Wünschenswerte Eigenschaften von Staukontrolle](#wünschenswerte-eigenschaften-von-staukontrolle) - - [Designoptionen für Staukontrollmechanismen](#designoptionen-für-staukontrollmechanismen) - - [Mögliche Aktionen](#mögliche-aktionen) - - [Mögliche Aktionen - Taxonomie](#mögliche-aktionen---taxonomie) - - [Routeraktionen - Verwerfen von Paketen](#routeraktionen---verwerfen-von-paketen) - - [Verwerfen von Paketen - Implizites Feedback](#verwerfen-von-paketen---implizites-feedback) - - [Vermeiden von vollen Warteschlangen - Proaktive Aktionen](#vermeiden-von-vollen-warteschlangen---proaktive-aktionen) - - [Choke Pakete](#choke-pakete) - - [Warnungsbits](#warnungsbits) - - [Random Early Detection](#random-early-detection) - - [Was passiert aber, wenn Feedback empfangen wurde?](#was-passiert-aber-wenn-feedback-empfangen-wurde) - - [Transportprotokolle im Internet](#transportprotokolle-im-internet) - - [UDP - User Datagram Protocol](#udp---user-datagram-protocol) - - [UDP Checksummen](#udp-checksummen) - - [TCP - Transmission Control Protocol](#tcp---transmission-control-protocol) - - [TCP - Sequenznummern und ACKs](#tcp---sequenznummern-und-acks) - - [TCP Round Trip Time und Timeouts](#tcp-round-trip-time-und-timeouts) - - [TCP Verbindungsaufbau](#tcp-verbindungsaufbau) - - [Verbindungsidentifikation bei TCP](#verbindungsidentifikation-bei-tcp) - - [TCP Verbindungsmanagement](#tcp-verbindungsmanagement) - - [TCP Verbindung in drei Phasen](#tcp-verbindung-in-drei-phasen) - - [Zuverlässiger Datentransfer in TCP](#zuverlässiger-datentransfer-in-tcp) - - [TCP Senderevents](#tcp-senderevents) - - [TCP Sender (vereinfacht)](#tcp-sender-vereinfacht) - - [TCP ACK Generierung](#tcp-ack-generierung) - - [Schnelle Neuübertragung](#schnelle-neuübertragung) - - [Algorithmus](#algorithmus) - - [TCP Fluss- und Staukontrolle](#tcp-fluss--und-staukontrolle) - - [Sende- und Empfangspuffer bei TCP](#sende--und-empfangspuffer-bei-tcp) - - [TCP Flusskontrolle: Angebotenes Fenster](#tcp-flusskontrolle-angebotenes-fenster) - - [Nagles Algorithmus - Selbsttaktung und Fenster](#nagles-algorithmus---selbsttaktung-und-fenster) - - [Staukontrolle bei TCP](#staukontrolle-bei-tcp) - - [TCP ACK/Selbsttaktung](#tcp-ackselbsttaktung) - - [Gute und schlechte Nachrichten](#gute-und-schlechte-nachrichten) - - [Verkleinern des Staufensters](#verkleinern-des-staufensters) - - [Vergrößern des Staufensters](#vergrößern-des-staufensters) - - [Additives Erhöhen](#additives-erhöhen) - - [AIMD - Sägezahnmuster der angebotenen TCP Last](#aimd---sägezahnmuster-der-angebotenen-tcp-last) - - [Schnelle initialisierung - Slow Start (historischer Name)](#schnelle-initialisierung---slow-start-historischer-name) - - [Verlassen des Slowstarts](#verlassen-des-slowstarts) - - [Problematik der Paketbursts](#problematik-der-paketbursts) - - [Lösung: Auch hier Slow Start verwenden](#lösung-auch-hier-slow-start-verwenden) - - [Zusammenfassung TCP Staukontrolle](#zusammenfassung-tcp-staukontrolle) - - [TCP Performance](#tcp-performance) - - [TCP Durchsatz](#tcp-durchsatz) - - [TCP Fairness](#tcp-fairness) - - [Fairness](#fairness) - - [Fairness und UDP](#fairness-und-udp) - - [Fariness und parallele TCP-Verbindungen](#fariness-und-parallele-tcp-verbindungen) - - [Verzögerungsmodellierung](#verzögerungsmodellierung) - - [Festes Staufenster](#festes-staufenster) - - [TCP Verzögerungsmodellierung: Slow Start](#tcp-verzögerungsmodellierung-slow-start) - - [Fallstudie HTTP Modellierung](#fallstudie-http-modellierung) - - [HTTP Antwortzeiten](#http-antwortzeiten) - - [Zusammenfassung Kapitel 8](#zusammenfassung-kapitel-8) -- [Kapitel 9: Internet Application Layer](#kapitel-9-internet-application-layer) - - [Erstellen einer Netzwerkanwendung](#erstellen-einer-netzwerkanwendung) - - [Prinzipien von Netzwerkanwendungen: Architekturen](#prinzipien-von-netzwerkanwendungen-architekturen) - - [Client-Server Architektur](#client-server-architektur) - - [Peer-to-Peer Architketur](#peer-to-peer-architketur) - - [Hybride Client-Server und P2P](#hybride-client-server-und-p2p) - - [Prozesskommunikation](#prozesskommunikation) - - [Sockets](#sockets) - - [Adressierung von Prozessen](#adressierung-von-prozessen) - - [Durch das Anwendungsprotokoll festgelegte Eigenschaften](#durch-das-anwendungsprotokoll-festgelegte-eigenschaften) - - [Welche Transportdienste werden von den Anwendungen benötigt?](#welche-transportdienste-werden-von-den-anwendungen-benötigt) - - [Internettransportprotokolldienste](#internettransportprotokolldienste) - - [Web & HTTP](#web--http) - - [HTTP Übersicht](#http-übersicht) - - [HTTP Verbindungen](#http-verbindungen) - - [Antwortzeitmodellierung](#antwortzeitmodellierung) - - [Persistentes HTTP](#persistentes-http) - - [HTTP Anfragenachrichten](#http-anfragenachrichten) - - [Hochladen von Einfaben](#hochladen-von-einfaben) - - [Methodentypen](#methodentypen) - - [HTTP Statuscodes](#http-statuscodes) - - [HTTP Webcaching und Cookies](#http-webcaching-und-cookies) - - [Nutzer-Server-Zustand: Cookies](#nutzer-server-zustand-cookies) - - [Webcaches (Proxyserver)](#webcaches-proxyserver) - - [Weitere Informationen über Webcaches](#weitere-informationen-über-webcaches) - - [Bedingtes GET](#bedingtes-get) - - [Webserverarchitekturen](#webserverarchitekturen) - - [Grundlegende Webserveraufgaben](#grundlegende-webserveraufgaben) - - [Webserverarchitekturen](#webserverarchitekturen-1) - - [1. Prozessmodell](#1-prozessmodell) - - [2. Threadmodell](#2-threadmodell) - - [3. In-Kernel Modell](#3-in-kernel-modell) - - [4. Eventbasiertes Modell](#4-eventbasiertes-modell) - - [Performancevergleich](#performancevergleich) - - [Webservercluster](#webservercluster) - - [FTP: Das Dateitransferprotokoll](#ftp-das-dateitransferprotokoll) - - [Separate Kontroll- & Datenverbindung](#separate-kontroll---datenverbindung) - - [FTP Kommandos und Antworten](#ftp-kommandos-und-antworten) - - [Electronic Mail: E-Mail](#electronic-mail-e-mail) - - [SMTP](#smtp) - - [SMTP Vergleich mit HTTP](#smtp-vergleich-mit-http) - - [Mailnachrichtenformat](#mailnachrichtenformat) - - [Nachrichtenformat: Multimediaerweiterungen](#nachrichtenformat-multimediaerweiterungen) - - [Mailzugriffsprotokolle](#mailzugriffsprotokolle) - - [POP3](#pop3) - - [POP3 und IMAP](#pop3-und-imap) - - [DNS - Domain Name System](#dns---domain-name-system) - - [Verteilte hierarchische Datenbank](#verteilte-hierarchische-datenbank) - - [DNS: Root Name Server](#dns-root-name-server) - - [TLD, Authorative und lokale DNS Server](#tld-authorative-und-lokale-dns-server) - - [Iterative Anfragen](#iterative-anfragen) - - [Rekursive Anfragen](#rekursive-anfragen) - - [DNS Caching und Updaten von Records](#dns-caching-und-updaten-von-records) - - [DNS Records](#dns-records) - - [DNS Protokoll, Nachrichten](#dns-protokoll-nachrichten) - - [Einfügen von Records ins DNS](#einfügen-von-records-ins-dns) - - [P2P Filesharing](#p2p-filesharing) - - [Probleme mit einem zentralisierten Verzeichnis](#probleme-mit-einem-zentralisierten-verzeichnis) - - [Anfragefluten: Gnutella](#anfragefluten-gnutella) - - [Gnutella Protokoll](#gnutella-protokoll) - - [Gnutella Peerjoining](#gnutella-peerjoining) - - [Socketprogrammierung mit TCP](#socketprogrammierung-mit-tcp) - - [Socketprogrammierung unter Verwendung von TCP](#socketprogrammierung-unter-verwendung-von-tcp) - - [Stream Jargon](#stream-jargon) - - [Socketprogrammierung mit UDP](#socketprogrammierung-mit-udp) - - [Bauen eines einfachen Webservers](#bauen-eines-einfachen-webservers) - - [Zusammenfassung Kapitel 9](#zusammenfassung-kapitel-9) -- [Kapitel 10: Netzwerk Sicherheit](#kapitel-10-netzwerk-sicherheit) - - [Einführung - Bedrohungen, Sicherheitsziele, Schutzmaßnahmen](#einführung---bedrohungen-sicherheitsziele-schutzmaßnahmen) - - [Was ist eine Bedrohung in einem Kommunikationsnetzwerk?](#was-ist-eine-bedrohung-in-einem-kommunikationsnetzwerk) - - [Sicherheitsziele (Security Objectives) in Abnhängigkeit von der Anwendungsumgebung](#sicherheitsziele-security-objectives-in-abnhängigkeit-von-der-anwendungsumgebung) - - [Sicherheitsziele technisch definiert](#sicherheitsziele-technisch-definiert) - - [Bedrohungen technisch definiert](#bedrohungen-technisch-definiert) - - [Sicherheitsanalyse von gelayerten Protokollarchitekturen](#sicherheitsanalyse-von-gelayerten-protokollarchitekturen) - - [Angriff auf dem Nachrichtenlevel](#angriff-auf-dem-nachrichtenlevel) - - [Sicherheitsmechanismen gegen Bedrohungen](#sicherheitsmechanismen-gegen-bedrohungen) - - [Grundlagen der Sicherheitstechnologie](#grundlagen-der-sicherheitstechnologie) - - [Terminologie](#terminologie) - - [Sicherheitsdienste - Übersicht](#sicherheitsdienste---übersicht) - - [Kryptologie - Definition und Terminologie](#kryptologie---definition-und-terminologie) - - [Kryptographische Algorithmen](#kryptographische-algorithmen) - - [Wichtige Eigenschaften von Verschlüsselungsalgorithmen](#wichtige-eigenschaften-von-verschlüsselungsalgorithmen) - - [Symmetrische Verschlüsselung](#symmetrische-verschlüsselung) - - [Asymmetrische Kryptographie](#asymmetrische-kryptographie) - - [Erkennung verschlüsselter Nachrichten](#erkennung-verschlüsselter-nachrichten) - - [Kryptographisches Protokoll](#kryptographisches-protokoll) - - [Einführung in die Sicherheitsdienste von Kommunikationsnetzwerken](#einführung-in-die-sicherheitsdienste-von-kommunikationsnetzwerken) - - [Sicherheit in Netzwerken: Was sollen wir wo tun?](#sicherheit-in-netzwerken-was-sollen-wir-wo-tun) - - [Pragmatisches Modelll für sicheres und vernetztes Rechnen](#pragmatisches-modelll-für-sicheres-und-vernetztes-rechnen) - - [Beziehungen zwischen Layern und Anforderungsleveln](#beziehungen-zwischen-layern-und-anforderungsleveln) - - [Die IP Sicherheitsarchitektur IPSec](#die-ip-sicherheitsarchitektur-ipsec) - - [Sicherheitsprobleme des Internetprotokolls](#sicherheitsprobleme-des-internetprotokolls) - - [Sicherheitsziele von IPSec](#sicherheitsziele-von-ipsec) - - [IPSec: Sicherheitsassoziation](#ipsec-sicherheitsassoziation) - - [IPSec Protokollmodi](#ipsec-protokollmodi) - - [IPSec: Verschachtelung von Sicherheitsassoziationen](#ipsec-verschachtelung-von-sicherheitsassoziationen) - - [IPSec Authentication Header (AH)](#ipsec-authentication-header-ah) - - [IPSec Encapsulating Security Protocol (ESP)](#ipsec-encapsulating-security-protocol-esp) - - [IPSec: Etablierung von Sicherheitassoziationen](#ipsec-etablierung-von-sicherheitassoziationen) - - [Internetfirewalls](#internetfirewalls) - - [Terminologie](#terminologie-1) - - [Firewallarchitekturen](#firewallarchitekturen) - - [Einfache Paketfilterarchitektur](#einfache-paketfilterarchitektur) - - [Die Screened Host Architektur](#die-screened-host-architektur) - - [Die Screened Subnet Architektur](#die-screened-subnet-architektur) - - [Firewalls: Paketfiltrierung](#firewalls-paketfiltrierung) - ---- -# Kapitel 1: Kurze Übersicht - -## Unterschiede zwischen Telefon und Internet -- Telefon: Kontinuierliche Übertragung der Daten in beide Richtungen in nahezu Echtzeit -- Internet: Daten werden übertragen, Latenzen sind verschmerzbar - -## Verbindungsarten: -Jede Verbindung benötigt eine Stelle welche von Bits in Signale wandelt und umgekehrt -> Signale sind die physische Repräsentation von Daten in der Form einer charakteristischen Variation in Zeit oder Ausbreitung… - -Wichtige Eigenschaften auf niedrigem Niveau: -- Delay d: Zeit vom Versenden bis zum Empfangen -- Speed v: Wie schnell reist das Signal im Übertragungsmedium (Kupfer/Glasfaser bei 2/3c, WLAN bei c) - -> delay = distance / v - -## Phyische Verbindungen (Arten) -- Simplex: Nur ein Teilnehmer kann immer senden -- Half Duplex: Beide Seiten senden abwechselnd Daten über den selben Kanal - - TDD (Time Division Duplex): Nutzer senden in einem festgelegten Zeitrahmen und kommen sich somit nicht in die Quere -- Full Duplex: Beide Nutzer können gleichzeitig senden - - FDD (Frequenzy Division Duplex): Die Nutzer senden gleichzeitig auf unterschiedlichen Frequenzen. Somit ist ein Kabel für eine Verbindung in beide Richtungen ausreichend. - - TDD (Time Division Duplex): Ist möglich, wenn einer sendet und der andere das zu Sendende kurz zwischenspeichert und später den Inhalt des Caches und das Aktuelle gleichzeitig sendet (Funktioniert nur, wenn das Medium doppelt so viel Kapazität wie die Datenrate des Senders hat) - -## Größere Netzwerke -Einfaches untereinander Verbinden wird unübersichtlich, deshalb Einführung eines neuen Strukturelementes: -* Option 1: Circuit Switching - * einfach - * einmal aufgesetzt verbleiben die Ressourcen beim Nutzer - * Circuit muss hergestellt werden, bevor kommuniziert werden kann -* Option 2: Packet Switching - * Aufteilen von Daten in kleinere Pakete die nach und nach gesendet werden - * Problem: Informationen zu Sender/Empfänger und Start/Endzeitpunkt eines Pakets müssen mit übermittelt werden - * Switches übernehmen zusätzliche Aufgaben: - * Zwischenspeichern in Puffern - * Herausfinden des Ziels - * Weiterleiten - * Wird deshalb 'Store and Forward' Netzwerk genannt - -## Multiplexing -Ähnlich, das Switch-Element hat aber nur eine ausgehende Leitung -1. TDM (Time Division Multiplexing): Übertrage ein Paket nach dem Anderen (Zeitliche Unterteilung) -2. FDM (Frequency Division Multiplexing): Gebrauch verschiedener Frequenzen um gleichzeitig Mehreres übertragen zu können. - -Alternativen: CDM (Code DM), SPM (Space DM) - -Sinn der Sache: Simuliert jedem Gerät seine eigene Datenleitung zu haben, ohne mehrere Leitungen bereitstellen zu müssen. - -Ein Mux benötigt immer einen Demux, sodass das Paket den Weg korrekt verfolgen kann. - -> Broadcast Medium: ->- Nur ein Sender zu jeder Zeit ->- Zugriffskontrolle (MUX o. Absprache) - -Optionen für die Auswahl des nächsten Hops bei großen Netzwerken: -1. Fluten: Sende das Paket an alle Nachbarn -2. Hot Potato Routing: Sende an einen zufälligen Nachbarn -3. Routingtabellen: In jedem Switch mit einem Eintrag pro Ziel. Enthält Info über kürzeste Wege - * Kriterien: Schleifenfreiheit, gute Einschätzungen - * Konstruktion: Anfangs leer, wie soll ein Knoten etwas erfahren? - * Passiv: Beobachtung des Traffics - * Aktiv: Austausch von Informationen zwischen Routern - * Problem: Ab gewisser Größe keine Speichermöglichkeit für jedes Ziel mehr - * Lösung: Divide and Conquer: Aufteilen des Netzwerks in Ebenen - -Fehlerquellen: -* Umwandlung von Bits in Signale -* Zugriff nicht möglich -* Paketverlust -* Fehlerhafte Routingtabellen -* Falsche Anordnung der Pakete -* Empfangsrate des Empfängers niedriger als die Senderate des Senders - -Umgang mit Fehlern: -* Fehlerkontrolle := Zwischen Nachbarn oder Endpunkten -* Überlastungskontrolle - * Schutz gegen Pufferüberläufe, Regulierung der ins Netz geschickten Pakete (Staukontrolle) - * Schutz von Endsystemen gegen zu viele ankommende Pakete (Flusskontrolle) -* Wo und Wie ist die wichtige Frage: - * Im Endsystem oder im Netzwerk - * Großer Unterschied zwischen Telefon und Internet - ---- -# Kapitel 2: Architektur -Netzwerke werden irgendwann zu groß, um sie als eine Ebene zu betrachten, deshalb: Aufspaltung in verschiedene Layer. -* Jedes Layer besitzt eigene Regeln und Prozeduren -* Jeder Dienst besitzt Schnittstellen zu höheren Ebenen -* Dienste können über ihren SAP (Service Access Point) erreicht werden und sind sozusagen ein Versprechen, was mit den Daten die am SAP ankommen passiert. - -Services: Layer bieten ihren Nutzern über ihre Interfaces Dienste an. - -Konvention für die Layer: Fortlaufende Nummerrierung, je höher desto abstrakter - -Serviceprimitive: Menge an Operationen welche auf dem Interface eines Dienstes möglich sind - -* Main Groups - * Viele verschiedene Serviceprimitive sind denkbar, normalerweise werden vier verwendet: - * Request (Req) := Anfrage an ein Layer einen Service auzuführen - * Indication (Ind) := Ein Layer zeigt seinem Nutzer, dass etwas passiert ist (asynchrone Benachrichtigung) - * Response (Res) := Ein Nutzer von höherem Layer beantwortet eine Indication - * Confirmation (Conf) := Der ursprüngliche Dienstaufrufer wird über die Beendigung des Servicerequests informiert - * Nicht alle Typen müssen immer zur Verfügung stehen -* Dateneinheiten - * Dateneinheiten sind wohl begrenzte Nachrichten - * Nur vollständige Nachrichten werden gesendet - * Nur vollständige Nachrichten werden empfangen - * Dateneinheit ist das einzelne Byte, eine Folge von Bytes oder ein Bytestream - * Nicht in Nachrichten strukturiert - * Sender sendet eine Folge, wovon der Empfänger jede Teilsequenz verwenden kann -* Korrektheitsanforderungen - * Completeness: Alle gesendeten Nachrichten werden irgendwann zugestellt - * Correctness: Alle Daten die ankommen, sind auch genau die, die losgeschickt wurden (unverändert, ohne Bitfehler) - * Reihenfolgegetreu: Nachrichten und Bytesequenzen kommen in der korrekten Reihenfolge an - * Verlässlich: Sicher, Verfügbar,… - * Bestätigt: Erhalt von Daten wird dem Sender bestätigt - -Nicht alle Anforderungen müssen immer erfüllt sein - -## Verbindungsorientiert vs. Verbindungslos -* Telefonie vs. Post - * Service mit Einrichtungsphase -> Verbindungsorientierter Dienst - * Drei Phasen: Verbinden, Datenaustausch, Trennen - * Aufruf eines Serviceprimitivs kann zu zu jeder Zeit stattfinden -> Verbindungsloser Dienst - * Die Unterscheidung ist unabhängig von der Wahl von Circuit vs. Paketswitching -* Verbindungsorientierte Dienste müssen Primitive Bereitstellen um Verbindungen handhaben zu können: - * CONNECT - Einrichtung der Verbindung - * LISTEN - Warten auf Verbindungsanfragen - * INCOMING_CONN - Anzeige eingehender Connectionrequests - * ACCEPT - Annahme einer Verbindung - * DISCONNECT - Terminierung einer Verbindung - -Typische Servicebeispiele: -* Datagrammdienst: - * Dateneinheit -> Nachrichten - * Korrekt, aber nicht in Reihenfolge - * Verbindungslos - * unsicher/ nicht zuverlässig, nicht bestätigt -* Zuverlässiger Bytestream: - * Dateneinheit -> Bytestrom - * Korrekt, vollständig, reihenfolgegetreu, bestätigt - * Manchmal sicher/zuverlässig - * Verbindungsorientiert - -## Protokolle -Was macht ein Protokoll aus? … spezielle Nachrichten werden versand, auf welche hin spezielle Taten unternommen werden -> Protokolle bestimmen das Format, die Reihenfolge von Nachrichten, welche über Netzwerkeinrichtungen versandt und empfangen werde, sowie Aktionen welche bei Übertragung und Erhalt von Nachrichten ausgeführt werden. - -* Protokolle sind Regelsätze, welche beschreiben wie zwei oder mehr entfernte Teile (peers oder protocol entities) eines Layers kooperieren, um den Dienst des gegebenen Layers zu implementieren. -* Ein Protokoll ist die Implementierung eines Services - -### Protokollspezikiationen: -* Das formale Verhalten eines Protokolls muss präzise spezifiziert werden -* Hierfür geeignet: FSMs (Finite State Machines) - -Protokolle und FSMs -* FSMs implementieren die tatsächlichen Verhaltensregeln eines Protokolls -* Müssen mit entfernten Peers kommunizieren: - * müssen hierfür den Service des darunterliegenden Layers verwenden - * Mittels Serviceprimitiven, welche auch ankommende Daten an das Protokoll beretstellen können - * Anzeigen von niedrigeren Layern in Events für die Protokollengine des höheren Levels - -Wenn niedere Services verwendet werden, so werden den Nachrichten administrative Infos hinzugefügt, entweder als Header oder als Trailer -> Strict Layering:\ -> Jedes Layer verwendet nur den Service des darunter liegenden Layers - -Protokollmechanismen: -* Adressing -* Fragmentation -* Re-Sequencing -* Error-Control -* Flow-Control -* Congestation-Control -* Ressource-Allocation -* Multiplexing -* Compression -* Privacy, Authentication - -Wie sollten Layer strukturiert werden? -* Modularisation vereinfacht die Wartung -* Layerstruktur und Protokolle definieren die Kommunikationsarchitektur - -### Layering: Vor- und Nachteile -| Vorteile | Nachteile | -| -- | -- | -| Layer nötig um Komplexität zu verwalten und zu beherrschen | Layer können Funktionen redundant haben | -| Änderung der Implementierung eines Layerdienstes ist transparent | Verschiedene Layer können selbe Information benötigen | -| Typische Funktion: Ideales Netzwerk | Layer n benöitigt eventuell Einblick in Layern n+x | - -Es existieren zwei Referenzmodelle: -* ISO/OSI -* TCP/IP - -## ISO/OSI Referenzmodell -* Designprinzipien: - * Ein Layer per Ebene - * Jedes Layer mit wohldefinierter Funktion - * Layergrenzen mit mglst. wenig Informationsfluss - * Genug Layer zur Unterscheidung, wenig genug um Verwaltbarkeit zu schaffen - -Insgesamt 7 Layer werden unterschieden. -* Physisches Layer (PH) - * Bietet eine bittransparente Schnittstelle zum physischen Medium - * Spezifiziert mechanische, elektrische, funktionale und prozedurale Mittel um die **physische Verbindung zwischen zwei offenen Systemen zu unterstützen.** - * Physische Verbindung impliziert nicht die verbindungsorientierte Operation - * Verschiedene Übertragungsmedien können genutzt werden, jeweils verschiedene Protokolle sind von Nöten - * In-sequence Zustellung der Bits ist sichergestellt - * Fehlererkennung ist manchmal inkludiert -* Link Layer (L) - * Unterstützt Übertragung von service data units (SDU) größer als „word“ unter Systemen, welche über einen einzigen physischen Pfad verbunden sind. - * Essentielle Funktion ist block synchronization - * Teilweise wird Fehlererkennung oder Fehlerkontrolle zur Verfügung gestellt. - * Im Fall von Halb-duplex oder multipoint links muss der Zugriff auf das Medium **kontrolliert werden und Peersysteme müssen addressiert werden.** -* Network Layer (N) - * Erschafft einen logischen Pfad zwischen offenen Systemen, welche verbunden sind mit individuellen, möglicherweise verschiedenen Subnetworks - * Dieser logische Pfad kann durch mehrere, möglicherweise verschiedene dazwischenliegende Subnetworks gehen - * Diese Netzwerkebene unterstützt Routing, also müssen sich N-Service Benutzer nicht **um den Pfad kümmern** - * Der N-Service ist uniform, unabhängig von der Variation an Subnetwork Technologien, Topologien, QoS und der Organisation - * Netzwerk Addresse = Endsystem Addresse -* Transport Layer (T) - * Vervollständigt den Übertragungsteil des OSI Stacks. Unterstützt die Übertragung mit **gefordertem QoS, auf wirtschaftliche Weise zwischen (T)-nutzern (normalerweise Prozessse in einem Endsystem), unabhängig von der Netzwerkstruktur** - * Verschiedene Klassen von Protokollen mit verschiedenen Funktionalitäten sind **festgelegt (connectionoriented / connectionless; reliable / unreliable)** -* Session Layer (S) - * Unterstützt die Synchronisation des Dialogs und die Verwaltung des Datenaustausches (möglicherweise über mehrere transport layer connections aufspannend) - * Quarantine Data delivery - Eine ganze Gruppe von übertragenen S-SDUs wird zugestellt auf explizite Anfrage des Senders - * Interaktionsverwaltung erlaubt ausdrücklich festzulegen, welcher S-User das Recht bekommt zu übertragen - * Zurücksetzen der Verbindung auf vordefinierte Synchronisationspunkte -* Presentation Layer (P) - * Unterstützt die Übersetzung von Daten und Datenstrukturen in einzigartige Repräsentation - * Ausschließlich die Syntax wird modifiziert um die Semantik beizubehalten - * Auswahl von einer der allgemein anerkannten Transfersyntax - * Die lokale Syntax von jedem Endsystem wird in oder von der ausgewählten Transfer Syntax übersetzt -* Application Layer (A) - * Unterstützt den direkten Endnutzer durch die Bereitstellung einer Vielzahl an application services - * Dies kann sein: - * Genereller Typ (z.B. Entfernte prozedurale Anrufe, Transaktionsdurchführung,...) - * Spezifischer Typ (z.B. Virtuelles Terminal, Dateiübertragungszugriff und Verwaltung, Arbeitswechsel,...) - * Ein typisches Beispiel: virtuelles Terminal (Funktionen des reellen Terminals werden in **virtuelle Funktionen gemappt**) - -#### Kritik am ISO/OSI Modell -* Das Modell als solches mit der Unterteilung in Layer ist heutzutage sehr einflussreich -* Im praktischen Gebrauch aber eher irrelevant -* ISO konnte sich nicht durchsetzen -* Im Internetprotokoll (IP-Modell) wurden die obersten drei OSI-Layer in ein Applicationlayer zusammengefasst - -#### Architekturvoraussetzungen für das Internet -* Generalität := Unterstütze alle möglichen Sets von Applikationen -* Heterogenität := Verbinde alle Arten von Netzwerktechnologien -* Robustheit := Wichtiger als Effizienz -* Erweiterbarkeit := Wichtiger als Effizienz -* Skalierbarkeit := Spätere Entdeckung - -#### Grundlagen der Internetarchitektur -* Dumme Netzwerke, smarte Endgeräte -* Dumme Netzwerke brauchen nur einen geringsten gemeinsamen Dienst - * Datagrammdienst: kein Verbindungsstatus in den Routern - * Best effort: Gleichbehandlung - * Verlieren, verdoppeln und vertauschen -* Intelligente Hosts - * Behalten den Zustand - * "Schicksalsteilung" - Wenn ein Host zusammenbricht und den Kommunikationszustand verliert, so teilen alle Applikationen, welche kommunizieren dieses Schicksal - - -### TCP/IP Referenzmodell -* Basierend auf dem ARPANET -* Definiert nur zwei Layer - * Internetlayer: Packetswitching, Adressierung, Routing und Forwarding. Insbesondere für hierarchische Netze - * Transportlayer - * zuverlässiger Bytestrom: TCP (Transport Control Protokoll) - * unzuverlässiges Datagramm: UDP (User Datagramm Protokoll) -* Niedere und höhere Layer nicht wirklich definiert - * Host zu Host Kommunikation als gegeben angesehen - * Anwendungen geschätzt -* Jedes Layer nimmt Daten vom darüberliegenden Layer, fügt eine Headereinheit hinzu und erstellt eine neue Dateneinheit und schickt diese an das Layer darunter -* TCP/IP - Reihe von Protokollen: viele anwendungsspezifische Protokolle über IP - -#### Kritik am TCP/IP Modell -* keine klare Unterteilung zwischen Service, Protokoll und Interface - * Gleichstellung von TCP mit zuverlässigem Bytestrom eigentlich nicht zulässig - * Insbesondere unter IP -* Stark spezialisierter Stack, erlaubt keine Generalisierung -* Große Lücke unterhalb von IP -* Viele Einzelfalllösungen - -### ISO/OSI vs TCP/IP -* ISO/OSI: Sehr nützliches Modell, keine existierenden Protokolle -* TCP/IP: Nicht existentes Modell, sehr nützliche Protokolle -* Deshalb: ISO/OSI Modell aber TCP/IP Stack - -## Standardisierung -* Zum Bau großer Netzwerke werden Standards benötigt -* Traditionell aus dem Telekommunikationshintergrund - * Eingelaufen, weltweit aber langsam -* Internet - * Hauptsächlich um die IETF herum - * Zählungsorientiert, Fokus auf funktionierenden Implementationen - * Hoffnung auf schnelle Einführungszeiten - * Herstellergremien - -### ISO Standardisierverfahren -Standardisierungsprozess: -* DP: Draft Proposal -* DIS: Draft International Standard -* IS: International Standard - -## Zusammenfassung Kapitel 2 -* Komplexitätsbeherrschung nur mit Teilung in Subsysteme mit klar definierten Rollen -> Layering -* Jedes Layer bietet einen bestimmten Service an - * Services werden mächtiger, je höher man in der Hierarchie aufsteigt -* Um einen Service anzubieten, muss ein Layer über entfernte Geräte verteilt sein -* Entfernte Teile eines Layers verwenden ein Protokoll um Zusammenzuarbeiten - * Ein Protokoll ist eine horizontale, ein Service eine vertikale Beziehung -* Zwei wichtige Referenzmodelle existieren, welche beschreiben, wie man Funktionalitten in Layer gruppieren kann, welcher Service wo bereitgestellt wird, und wie man Protokolle strukturiert. - ---- -# Kapitel 3: Physikalisches Layer -## Synchronisation -Wann sollte man das Signal eigentlich sampeln? -* Wie weiß der Empfänger, wann das Signal auf einen Wert gemappt werden soll? - * Konvention: In der Mitte jedes Symbols, nur wann ist das nun genau? - * Länge ist typischerweise bekannt über die Konvention über die Symbolrate -* Der Empfänger muss mit dem Sender auf Bitlevel synchronisiert sein - * Link-Layer zuständig für Framesynchronisation - -### Vereinfachtes Konzept: -* Nimm an, dass Sender und Empfänger irgendwann synchron sind und beide eine Uhr haben, welche bei jedem Symbolschritt tickt -* Problem: Uhrendrift ist ein großes Problem - die Synchronisation wird verloren gehen -* Lösung: - 1. Stelle ein explizites Uhrensignal auf einem parallelen Kanal bereit - 2. Synchronisiere nur an kritischen Punkten (Uhrendrift ist nicht so schnell) - 3. Extrahiere Uhreninformation aus dem Signal selbst - -Idee: Mit NRZL (Non-Return to Zero Level) müsste sich die Länge der Bits herausfinden lassen - -Problem: Lange 1 oder 0 Folgen bieten keine Anhaltspunkte für die Bitgrenzen, somit hinfällig - -Idee: Manchesterkodierung, stelle dem Sender bei jedem Bit Informationen bereit, dass dies eine Stelle ist, bei der ein Bit startet, stoppt, seine Mitte erreicht hat - -Stellt eine ausreichende Anzahl an Signalwechseln sicher - -Problem: Benötigen die doppelte Bandbreite, da die Baudrate = 2*Bitrate ist. - -> Baudrate:\ -> Die Baudrate beschreibt die Anzahl der Symbole welche innerhalb einer Zeiteinheit übertragen werden - -## Breitband- vs. Basisbandübertragung -* Bisherige Übertragungsschemen: Basisbandübertragung - * Schieben die digitalen Symbolsequenzen direkt auf den Draht - * Verschiedene Level von Spannung/Stromstärke und co wird verwendet -* Probleme: Beschränkte Bandbreite verändert das Signal, Dämpfung und Verzerrung - -### Breitbandübertragung -* Lösen vom breiten Spektrum für DC-Übertragung -* Verwende Sinuswelle als Träger, hat meist eine, allerdings auch nur eine, hohe Frequenz -* Reine Sinuswellen haben keine Information, deshalb Beeinflussung durch - * Amplitude a - * Frequenz f - * Phase φ - -Unterschiedliche Varianten der Signalmodulation möglich: -1. Amplitudenmodulation\ - Die Amplitude lässt sich beispielsweise als das zu sendende Signal s(t) geben. Spezialfälle: - * s(t) analog - Amplitudenmodulation - * s(t) digital - Amplitudenkeying - * s(t) 0 oder 1 - An/Aus Keying -2. Frequenzmodulation -3. Phasenmodulation - * Phasenmodulation mit hohen verschiedenen Werten pro Symbol - * Der Empfänger kann gut zwischen Phasenwechseln unterscheiden - * Verwende Phasenverschiebungen von 0, π/2, π, 3π/2 um je zwei Bits je Symbol zu kodieren - * Besser noch in π/4 Schritten, somit Uhrenextraktion ermöglicht und Datenrate = 2* Symbolrate - * Wird QPSK genannt - * Verschiedene Modulationsarten können gut miteinander kombiniert werden - * Beispiel: 16-QAM (Quadrature Amplitude Modulation) - * Verwendet 16 Kombinationen von Phasenwechseln und Amplitude für jedes Symbol, somit Pro Symbol 2⁴ Bits codiert und übertragen - -## Digitales vs. Analoges Signal -* Digitale Übertragung: Endliches Set von verschiedenen Signalen -* Analoge Übertragung: Unendliches Set von verschiedenen Signalen -* Beispiel: Signal korresponidert zur Stromstärke auf der Leitung - * Digital: Endlich viele erlaubte Stromstärken, zb. 1A, 2A, 3A, 4A - * Analog: Jede Stromstärke ist erlaubt -* Vorteil von digitaler Übertragung: Hohe Chance, dass der Empfänger, das gesendete Signal sehr gt rekonstruieren kann - -Beispiele für Übertragungsmedien -* Geführte Übertragungsmedien - * Kupferdrähte - Twisted Pair - * Kupferdrähte - Koaxialkabel - * Fibre Optics (Glasfaser) -* Drahtlose Übertragung - * Radio - * Mikrowellen - * Infrarot - * Lichtwellen - -## Zusammenfassung Kapitel 3 -* Das physikalische Layer ist zuständig für die Umwandlung einer logischen Sequenz an Bits in ein physisches Signal, welches sich durch den Raum ausbreiten kann -* Viele verschiedene Formen von physischen Signalen sind möglich -* Signale sind limitiert durch ihre Ausbreitung ineinem physikalischen Medium (begrenzte Bandbreite, …) und Rauschen. -* Bits können kombiniert werden in vielfach besetzte Symbole für die Übertragung - * Erhöht die Differenz zwischen Baud- und Bitrate - * Basisbandübertragung ist fehlerbehaftet, teilweise verbesserbar durch die Modulation eines Signals auf einen Träger (Breitbandübertragung) - ---- -# Kapitel 4: Data Link Layer -## Services des Link Layers -* Der Link Layer sitzt oberhalb des physischen Layers - * Kann also einen Bitstromübertragungsdienst verwenden - * Service kann allerdings inkorrekte Bits haben -* Erwartungen des höheren Netzwerklayers - * Entweder Paketservice oder Bitstromdienst - * Möchte von Fehlern nichts wissen und sich darum auch nicht kümmern - -Optionen für Linklayer-Services -* Zuverlässig (Ja/Nein) - * Zugestelltes Paket mit gleichem Inhalt wie das losgeschickte - * Zustellung aller Pakete - * Reihenfolgentreue -* Fehlerkontrolle verfügbar? - * Vorwärts oder Rückwärtsorientiert -* Verbindungsorientiert? - * Soll gemeinsamer Kontext etabliert werden -* Paket oder Bitstromabstraktion - * Typischerweise in Computernetzwerken: Pakete - * Gibt es eine maximale Paketlänge? - -## Einfache Linklayerfunktionen (Übersicht) -### Framing -* Wie erstellt man aus dem Bitstrom des physischen Layers klar abgegrenzte Frames und wie erkennt man diese? - * Für Fehlerkontrolle benötigt - * Frames und Pakete sind das selbe, ist nur eine Namenskonvention für das Link Layer -* Zusätzlich: Fragmentation und Wiederzusammensetzung, falls Pakete des Netzwerklayers größer denen des Link Layers sein sollten - -### Fehlerkontrolle -* Typischerweise eher im Netzwerklayer -* Fehlererkennung - gibt es fehlerhafte Bits? -* Fehlerkorrektur - Werden erkannte Fehler repariert? - * Vorwärts - Investiere Arbeit bevor der Fehler passiert - * Rückwärts - Investiere Arbeit nachdem der Fehler passiert ist, unternimm Reparaturversuche - -### Verbindungsaufbau -* Verbindungen in vielerlei Hinsicht nützlich - * Anwendungskontext - * Fehlerkontrolle -* Frage: Wie baut man Verbindungen auf und wieder ab? - * Insbesondere oberhalb von Frames, mittels virtueller Verbindungen, da es keine geswitchte Ende-zu-Ende Verbindung gibt - -### Flusskontrolle -* Schneller Sender, langsamer Empfänger -> Puffer des Empfängers werden schneller gefüllt, als er diese leeren kann -> Verlorener Übertragungsaufwand -* Deshalb Adaptierung der Anzahl an Frames pro Link Layer Sendungen pro Zeit an den Empfänger - -## Framing -* Wie kann man einen Bitstrom in eine Sequenz von Frames umwandeln? - -### Framing durch Zählen der Charakter -* Idee: Veröffentlichen der Anzahl an Bits in einem Frame an den Empfänger - * Hinzufügen der Infos in den Frameheader -* Problem: Fehlerhafte Zählerinformation zerstört wiederum die gesamte Framesynchronisation - -### Framing durch Flagbitmuster/Bitstuffing -* Verwende ein Bitmuster welches Start/Ende markiert -* Verwende Bitstuffing, wann immer 5*1 hintereinander, so füge eine 0 daran an, außer beim Flagmuster -* Der Empfänger wiederum, wirft dann alle 0en nach 5*1 weg - -### Framing durch Codeverletzungen -* Angenommen, die Codierungsregeln des physischen Layers lassen noch Spielraum - * nicht alle Möglichkeiten an Kombinationen sind genutzt - * Bei Manchester z.B. nur low/high und high/low -* Falls diese Regeln verletzt werden, können zusätzliche Daten übertragen werden, z.B. Beginn und Ende eines Frames -* Bei Manchester dann high/high oder low/low -* Zerstört zwar das Selbstclocking Feature aber bei kurzen Übertragungen verschmerzbar - -## Fehlerkontrolle - Redundanz -* Zwei grundlegende Aspekte: - * Erkennen - * Korrigieren -* Beides ist unabhängig voneinander möglich - * Erkennen ohne Korrigieren: Tu einfach so als wäre das Paket nie angekommen - * Korrigiere aber erkenne nicht: Versuche so viel wie möglich zu korrigieren, aber versuche keine neuen zu entdecken und kümmere dich auch nicht darum - * Beispiel: Videoanruf oder Musikstreaming, dort sind kleinere Bitfehler voll verschmerzbar - > EDC = Error Detection and Correction Bits\ - > D = Data protected by error checking -* Fehlerdetektion ist nie 100% möglich: Fehler können übersehen werden … -* Irgendeine Form von Fehlerkontrolle erfordert Redundanz in den Frames -* Ohne Redundanz: - * Frame der Länge m kann 2^m Frames darstellen - * alle davon sind legal - * Unmöglich hier Veränderungen zu erkennen -* Kernidee: Deklariere einige Nachrichten als illegal - * Benötigen dennoch 2^m legale Frames, deshalb Frames mit n > m Gesamtlänge - * Die extra Bits werden in Headern oder Trailern mit versand und erlauben es dem Empfänger illegale Frames zu erkennen -* Wie hilft das bei der Bitfehlererkennung? - * Sender sendet nur legale Frames, die vom Medium korrumpiert werden - * Hoffnung: Ein legaler Frame wird nie ein anderer legaler Frame, sondern ein illegaler, notwendig hierfür: nur eine gewisse Anzahl an Bitflips darf auftreten - -### Parität -* Erzeugung eines redundanten Bit: Parität - * ungerade Parität: füge ein Bit hinzu, sodass die Gesamtzahl an 1en ungerade ist - * gerade Parität: füge ein Bit hinzu, sodass die Gesamtzahl der 1en gerade ist -* Angenommen der Empfänger erwartet immer gerade Parität, so kann er Fehler erkennen, sobald es eine ungerade Parität gibt - -### Checksummen -* Zur Berechnung von Checksummen behandelt der Sender die Daten als Sequenz von binären Integers -* Gruppieren in zweier Kombis und aufaddieren von deren Werten um die Checksumme zu erhalten -* Positiv: Einfach zu berechnen -* Negativ: Erkennen nicht alle häufigen Fehler - -### Hammingdistanz -Hammingdistanz = Anzahl an Stellen an denen sich zwei Frames x und y in binärer Darstellung unterscheiden lösbar mittels (x XOR y). - -Generalisierung -* Um Bitfehler zu erkennen, ist eine Hammingdistanz von d+1 in der Menge der legalen Frames nötig - * So, dass man unmöglich mit nur d Bitflips einen legalen Frame in einen anderen Schreiben kann -* Um Bitfehler korrigieren zu können ist eine Hammingdistanz von 2d+1 in der Menge der legalen Frames benötigt - * So sind alle Frames die bis zu d Bits vom nächsten legalen Frame entfernt sind, noch mehr als d Bits zum anderen legalen Frame entfernt sind - -### Frame Mengen - Code Books, Code -* Terminologie - * Codebook = Menge von legalen Frames - * Rate R von Code $S: R = log|S|/n$ (Effizienz) - * Distanz d von Code $S: d = d(S)/n$ (Fehlererkennungs/korrekturmöglichkeiten) -* Kriterien für guten Code: hohe Distant und große Rate -* Konstruktion guter Codes schwer, Möglichkeit mehrerer Paritätsbits wappnet gegen Bündelfehler - -### Cyclic Redundancy Check - CRC -* Effizient, hohe Erkennungswahrscheinlichkeit mit wenig Redundanzbits -* Funktion beruht auf polynomieller Arithmetik - * Bitstrings als Repräsentanten von Polynomen - * Koeffizienten 0 und 1 möglich, interpretiert als modulo 2 -* Idee: Fasse die Stränge von Bits als Repräsentation der Koeffizienten des Polynoms auf - * Bitstring mit (n+1) Bits = Polynom von Grad n -* Verwende Polynome um CR Bits zu berechnen - * Definiere eine Generatorpolynom G(x) des Grades g - * Sowohl Sender als auch Empfänger bekannt - * Verwenden g Redundanzbits - * Gegeben Nachricht M(x) - * Sender berechnet Rest r(x) der Division $x^g*M(x)/G(x)$ - * Überträge $T(x) = x^g M(x)-r(x)$ - * T(x) ist restfrei Teilbar durch G(x) - * Empfänger erhält m(x) - * Berechnet den Rest der Division von m(x) durch G(x) - -CRC Übertragung und Empfang -* Keine Fehler T(x) kommt korrekt an -* Bitfehler: T(x) ist verändert, dh. Koeffizienten wurden verändert - * Es kommt also T(x) + E(x) an -* Auf Empfängerseite: - * Empfange m(x) und berechne m(x) / G(x) - * Fehlerfrei: m(x) = T(x) - * Bitfehler: m(x) / G(x) = (T(x)+E(x))/G(x) = T(x)/G(x) + E(x)/G(x) -* Die Wahl von G(x) bestimmt die CRC Eigenschaften -* In der Anwendung werden sämtliche Fehler nach dem CRC-Check ignoriert - * Fehler können dennoch auftretem, insbesondere sind Fehler meist berstend - -### Rückwärtsfehlerkontrolle -Behandlung erkannter Fehler auf zwei Arten und Weisen -- Vorwärts: Sender sendet redundante Infos so, dass der Empfänger selbst ausbessern kann -- Rückwärts: Sender sendet redundante Infos so, dass der Empfänger fehlerhafte Pakete wahrscheinlich erkennt und Pakete in dem Fall nochmal verschickt werden können - -Rückwärtskorrekturverfahrensprotokolle sind unter dem Namen Automatic Repeat Request (ARQ) bekannt: -* Send and Wait -* Go-Back-N -* Selective Reject - -#### Send and Wait -* Sender schickt ein Paket, stellt sich einen Timer, wartet auf eine Quittung, und wenn keine ankommt, dann überträgt er es erneut -* Beschädigte Pakete werden vom Empfänger einfach verworfen -* Problem: Falls das ACK Paket verloren geht/ beschädigt wird, so kann dies der Sender nicht erkennen: - * Schickt einfach neu, und der Empfänger hat plötzlich zwei Kopien des selben Pakets -* Lösung - * Einführen von Sequenznummern, um zwischen verlorenen Paketen und Quittungen, sowie neuen und schon empfangenen Paketen zu unterscheiden - * Konvention: Sende Sequenznummer des zuletzt korrekt empfangenen Pakets in der Quittung - -##### Alternating Bit Protokoll -* Einführung der Sequenznummern 0 und 1 in den Nachrichten und ACKs -* Bedenke: ACKs nun mit doppelter Funktion - * Bestätigen dem Sender, die Ankunft des Pakets - * Erlauben es dem Sender eine weitere Nachricht zu senden - -##### ARQ - Sliding Windows -> Effizienz\ -> Definiert als die Rate der Zeit, in welcher der Sender neue Informationen sendet (für den fehlerfreien Kanal)\ -> Effizienz = $\frac{T_{packet} }{ T_{packet} + d + T_{ack} + d}$ - -* Die Effizienz des einfachen Alternatingbitprotokolls ist gering, wenn die Verzögerung im Vergleich zur Datenrate hoch ist. - -Verbesserung der Effizienz -* Ineffizienz von Alternatingbitprotokollen in Situationen mit großem Bandwith/Delay Produkt hängt mit der Wartezeit und dadurch ungenutztem Speicherplatz zusammen -* Dauerhaftes Senden führt zu höherer Effizienz, deshalb Pipelining von Paketen und Einführen eines größeren Sequenznummernraums - -Sliding Windows -* Führe neuen Sequenznummernraum mit 2^n Sequenznummern ein, wobei nie alle gleichzeitig verwendet werden dürfen -* Verwende Sliding Windows sowohl beim Sender als auch beim Empfänger, um diese Nummern zu behandeln - * Sendefenster = Menge an zum Versand freigegebenen Sequenznummern - * Empfangsfenster = Menge an Sequenznummern welche zur gegebenen Zeit akzeptiert werden - -###### Übertragungsfehler und Empfangsfenstergröße -* Annahme: Linklayer sollte alle Frames korrekt und in Reihenfolge zustellen, der Sender verwendet Pipelining -* Beim Verlieren von Paketen bei einer Empfangsfentergröße 1 werden alle folgenden Pakete verworfen - -#### Go-Back-N -* Bei Empfangsfenstergröße 1 können alle auf einen verlorenen Frame gesendeten Frames nicht vom Empfänger verarbeitet werden - * Sind out of Sequence und können nicht bestätigt werden -* -> Sender wird einen Timeout erfahren - * Da alle Frames in der Zwischenzeit aber weitergesendet wurden, müssen diese erneut übertragen werden -* Go Back N ist leider ziemlich verschwenderisch mit den Ressourcen, minimiert aber den Overhead beim Empfänger - -##### Selective Reject / Selective Repeat -* Empfänger kann nun einige Pakete puffern -* Der Empfänger sendet im Fehlerfall negative Acknowledgements -* Der Sender wiederholt die Übertragung von fehlenden Frames - -##### Duplexoperation und Piggybacking -* Bisher Simplexoperation am oberen Serviceinterface, dh. Empfänger sendet ausschließlich ACKs zurück -* Wenn das obere Dienstinterface Full-Duplex unterstützt, dann wechsle Datenframes und ACK-Frames für eine gegebene Richtung ab - * Stecke die ACK-Info für Richtung A ! B in die Datenframes für B ! A (Piggybacking) - -#### Leistungsverhalten: -* Fehlerfreies Send and Wait: - * S = 1/(1+2a) wobei a = T-prop / T-frame -* Fehlerbehaftetes Send and Wait: - * S = (1-P)/(1+2a) -* Fehlerfreies Sliding Window: - * Sei W die Anzahl an Frames, welche der Sender senden kann, bevor er auf Quittungen warten muss - * Normalisierter Durchsatz: S = {1, falls W >= 2a+1, W/(2a+1) sonst} -* Selective Reject: - * S = {1-P, falls W >= 2a+1, (W(1-P))/(2a+1) sonst} -* Go-Back-N: - * S = {(1-P)/(1+2aP), falls W >= 2a+1, (W(1-P))/((2a+1)(1-P+WP)) sonst} - -## Folgerung Kapitel 4 -* Die meisten Probleme im Linklayer entstehen durch Fehler - * Fehler in der Synchronisation erfordern nichttriviale Framingfunktionen - * Fehler in der Übertragung erfordern Mechanismen diese zu Korrigieren und zu Verstecken, oder sie zu erkennen und zu reparieren -* Flusskontrolle ist oft eng in die Fehlerkontrolle integriert - * Ist allerdings eine separate, auch getrennt implementierbare Funktion -* Wahl des Fehlerkontrollschemas beeinflusst die Performance -* Verbindungsaufbau und -abbau muss noch behandelt werden - ---- -# Kapitel 5: Medium Access Control (MAC) -## Einführung: Multiple Access Link und Protokolle -* Point to Point -* Broadcast (geteiltes Medium) -* Einzelner geteilter Broadcastkanal -* zeitgleiche Übertragung von zwei oder mehr Knoten: Interferenz - -### Multiple Access Protokoll -* Verteilter Algorithmus, der bestimmt, wie Knoten auf ein geteiltes Medium zugreifen -* Oftmals kein out-of-Band Kanal für die Koordination - -### Broadcastkanal mit Rate R b/s -* Will nur einer Senden so kann er dies mit R, wollen M Instanzen senden, so sollen sie dies in R/M können. -* Völllig dezentralisiert und so einfach wie möglich - -### Statisches Multiplexing -* Eine einzelne Ressource kann statisch gemultiplext werden indem: - * Man feste Sendezeiten einräumt - * Mehrere Frequenzbänder verwendet - -### Berstender Verkehr (Burst) -* großes Problem, da - * die Ressource groß genug sein muss um mit der Datenrate sofort zurecht zu kommen - * auf den durchschnittlichen Verbrauch ausgelegt sein muss und aber Puffer benötigt - -### Statisches multiplexing berstenden Verkehrs - Verzögerung -* Basisfall: Kein Multiplexing, einzige Trafficquelle mit durchschnittlicher Rate P und Kapazität C - * Verzögerung ist T -* Multiplexing: Unterteile Ressource in N Quellen mit gesamter totalen Rate, statisch gemultiplext - * Verzögerung T-FDM = N \* T - * Unabhängig von FDM, TDM -* -> Multiplexing erhöht das Delay um das N-fache - -### Dynamische Kanalzuweisung -* Statisches Multiplexing nicht geeignet für berstenden Verkehr -* Alternative: Weise der Quelle welche Senden will den Kanal/Link zu - -#### Annahmen für die dynmaische Kanalzuweisung -* Stationsmodell: - * N unabhängige Stationen - * Mögliches Lastmodell: Wahrscheinlichkeit des Generierens eines Pakets im Intervall t ist x*T, mit x konstant -* Einkanalannahme: - * Nur ein Kanal für alle Stationen und für alle Nachrichten -* Kollisionsannahme: - * Nur je ein Frame zeitgleich fehlerfrei übertragbar -* Zeitmodell: - * Kontinuierlich: Übertragungen können jederzeit stattfinden - * Geslottet: Zeit ist in Slots eingeteilt, Übertragung kann nur an Slotgrenzen beginnen -* Carrier Sensing: - * Stationen können (oder auch nicht) erkennen, ob der Kanal frei oder in Benutzung ist - * Falls Kanal als belegt angesehen, so wird nichts übertragen - -##### Zahlen von Merit -* Wie ist die Effizienz eines dynamischen Kanalzuweisungssystems zu bewerten? - * Bei hoher Last sollen möglichst viele Pakete durchkommen - * Bei niedriger Last soll die Verzögerung so gering als mögich sein - * Fairness - Wird jede Station gleich behandelt? - -###### Durchsatz und angebotene Last -* Last G: falls > 1 so Überladung -* Ideal: S gleicht angebotener Last solange G < 1, S = 1 falls G <= 1 (nicht sehr realistisch) - -### Grundlegende Optionen für MAC -* Kollisionsfreie Protokolle -* Limited Contention Protokolle (beschränkt Kollisionsbehaftet) -* Kollisionsprotokolle - -#### Kollisionsbehaftete Protokolle -* ALOHA: - * Jeder sendet einfach sobald er etwas zu senden hat, keine Benachrichtigung über den Erfolg einer Übertragung möglich - * Paketübertragung bei ALOHA ist nur dann erfolgreich, wenn es keine weitere Übertragung in zwei Paketzeiten gibt -> mittlerer Erreichbarer Durchsatz < 20% -* Slotted ALOHA: - * Verwende nun Zeitslots (werden als irgendwie verfügbar angesehen) - * Dadurch Verdoppelung des Durchsatzes auf ca 36% - * Problem nach wie vor, der Durchsatz bricht zusammen, sobald sich die Last erhöht - -### Carrier Sensing -* Höre bevor du redest, und sende nichts, wenn das Medium gerade belegt ist -* 1-Persistent CSMA - * Falls belegt, so warte bis frei und sende dann -> Probleme entstehen, wenn mehrere nach der jetzigen Nachricht senden wollen -* Non-Persistent CSMA - * Wenn Kanal frei so übertrage, wenn Kanal belegt, so warte eine zufällige Zeit vor dem nächsten Freiheitstest - * Performance abhängig von der Zufallsverteilung, besser bei hoher Last, bei geringer Last nur unnützes Warten -* P-Persistent CSMA - * Kombiniert bisherige Ideen + geslottete Zeit - * Warte ständig auf freiwerden des Kanals, - * übertrage dann aber nicht sofort, sondern werfe eine Münze mit WK p, und sende mit WK p oder Warte mit 1-p auf nächsten Zeitslot und prüfe wieder - -#### CSMA und die Ausbreitungsverzögerung -* Problem jedes CSMAs: Ausbreitungsverzögerung -* Zwei Stationen seien bereit zum Senden zur Zeit t und t+e - * Zum Zeitpunkt t ist der Kanal frei, und Stationen durch Verzögerung d > e getrennt - * -> Station 2 kann bereits begonnene Übertragung von Station 1 nicht erkennen und sendet -> Kollision - -#### Collision Detetion - CSMA/CD -* Bei Kollision zweier Pakete geht viel Zeit durch die Beendigung der Übertragung verloren -* Abhängig vom physischen Layer können Kollisionen erkann werden - * Notwendig: Sender muss während des Sendens in den Kanal hören und dies mit seinem gesendeten vergleichen , falls dies nicht identisch ist, so deklariere es als Kollision -* Sollte eine Kollision aufgetreten sein, so warte eine zufällige Zeit - -#### Wahl einer zufälligen Wartezeit -* Einfach: Wähle einen aus k Slots -* Aber wie beschränkt man k nach oben? - * Kleines k: kurze Verzögerung, mehr Kollisionen - * Großes k: große Verzögerung, weniger Kollisionen - * -> Adaptiere k an die Verkehrslast - -#### Adaption von k an die Last -* Verwende Kollisionen als Indikator für ein zu kleines Wettbewerbsfenster -* Frage: Wie erhöht man k und wie verringert man es wieder? - -#### Binary exponential Backoff -* Erhöhe nach Kollisionen: - * Verdopplung von k bis zu einer gewissen Größe -* Verringern von k: - * Kompliziert: Wenn genug Frames nicht kollidiert sind, so reduziere k - * Einfach: Starte jedesmal wieder bei k = 1 - -### Wettbewerbsfreie Protokolle -* Kollsionen bereiten Probleme -> Medium ohne Wettbewerb nutzen -* Beispiel: Statisches TDMA (Time Division Multiple Access) -* Ansätze um die Nachteile von TDMA zu kompensieren: - * Zuweisung der Zeitslots nur an sendebereite Knoten - * Zentraler Master vergibt Rederechte - * Tokenring - * Stationen übermitteln Sendewunsch - -### Polling und Tokenweitergabe -Polling: -* Masterknoten läd Slaveknoten zum Übertragen in Reihenfolge ein -* Probleme: Polling Overhead, Latenz, Single Point of Failure - -Tokenweitergabe: -* Kontrolltoken wird von einem zum anderen Knoten übertragen -* Probleme: Token Overhead, Latenz, Tokenverlust - -### Bit-Map-Protokoll -* Stationen melden Sendewunsch während eines Reservierungsslots an - -Eigenschaften: -* Verhalten bei geringer Last: - * Wenn kaum ein Paket versendet werden soll, so wiederholt das Medium die Contentionslots - > Wartezeit -* Verhalten bei großer Last: - * Hoher und stabiler Durchsatz mit vernachlässigbarem Overhead -* Bit-Map ist ein Carrier Sense Protokoll - -### Limited Contention Protokolle -* Wünschenswert: Protokoll mit - * geringer Verzögerung bei wenig Last - * hohem Durchsatz bei viel Last -* Idee 1: - * Anpassen der Stationsanzahl per Contentionslot - * Contentionslots sind gut für den Durchsatz, bei geringer Last können wir es uns aber nicht leisten, auf die Antworten zu warten -> Stationen müssen sich dynamisch einen Slot teilen -* Idee 2: Adaptives Baumprotokoll - * Verwende verschiedene Auflösungslevel für die Wettbewerbsslots - * Im höchsten Level teilen sich alle einen Slot - * Wenn nur ein Node einer Gruppe senden will, so darf er das - * Wenn es mehr als einer ist, so kommt es zur Kollision im Contentionslot -> verdopplte die Slots und halbiere die Stationsanzahl pro Slot - * Rekursion! - -## Fallstudie Ethernet -### Topologien -* Bustoplogie := Alle Geräte sind an einem Kabel angebunden und sind in einer Kollisionsdomäne -* Sterntopologie := einfachere automatische Verwaltung und Wartung bei fehlerhaften Adaptern - -#### Unzuverlässiger, verbindungsloser Dienst -* Verbindungslos: - * Kein Handshake -* Unzuverlässig: - * Keine ACKs oder NACKs - * Datagrammstream kann Lücken haben, welche gefüllt werden müssen, falls benötigt - -#### Physisches Layer -* Typischerweise Manchestercodierung - -#### Ethernet verwendet CSMA/CD -* Keine Slots -* Carrier Sense: Niemand überträgt, wenn er merkt, dass ein anderer Adapter gerade sendet -* Collision Detection: Übertragender Adapter bricht ab, wenn er Kollisionen bemerkt -* Random Access: Warten einer zufälligen Zeit vor erneuter Übertragung - -##### Ethernet - CSMA-CD Algorithmus -1. Adapter erhält Datagramm von der Netzwerkschicht und erstellt Frame -2. Falls Kanal frei, so sendet der Adapter den Frame, falls dem nicht so ist, warte bis Kanal frei -3. Wenn erfolgreich übertragen, dann ist der Adapter mit dem Frame fertig -4. Falls eine andere Übertragung zeitgleich stattgefunden hat, so stoppe und sende ein Störsignal -5. Nach dem Abbrechen geht es in den Exponential Backoff: Nach n-ter Kollision wähle ein K aus {0,1,2,…,2^(m-1)} mit m = min{10,n}: Adapter wartet nun K * 512 Bitzeiten und kehrt zu 2 zurück - -* Jam Signal: Stellt mit 48 Bits sicher, dass alle anderen die Kollision mitbekommen haben -* Bitzeit: 0.1 µs bei 10 Mbps Ethernet -* Exponentiall Backoff: - * wähle zuerst K aus {0,1}, dann ab der zweiten Kollision aus {0,1,2,3} und nach 10 Versuchen aus {0,1,2,3,…,1023} - -#### Effizienz -efficiency = $\frac{1}{ (1+5 * (t_{prop}/t_{trans}))}$ - -#### Hubs -* essentielle physical-layer-repeater -* Eingehende Bits werden an alle Ausgänge mit selber Rate und ohne Puffern verteilt -* Kein CSMA-CD am Hub, Aufgabe der Adapter\ --> Hub stellt nur elektronische Verbindung her -> eine Kollisionsdomäne - -#### Switch -* nicht nur eine einfache elektrische Verbindung für sternförmige Topologie -* Wie tauscht man Pakete zwischen Kollisionsdomänen aus? - * Switches enthalten Puffer, welche direkt ankommende Pakete zwischenspeichern, bevor sie diese weiterleiten - -#### Geschwindigkeiten der Ethernetversionen -1. Switched Ethernet - mehrere Stationen über ein Kabel -2. Fast Ethernet - wie Switched nur mit 10ns Bitzeit -3. Gigabit Ethernet - jedes Kabel hat genau zwei Maschinen angehängt - * Mit Switch: - * Keine geteilten Kollisionsdomönen, benötigen kein CSMA-CD - * Fullduplexoperation auf jedem Link - * Mit Hub: - * Kollisionen, Halbduples, CSMA-CD - * Maximale Kabellänge 25 Meter - -## Zusammenfassung Kapitel 5 -* MAC Protokolle sehr wichtig, wenn man sich ein Medium mit vielen Anderen teilen will -* Hauptkategorien: Collision, Collision Free und limited contention -* Maßzahlen zur Beurteilung: Durchsatz, Verzögerung und Fairness -* Wichtige Fallstudie: Ethernet - Lehre: Halte es einfach! - ---- -# Kapitel 6 Internetworking -## LAN Verbindungen -* Klassisches Ethernet - Ein Kabel eine Kollisionsdomäne -* Funktioniert für einige Geräte, kollabiert ab gewisser Größe, CSMA-CD kann ebenfalls nicht mehr mithalten - -### Gründe für mehrere LANs -* Beschränkte Anzahl an Nutzern in einem einzelnen Netz -* Geographische Verteilung - würde zu ungeheuren Round Trip Zeiten führen -* Zuverlässigkeit - Defekte Sender würden ständig zwischenfunken -* Sicherheit - Promiscous Operation - Begrenzung möglichen Schadens - -### Möglichkeiten des Überwindens der Begrenzungen -* Application Layer <-> Application Gateway -* Transport Layer <-> Transport Gateway -* Network Layer <-> Router -* Data Link Layer <-> Bridge, Switch -* Physical Layer <-> Repeater, Hub - -## Physical Layer Verbindungen -### Repeater -* Physical Layer Gerät, verbindet zwei Kabel und verstärkt die ankommenden Signale und leitet dieses weiter -* Versteht den Inhalt der Pakete nicht und interessiert sich nicht dafür - -### Hub -* Physical Layer Gerät, verbindet mehrere Kabel elektrisch -* Alle verbundenen Kabel formen eine Kollisionsdomäne -* Versteht den Inhalt der Pakete nicht und interessiert sich nicht dafür - --> Lösungen nicht zufriedenstellend: Lösen die wirklich interessanten Probleme nicht - -## Data Link Layer -### Switch -* Verbindet mehrere Terminals, ohne eine Kollisionsdomäne zu erzeugen -* Speichert Link-Layer-Frames und leitet diese weiter -* Wenn ein Paket auf ein Segment geleitet werden muss, wird CSMA-CD zum Zugriff verwendet -* Inspiziert Adressen ankommender Pakete und leitet diese weiter (benötigt Puffer und Wissen, wo welches Terminal steht) - -Weiterleitung: Wie weiß man, wo was hingeleitet werden muss? -> Routingproblem - -#### Pfaderkennung - Selbstlernen -* Jeder Switch hat eine Switchtabelle -* Eintrag: (MAC-Adresse, Interface, Zeitstempel) -* Beim Empfang eines Frames lernt der Switch den Ort des Senders kennen (Rückwärtslernen) - -#### Weiterleiten -* Falls Ziel bekannt so prüfe, ob - * es in das selbe Segment gehört aus dem es kommt -> verwerfen - * sonst leite es passend weiter -* andernfalls flute das Netzwerk damit - -### Bridges -* Switches sind beschränkt, da sie nur einfache Terminals verbinden -* Jedes mit einer Bridge verbundene Netzwerk ist eine eigene Kollisionsdomäne, und auch verschiedene LAN-Typen können miteinander verbunden werden - -#### Rückwärtslernen in Bridges - Bootstrapping -* Algorithmus - * Flute, falls nicht bekannt wohin gesendet werden muss, oder - * verwerfe, wenn bekannt, dass es nicht nötig ist, oder - * leite spezifisch weiter, wenn das Ziel bekannt ist - -Probleme: Durch Fluten können Paketloops entstehen -##### Lösung 1: Einschränken des Flutens -* Verhindern des unendlichen loopens indem gespeichert wird, was schon weitergeleitet wurde -* Dies benötigt Zustände und Einzigartigkeit und Pakete müssen unterscheidbar sein -* Großer Overhead - * Zustände sind problematisch, da das Durchsuchen Zeit kostet - -##### Lösung 2: Spanning Trees -* Wandle das Netzwerk ein einen zyklenfreien Graph und berechne darauf den Spannbaum - > Definition Spannbaum:\ - > Gegeben sei ein Graph G=(V,E), ein Spannbaum T = (V,E-T) ist ein Subgrap von V, wobei E-T ein Teil von E ist, welcher ein Spannbaum, der verbunden und azyklisch ist. - -### Higher-Layer Verbindungen -#### Router -* Bisher haben alle Geräte Adressen entweder ignoriert, oder arbeiteten mit MAC-Layer Adressen -* Für Verbindungen außerhalb eines LANs sind solche Adressen nicht ausreichend - * Hauptproblem: flache Adressstruktur, nicht skalierbar -* Benötigen ausgefeiltere Adressstruktur - -#### Gateways -* Wenn selbst Router nicht ausreichend, dann sind Higher-Layer-Verbindungen notwendig - * Arbeit auf dem Transportlevel und oberhalb, zum Beispiel für Transcodierung - -### Weitere Probleme mit LAN/LAN Verbindungen -* LAN meist lokal eingesetzt, aber logische Distanz sollte auch berücksichtigt werden -* Idee: Platziere in das physische LAN ein virtuelles LAN (VLAN) -* Konfigurationstabellen bezüglich VLAN Zugehörigkeit benötigt - -## Zusammenfassung Kapitel 6 -* einzelne LANs sind nicht ausreihend um Kommunikationswege für größere Installationen bereitzustellen -* Verbindung einzelner LANs nötig - * Physisches Layer - Repeater und Hub - * Data-Link-Layer - Bridges und Switches - * Netzwerklayer - Routing - * Higher-Layer - Gateways -* Probleme: - * redundante Bridges ermöglichen Trafficfluten, benötigen Spannbaumalgorithmen - * Einfache Adressen nicht skalierbar -> benötigen Router - ---- -# Kapitel 7: Netzwerklayer -## Bauen großer Netzwerke -* Internetworkingmechanismen helfen Paketen an ihr Ziel zu gelangen - * Hubs: Broadcast - * Switch: Sende an direkt verbundenes Netzwerk - * Bridges: Fluten (verursacht Probleme) -* Fluten ist keine gute Idee für große Netzwerke -> Spannbäume sind aber schonmal gut - -## Netzwerklayerfunktionen -* Weiterleiten: Bewege Pakete vom Routereingang auf den entsprechenden Ausgang -* Routing: Berechnen der Route, die die Pakete von Quelle bis zum Ziel gegangen sind - -### Weiterleitung -* Wie bekomme ich Pakete von einem Netzwerk ins Andere? -> Verwende Switches/Bridges/Router -* Tatsächliche Routingtabellen enthalten IP-Adressen, Flags, Netzmasken, etc. - -### Durchsuchen der Routingtabelle -* Suche nach übereinstimmender Hostadresse (Flag H gesetzt) -* Suche dann nach passender Netzwerkadresse -* Drittens, Suche nach einem Defaulteintrag - * Führe netstat -rn auf der Maschine aus und finde die Einträge der Routingtabelle - * Erlaubt es uns einen einzelnen Eintra für eine Liste an Einträgen zu haben, welche alle den selben next-hop Wert haben -* Frage: Wie kommt man nun auf die in der Routingtabelle gespeicherten Informationen? - -## Zusammenspiel zwischen Routing und Weiterleitung -### Verbindungsaufbau -* Dritte wichtige Komponente in manchen Netzwerkarchitekturen - * ATM, Frame Relay, X.25 -* Bevor Datagramme fließen, werden zwei Hosts und Router eine virtuelle Verbindung aufbauen -* Netzwerk und Transportlayer Verbindungsdienste: - * Netzwerk: Zwischen zwei Hosts - * Transport: Zwischen zwei Prozessen -* Im Internet gibt es keinen Verbindungsaufbau auf dem Netzwerklayer - -### Netzwerkservicemodell -Frage: Welches Servicemodell für die Übertragung von Datagrammen vom Sender an den Empfänger verwenden? -* Dienste für individuelle Datagramme: - * Garantierte Zustellung mit weniger als 40msec Verzögerung -* Dienste für einen Datagrammstrom: - * Zustellung in Sendereihenfolge - * Garantierte Mindestbandbreite - * Begrenzungen bei den Abständen von Paketen - -### Virtuelle Schaltkreisbasierte vs. Datagrammorientierte Netzwerke -### Verbindungslose und Verbindungsbasierende Dienste auf dem Netzwerklayer -* Datagrammnetzwerke = verbindungsloser Netzwerklayerdienst -* VC Netzwerke = verbindungsbasierter Netzwerklayerdienst - -### Virtuelle Schaltkreise -* Rufaufbau bevor überhaupt etwas übertragen werden kann + Rufabbau danach -* Jedes Paket überträgt einen VC-Identifier -* Jeder Router auf dem Weg behält einen Zustand für jede Verbindung vor und es können Link und Routerressourcen an einzelne Verbindungen zugeteilt werden - -### Implementierung virtueller Schaltkreise -* Besteht aus einem Pfad von der Quelle zum Ziel, sowie -* VC-Nummern, für jeden Link auf dem Pfad -* und Einträgen in Weiterleitungstabellen in Routern auf dem Weg -* Pakete welche zum VC gehören tragen eine VC-Nummer -* VC-Nummern müssen auf jedem Link geändert werden (neue kommen von Weiterleitungstabellen) - -### Weiterleitungstabellen -* Aufbau: Incoming Interface, Incoming VC, Outgoing Interface, Outgoing VC - -### VC Signalprotokolle -* Verwendet zum Aufbau und zur Terminierung von VCs, heutzutage nicht mehr verwendet - -### Datagrammnetzwerke -* Kein Verbindungsaufbau auf dem Netzwerklayer -* Router halten keine Zustände für Ende-zu-Ende Verbindungen -* Pakete werden anhand ihrer Zielhostadresse weitergeleitet (-> verschiedene Pfade für selbes Ziel) - -### Longest Prefix Matching -* Wähle diejenige Adresse aus der Tabelle, welche die größte Anzahl führender Adressbits mit der gegebenen gemein hat - -### Datagramm vs. VC-Netzwerk -* Internet - * Datenaustausch zwischen Computern - * "intelligente" Endsysteme, können z.B. Fehlerkontrolle und Fehlerkorrektur implementieren - * Viele verschiedene Linktypen, d.h einheitlicher Dienst nahezu ausgeschlossen -* ATM - * Geht aus der Telefonie hervor - * Konzept menschlicher Kommunikation: - * Striktes Timing, Zuverlässigeit benötigt - * "Dumme" Endsysteme, d.h. Komplexität liegt innerhalb des Netzwerkes - -## Wie ist ein Router eigentlich aufgebaut? -* Zwei Hauptfunktionalitäten: - * Ausführen von Routingalgorithmen und Protokollen - * Weiterleiten von Datagrammen von eingehenden auf ausgehende Links - -### Eingangsportfunktionen -Dezentralisiertes Switching: -* Gegebenes Datagrammziel, finde passenden Ausgangsport durch Benutzung von Weiterleitungstabellen -* Queuing, falls Pakete schnelller ankommen als man sie weiterleiten kann - -### Switching Fabric -1. Switching mittels Speicher - * Herkömmliche Rechner mit Switching unter direkter CPU-Kontrolle - * Kopieren der Pakete in den Systemspeicher - * Geschwindigekeit limitiert durch die Speicherbandbreite -2. Switching mittels BUS - * Übertragung von Datagrammen intern über einen Bus - * Switchinggeschwindikeit limitiert durch die Busbandbreite - * typ. 1Gbps Bus, ausreichend für Heim und Businessrouter -3. Switching mittels Verbindungsnetzwerk (Crossbar) - * Überwinden der Bandbreitenbeschränkungen von Busen - * Design: Fragmentierung von Datagrammen in Zellen fester Größe, wobei nun die Zellen durch das Fabric geswitcht werden - * Bis zu 1.28 Tbps Switchinggeschwindigkeit - -### Ausgangsports -* Pufferung nötig, sobald Pakete vom Fabric schneller ankommen, als die Ausgangsrate ist -* Schedulingdisziplin wählt aus den zu übertragenden Datagrammen - -### Ausgangsportwarteschlangen -* Probleme: Verzögerung und Verluste durch Pufferüberläufe möglich - -### Eingangsportwarteschlangen -* Fabric langsamer als Kombination von Eingangsports -> Schlangenbildung -* Head-of-the-Line (HOL) blocking: Datagramme am Anfang der Warteschlange hindert andere in der Warteschlange daran weiter zu kommen -* Probleme: Warteschlangenverzögerung und Verluste durch Pufferüberläufe - -## IP - Datagrammformat und Paketverarbeitung -### IP Paketformat -* Version: Versionsnummer des eingesetzten IP -* IHL: IP Header Length in 32 Bit Worten -* Typ des Dienstes: Infos zur Priorisierung -* Totale Länge: Die gesamtlänge in Bytes inklusive Header -* Identifier: Wenn Fragmentierung auftritt, bekommt jedes zugehörige Paket den selben Identifier -* Flags: - * DF: don't fragment - * MF: more fragments, alle außer das letzte Paket haben dies gesetzt -* Fragment Offset: Position des Fragments im ursprünglichen Paket -* TTL: Zähler für die Hopanzahl, wird an jedem Router dekrementiert, sobald gleich 0 -> verwerfen -* Protokoll: Spezifiziert verwendetes Protokoll -* Headerchecksum: Erlaubt Verifizierung der Inhalte im IP Header -* Quell und Zieladressen: identifizieren der Quelle und des Ziels -* Optionen: bis 40 Byte, zur Erweiterung verwendet - -### IP Fragmentierung und Reassemblierung -* Netzwerklinks haben eine MTU (größter Linklevelframe) -> verschiedene Linktypen, verschiedene MTUs -* Große IP Datagramme werden innerhalb des Netzes unterteilt - * Aus einem Datagramm werden mehrere, die erst beim Zielsystem wieder zusammengesetzt werden - * IP Header Identifizieren und Ordnen die neuen Pakete - -### IP Adressierung -#### Scheitern von einfachen Adressierungsmethoden -* Bei MAC/LLC: Jedes Gerät mit globaler einzigartiger Adresse -> Probleme: Jede Bridge mit extra Eintrag für jedes Gerät -> massiver Speicher- und CPU-Overhead - -#### Adressierung und hierarchisches Routing -* Benötigen eine Adressstruktur welche hierarchische Routingstrukturen respektiert und ausdrückt - -#### Nähe -* Achtung: - * Proximity: Beschreibt physische Nähe - * Closeness: Beschreibt strukturelle und logische Nähe mit kurzer Distanz - -#### internetnamen und Adressen -#### Klassen von IP-Adressen -* Class A: sehr große Organisationen, bis 16 Millionen Hosts -* Class B: große Organisationen, bis 65 Tausend Hosts -* Class C: kleine Organisationen, bis 255 Hosts -* Class D: Multicast, keine Netzwerk/Host Hierarchie -* Class E: reserviert -* Loopback: 127.xxx.xxx.xxx ist zum Testen reserviert, hierauf versendete Pakete werden als eingehende behandelt -* Broadcast: alles 1en -* Adresshierarchie: - * Jede Adresse mit Hostteil und Netzwerkteil - * Class A,B,C unterstützen nur zwei Level der Hierarchie - * Aber weitere Strukturierung des Hostteils in Subnetze möglich - -### IP-Adressierung -* IP Adresse: 32 Bit Identifier für Hosts oder Routinginterfaces -* Interface: Verbindung zwischen Host und dem physischen Link - * IP Adressen werden an das jeweilige Interface vergeben - -#### Subnets -* IP Adresse: - * Subnetteil - * Hostteil -* Was ist ein Subnet? - * Geräteinterfaces mit selbem Subnetteil in der IP Adresse können untereinander ohne Router kommunizieren -* Um die Subnetze herauszufinden entferne jedes Interface von dessen Host oder Router. Somit erschaffte Inseln sind isolierte Netze, also Subnetze - -#### IP Adressen -* Classfull-Adressierung: - * Ineffiziente Nutzung von Adressräumen - * Bsp: Class B Netz allokiert Adressen für 65k Hosts, selbst wenn nur 2k Adressen benötigt -* CIDR - Classless Inter Domain Routing: - * Netzwerkportion von Adressen beliebiger Länge - * Adressformat a.b.c.d/x, wobei x die Anzahl an Bits in der Netzwerkportion der Adresse darstellt - -#### CIDR: Classless Inter Domain Routing -* Überwinden der Klassengrenzen durch Supernetting -* ISPs können nun Class C Blocks zu einem großen Block zusammenfassen -* "Longest match routing" auf maskierten Adressen -* Beispiel: Alle in Europa vergebenen Adressen teilen sich einen gemeinsamen Prefix -> Nur ein Eintrag für alle Verbindungen nach Europa in den meisten amerikanischen Routern - -#### Wie bekommt man eigentlich eine IP-Adresse? -* Hart eincodiert in einer Konfigdatei -* DHCP: Dynamic Host Configuration Protocol: beziehe die Adresse dynamisch von einem Server - -#### Wie kommt das Netzwerk eigentlich an seinen Subnetpart von IP-Adressen? -* Der Provider stellt eine allokierte Portion des Addressraums des ISPs bereit - -### IP Adressierung: Allokation von Adressen -Woher bekommt ein ISP einen Adressblock?\ --> ICANN: Internet Corporation for Assigned Names and Numbers -* Allokiert Adressen -* Verwaltet DNS -* Weist Domainnamen zu und löst Konflikte - -#### NAT - Network Address Translation -* Motivation: Knappheit an IP-Adressen -* Idee: - * Lokale Netzwerke haben nur eine der Außenwelt bekannte IP-Adresse, somit hat nicht jedes Gerät eine vom ISP bereitgestellte Adresse -* Vorteile: - * Möglichkeit intern Adressen zu vergeben ohne die Außenwelt informieren zu müssen - * Wechsel des ISPs möglich, ohne intern Adressen zu verändern - * Geräte im Netzwerk nicht von außen ansprechbar (Sicherheitsfaktor) -* 16 Bit Portnummernfeld -> 60 000 simultane Verbindung mit nur einer einzigen LAN-Side Adresse -* NAT ist allerdings kontrovers diskutiert: - * Router sollten nur bis Layer 3 verarbeiten - * Verletzt das Ende-zu-Ende Prinzip - * Adressmangel sollte durch IPv6 gelöst werden - -#### Schließen der letzten Lücke: ARP -* Was passiert, wenn ein Paket bei seinem Zielnetzwerk ankommt? - * Wie wandelt man eine IP-Adresse in eine MAC-Adresse, welche dem zugehörigen Gerät gehört? -* Einfachste Lösung: Schreie! - * Broadcast auf das LAN, mit der Frage, welcher Node IP X.X.X.X hat - * -> Antwort des Nodes mit der MAC-Adresse -> Zustellung möglich -* ARP - Adress Resolution Protocol - -##### ARP Protokoll im gleichen LAN -* A möchte B ein Datagramm senden, aber Bs MAC ist nicht in As ARP Tabelle -* A broadcastet ein ARP-Anfrage-Paket, welches Bs IP-Adresse enthält - * Ziel-MAC = FF-FF-FF-FF-FF-FF - * Alle Maschinen im LAN erhalten die Anfrage -* B erhält das ARP-Paket, und antwortet A mit seiner MAC -* A speichert das IP to MAC Adresspaar in seiner ARP Tabelle bis die Information veraltet ist -* ARP ist eine Plug-and-Play Technologie (Nodes erstellen ihre Tabellen selbstständig) - -##### Routing in ein anderes LAN -* A erstellt Datagramm mit Quelle A und Ziel B -* A verwendet ARP um Rs MAC-Adresse für die IP hier 111.111.111.110 zu erhalten -* A erstellt Link-Layer-Frame mit Rs Macadresse als Ziel, Inhalt: A zu B Datagramm -* As Adapter sendet den Frame, Rs Adapter erhält diesen -* R entfernt das IP-Datagramm vom Ethernetframe und sendet es ans Ziel B -* R verwendet ARP um Bs Adresse zu erhalten -* R erstellt einen Frame, welcher das A zu B Datagramm enthält, und sendet diesen zu B - -## ICMP und IPv6 -### ICMP: Internet Control Message Protocol -* Verwendet von Hosts und Routern um auf Netzwerkebene Informationen auszutauschen - * Fehlermeldungen oder Echo-Anfragen -* In Netzwerkebenen oberhalb von IP werden ICMP Nachrichten als IP Datagramme versendet -* ICMP Nachrichten: Typ, Code + erste 8 Bytes des den Fehler auslösenden IP-Datagramms - -#### Traceroute und ICMP -* Quelle sendet Serie von UDP Nachrichten ans Ziel, jeweils immer mit TTL+1 -* Wenn das n-te Datagramm am n-ten Router ankommt, so verwirft er dieses, sendet aber eine ICMP Nachricht (Typ 11, Code 0) an die Quelle, welche Namen und IP des Routers enthält -* Zurück an der Quelle wird die RoundTripTime errechnet, traceroute macht dies drei mal -* Stoppkriterien: - * UDP Segment erreicht das Ziel - * Ziel gibt ein "host unreachable" zurück (Typ 3, Code 3) - -## IPv6 -* Motivation: - * 32 Bit Adressraum bald ausgeschöpft - * Headerformat hilft bei schneller Verarbeitung und Weiterleitung - * Header nun als Hillfmittel für QoS -* IPv6 Datagrammformat - * Header mit 40 Byte Größe (also 20 Byte mehr als bei IPv4) - * Fragmentierung ist nicht mehr erlaubt - -### IPv6 Header -* Priority: Signalisiert die Priotität der Datagramme im Fluss -* Flow Label: Identifiziert Datagramme im selben Fluss -* Next Header: Identifiziert das Layer der höheren Schicht für Daten - -### Weitere Veränderungen zu IPv4 -* Checksummen -> komplett entfernt -* Optionen -> Erlaubt, aber außerhalb des Headers -* ICMPv6 -> Zusätzliche Nachrichtentypen + Multicastgruppenmanagementfunktionen - -### Übergang von IPv4 zu IPv6 -* Nicht alle Router können gleichzeitig aktualisiert werden -> Frage: Wie kann das Netzwerk mit einer Mischung aus beiden Versionen zurechtkommen? -* Lösung: Tunneln: - * IPv6 wird als Nutzlast in IPv4 Datagrammen mitgeschickt - * Rückschläge -> Zusätzlicher IPv4 Header - * Verarbeitungsoverhead an den Tunnelendpunkten - * Keine Priorisierung möglich - -## Routing Algorithmen -### Überblick über Routingalgorithmen -* Ein Router führt einen Routingalgorithmus aus, um zu entscheiden, an welchem Ausgang ein eingehendes Paket weiter übertragen werden sollte. - * Verbindungsorientiert: nur beim Verbindungsaufbau - * Verbindungslos: entweder für jedes Paket oder periodisch ausgeführt -* Oftmals unter Verwendung von Metriken - * Zuweisung eines Kostenfaktors an jeden Link, bspw. Anzahl an Hops, Kosten in € eines Links,… -* Zwei grundlegende Typen existieren: - * Nichtadaptive Routingalgorithmen: Nehmen keine Rücksicht auf aktuellen Netzwerkzustand (z.B. Fluten) - * Adaptive Routingalgorithmen: Berücksichtigen aktuellen Netzwerkzustand (z.B. Distanzvekotrrouting, Link State Routing) - -### Fluten -* Strategie: jedes eingehende Paket wird auf jede ausgehende Linie geschickt, außer auf die Herkunftslinie -* Reduzierung der Nummer an Duplikaten: - * Hopzähler im Paketheader, sodass das Paket nach gewisser Anzahl an Hops verworfen wird - * Füge im ersten Router Sequenznummern in jedes Paket ein, welches vom Host empfangen wird. Jeder Router beinhaltet eine Tabelle, welche Sequenznummern er vom first-hop Router bekommen hat, daraufhin verwirft er alle Pakete, welche er bereits gesehen hat. - -#### Mögliche Anwendungsfelder fürs Fluten -* Militärische Anwendungen: - * Ziel soll immer erreicht werden können -* Updaten von verteilten Datenbanken -* Netzwerke mit häufigen Topologiewechseln - -### Zufallsrouting -* Jedes ankommende Paket wird auf einen zufälligen Ausgang geschickt, außer auf den Quellausgang -> es bahnt sich seinen Weg sozusagen durch den Router - -### Adaptive Routingalgorithmen -* Probleme nichtadaptiver Algorithmen: - * Keine Anpassungsmöglichkeit auf stark schwankendes Verkehrsaufkommen - * Kein ausreichend guter Umgang mit berstendem Verkehr -* Drei Grundtypen - * Zentralisiertes adaptives Routing - * Isoliertes adaptives Routing - benötigt keinen Informationsaustausch zwischen Routern - * Verteiltes adaptives Routing - Router tauschen periodisch Infos aus und aktualisieren Weiterleitungstabellen - -#### Zentralisiertes adaptives Routing -* Strategie: - * Anpassen an die vorherrschende Verkehrslast - * Ein Routingkontrollcenter muss ins Netzwerk eingebaut sein, welches periodisch den Linkstatus der Router erhält und kürzeste Routen berechnet und diese an die Router sendet -* Probleme: - * Ausfall des Controllers sorgt für nichtadaptives Routing - * Skaliert nicht - -#### Isoliertes adaptives Routing -* Idee: - * Routingentscheidungen werden nur anhand der Informationen des lokalen Routers getroffen, wie bei Hotpotato oder Rückwärtslernen -* Hot Potato Routing - * Wenn ein Paket ankommt, so leite es auf schnellste Art und Weise an den Ausgang mit der kleinsten Ausgangswarteschlange, ganz egal wohin dieser Ausgang dann führt - -##### Rückwärtslernen -* Idee: - * Paketheader enthalten wichtige Infos, wie Quelle, Ziel, Hopzähler -> Netzwerkknoten lernen etwas über die Netzwerktopologie während sie Pakete behandeln -* Algorithmus: - * Routing ursprünglich zufällig - * Pakete mit Hopzähler 1 stammt von direkt verbundenem Knoten, usw… - * Bei Ankunft eines Pakets vergleicht der IMP die Hopzahl für eine gegebene Quelladresse und aktualisiert diese falls nötig - * Wichtig: Periodisches Vergessen der Routen ist wichtig, um sich weiterhin anpassen zu können - -#### Verteiltes adaptives Routing -* Ziel: Finde einen guten Pfad durch das Netzwerk, welcher einen von der Quelle zum Ziel führt -* Graphabstraktion für Routingalgorithmen - * Graphknoten sind Router - * Graphkanten sind physische Links - * Linkkosten: Verzögerung, € Kosten oder das Staulevel - * Pfadkosten: Summe der Linkkosten auf einem Weg - -#### Klassifikation von Algorithmen für dezentralisiertes adaptives Routing -Globale vs. dezentralisierte Information? -* Dezentralisiert - * Router kennen physisch verbundene Nachbarn und Linkkosten zu diesen - * Iterativer Prozess zum Berechnen und Austausch von Informationen mit Nachbarn - * Distanzvektoralgorithmen: - * RIP - Routing Information Protocol - * BGP - Border Gateway Protocol -* Global - * Alle Router haben vollständige Topologie- und Linkkosteninformationen -* Link State Algorithmen - * Dijkstra - * OSPF - Open Shortes Paths First - -Statisch oder dynamisch? -* Statisch - * Router wechseln langsam über die Zeit hinweg -* Dynamisch - * Router wechseln häufiger - * Periodisches Updaten als Antwort auf Linkkostenwechsel - - -### Distanzvektorrouting Algorithmen -* Iterativ - * Läuft bis keine Knoten mehr Informationen austauschen - * Selbstterminierend -> kein Stoppsignal -* Asynchron - * Knoten müssen Informationen nicht getaktet austauschen -* Verteilt - * Jeder Knoten kommuniziert nur mit seinem direkten Nachbarn -* Distanztabellendatenstruktur - * Jeder Knoten hat seine eigene - * Spalte für jedes mögliche Ziel - * Zeile für jeden direkt angeschlossenen Nachbarknoten - * Beispiel: in Knoten X, für Ziel Y über Nachbar Z: - -> D^X(Y,Z) = Distanz von X nach Y mit Z als nächsten Hop - -#### Distanzvektorrouting - Übersicht -* Iterativ, asynchron: - * Jede lokale Änderung wird verursacht durch: - * lokale Änderung der Linkkosten - * Nachricht vom Nachbarn also dessen Änderung des kleinsten Knotenpfads -* Verteilt: - * Jeder Knoten benachrichtigt die Nachbarn nur dann wenn sich dessen Pfad mit den kleinsten Kosten geändert hat - -#### Distanzvektoralgorithmus - Quelltext -``` -//Initialisierung: -//für alle adjazenten Knoten v: -D^X(*,v) = infinity -D^X(v,v) = c(X,v) -//für alle Ziele y -sende min-w D^X(y,w) an jeden Nachbarn -loop -wait (bis eine Veränderung der Linkkosten auffallen oder man benachrichtigt wird) -if(c(V,X) verändert) - // verändere die Kosten zu allen Zielen durch den Nachbarn v durch d - // d kann auch negativ sein - für alle Ziele y: D^X(y,V) = D^X(y,V)+d -else if(Empfang eines Updates von V w.r.t Ziel Y) - // der kürzeste Pfad von Y zu einem Y hat sich verändert - // V hat einen neuen Wert für sein min-w D^V(Y,w) - // rufe diesen neuen Wert newval ab - für dieses einzelne Ziel y: D^X(y,V) = c(X,V)+newval -if (neues min-w D^X(Y,w) für irgendein Ziel Y, so senden wir den neuen Wert an alle Nachbarn) -forever -``` - -#### Distanzvektor: Reaktion auf Veränderung der Linkkosten -* Der Knoten erkennt die Veränderung von lokalen Linkkosten -* Die Distanztabelle wird geupdated -* Wenn Kosten im kleinsten Kostenpfad verändert werden, so werden die Nachbarn benachrichtigt -* Gute Nachrichten verbreiten sich schnell, schlechte Nachrichten verbreiten sich nur langsam - -#### Poisoned Reverse -* Wenn Z durch Y routet um zu X zu gelangen: - * Z sagt Y, dass seine eigene Distanz zu X unendlich ist (somit routet Y nicht über X nach Z) - * Löst dies das gesamte Problems des Zählens bis in die Unendlichkeit? - -### Link State Routing -* Linkstaterouting verwendet typischerweise Dijkstras Algorithmus - * Netzwerktopologie und Linkkosten sind allen Knoten bekannt: - * erzielt durch den Link-State-Broadcast - * Alle Knoten mit selber Information -* Ziel: Berechnung des kleinsten Kostenpfades von einem Knoten S zu allen andern Knoten V: - * Kann verwendet werden um eine Routingtabelle für dieses s zu erstellen - -#### Dijkstrasalgorithmus zur Berechnung kürzester Pfade -* Grundlegende Idee: - * Menge N mit Quellknoten S, füge nach und nach die zu dem Zeitpunkt bekannten mit kürzesten Pfaden erreichbaren Knoten ein - * Initial werden alle Pfade zu anderen Knoten als S auf unendlich gesetzt - * In jedem Schritt: - * Wähle Knoten V, welcher nicht in N ist, und von S aus nur mit Pfaden über bereits entdeckte Knoten erreicht werden kann - * Füge V in N ein - * Aktualisiere die geschätzten Kosten für alle direkten Nachbarn w von v, falls ein Pfad über v billiger wäre als die bisherige Schätzung - * Wenn eine Schätzung für einen Knoten w angepasst wird, so speichere auch den Vorgängerknoten V, welcher zu dieser Schätzung führt -* Somit speichert der Algorithmus für jeden Knoten v: - * Einen Schätzwert für den kürzesten Pfad - * Den Vorgängerknoten p(v) vom bis dahin als kürzesten Pfad angenommenen Pfad von s zu v - * Eine Listen von Knoten N für welche die kürzesten Pfade definitiv bekannt sind -* Aktualisierungsverfahren für die Schätzwerte - * Angenommen der Knoten v ist neu in die Liste hinzugefügt worden und wir aktualisieren den Schätzwert für den Knoten w: - * d(v) ist der Schätzwert für den kürzesten Pfad von v, d(w) ist der Schätzwert für w - * c(v,w) sind die Kosten der Kante von v zu w - -```cpp -if( d(v) + c(v,w) < d(w)){ - d(w) = d(v) + c(v,w); - p(w) = v; -} -``` - -* Intuition hinter dieser Prozedur - * Nimm an, dass d(w) und d(v) endlich sind - * Es existiert also ein Pfad (s,v1,v2,…,v) von s zu v mit gewicht d(v) - * Folglich existiert ein Pfad (s,v1,v2,…,v,w) von s zu w mit dem Gewicht d(v) + c(v,w) - * Also gibt es einen weiteren Pfad mit Gewicht d(w) - * somit kann der kürzeste Pfad zu w nicht mehr Gewicht haben, also entweder d(w) oder d(v)+c(v,w). - -#### Weiterführende Diskussion zu Dijkstras Algorithmus -* Algorithmenkomplexität für |V| Knoten: - * Jedes mal Überprüfung aller Knoten die nicht in N sind - * Benötigt O(V²) Vergleiche, dies ist optimal in dicht besiedelten Graphen - * Für dünnbesiedelte Graphen gibt es schnellere Varianten -* Variable Linkkosten -> Oszillation möglich - -#### Link State Routing mit Dijkstras Algorithmus -* Jeder Router misst diie Kosten zwischen sich selbst und benachbarten Routern -* Der Router baut ein Paket, welches all diese Daten enthält -* Verteilung dieser Pakete durch Fluten mit Sequenznummern und einem Altersfeld, sodass bereits gesehene Pakete oder veraltete verworfen werden können -* Sobald ein Router alle Linkstatepakete erhalten hat, kann er die gesamte Topologie rekonstruieren und einen kürzesten Pfad zwischen sich und allen anderen Knoten berechnen - -#### Vergleich zwischen Link-State und Distanzvektoralgorithmen -* Nachrichtenkomplexität: - * LS: mit N Knoten und E Links werden O(n-e) Nachrichten versandt - * DV: Austausch nur zwischen Nachbarn -* Konvergenzgeschwindigkeit - * LS: O(n²) Algorithmus benötigt O(N-E) Nachrichten (teils mit Oszillation) - * DV: Konvergenzzeit variiert - * Routingschleifen, Count to Infinity Problem, Oszillation -* Robustheit: (im Falle eines Routerausfalls) - * LS: - * Ein Knoten kann falsche Linkkosten ausgeben - * Jeder Knoten berechnet nur seine eigene Tabelle - * DV: - * DV Knoten kann falsche Gewichte ausgeben - * Jede Tabelle wird nun noch von anderen Routern verwendet -> Fehler breiten sich über das ganze Netzwerk aus - -### Hierarchisches Routing -Warum benötigen wir hierarchisches Routing? -* Skalierbarkeit -> 50+ Millionen Ziele in Routingtabellen ist sinnlos -* Autonomität -> Internet = Netz von Netzen, aber ein Admin möchte eventuell ja den Traffic im eigenen Netzwerk kontrollieren - -#### Autonome Systeme -* Aggregation von Routern in Regionen -> Autonome Systeme AS -* Router im selben AS verwenden das selbe Routingprotokoll - * Intra-AS Routingprotokoll - -> Gateway Router:\ -> * Spezielle Router innerhalb des AS, führen das Intra-AS Routingprotokoll mit allen anderen Routern im AS aus -> * Zusätzlich verantwortlich für das Routing an exteren Ziele -> Inter-AS Routingprotokolle mit anderen Gatewayroutern - -#### Routing im Internet -* Das globale Internet besteht aus miteinander verbundenen AS - * Stub AS: kleine Unternehmen (ein Link zum Internet) - * Multihomed AS: große Unternehmen (mehrere Links, ohne Transitverkehr) - * Transit AS: Netzbetreiber -* Zwei Level Routing: - * Intra-AS: Administrator verantwortlich für die Auswahl - * RIP: Distanzvektor - * OSPF: Link State - * IGRP: Distanzvektor - * Inter-AS: Einheitlicher Standard - * BGP: Pfadvektor - -#### Verschiedenes Intra-AS und Inter-AS Routing, aber warum? -* Policy: - * Inter AS: Admin möchte Kontrolle über sein Netz haben - * Intra AS: ein einziger Admin, also keine Policyentscheidungen nötig -* Skalierbarkeit: - * Hierarchisches Routing spart Tabellenplatz und sorgt für weniger Updateverkehr -* Performance: - * Inter-AS: Policy wichtiger als Performance - * Intra-AS: Performance als oberstes Gut - -#### Verbundene autonome Systeme -* Forwardingtabelle sowohl durch intra- als auch inter-AS Routingalgorithmen konfiguriert - * Intra-AS setzt Einträge für interne Ziele - * Inter-As und Intra-AS setzt Einträge für externe Ziele - -#### Inter-AS Aufgaben -* Problem - * AS1 erhält Datagramm für ein Ziel außerhalb von AS1, Weiterleitung durch Gateway Router, aber welchen? -* AS1 muss lernen welche Ziele über AS2 und AS3 erreichbar sind und diese Info an alle Router in AS1 weitergeben -* -> Job des Inter-AS Routing - -##### Beispiel: Setzen der Weiterleitungstabelle in Router 1d -* Angenommen AS1 lernt vom Inter-AS Protokoll, dass das Subnetz x durch AS3 (Gateway 1c) erreichbar ist, aber nicht von AS2 -* Verteilung der Info an alle internen Router -* Router 1d bestimmt über die Intra-AS Routinginformation, dass sein Interface l auf dem Pfad mit den geringsten Kosten zu 1c ist -* Der Router setzt nun einen Eintrag in die Weiterleitungstabelle (x,l) - -##### Beispiel: Wählen aus mehreren ASen -* Angenommen AS1, lernt durch das inter-AS Protokoll, dass es Subnetz x über AS2 und AS3 erreichen kann -* Um die Weiterleitungstabelle zu Konfigurieren muss Router 1d herausfinden, zu welchem Gateway es die Pakete für Subnetz x weiterleiten sollte -> Ebenfalls Job des Inter-AS Protokolls -* Hot-Potato-Routing: Sende das Paket an den nächsten von zwei Routern, werde das Paket also so schnell wie möglich wieder los - -### Routing im Internet -#### Intra-AS Routing (IGP) -* Typische Routingprotokolle: RIP, OSPF, IGRP - -#### RIP - Routing Information Protokoll -* Distanzvektoralgorithmus mit #Hops als Metrik - -#### RIP - Advertisements -* Distanzvektoren: - * Austausch zwischen Nachbarn alle 30s via Responsenachrichten - * Auch Advertisements genannt -* Jedes Advertisement - * Liste an bis zu 25 Zielnetzwerken im AS - -#### RIP - Linkausfall und Linkrecovery -Falls nach 180s kein Advertisement empfangen wurde, so deklariere den Nachbarn als tot -* Routen werden invalid -> Nachbarn werden informiert und verbreiten die Informationen -* Verwenden poisoned reverse um ping-pong-loops zu verhindern (undendliche Distanz = 16 Hops) - -#### RIP - Tabellenverarbeitung -* RIP Routingtabellen werden durch einen Prozess (route-d) auf Anwendungsebene gemanagt -* Advertisements werden periodisch in UDP Paketen verschickt - -### OSPF - Open Shortest Path First -* Open = Öffentlich verfügbar -* Beruht auf dem Link-State-Algorithmus - * LS Paketfluten - * Topologiekarte an jedem Knoten verfügbar - * Routenberechnung mit Dijkstra -* OSPF Advertisements annocieren nun keine Wege sondern Linkzustände mit je einem Eintrag pro Nachbarknoten - * Fluten der Advertisements, welche direkt in IP Pakete eingebettet sind, in das gesamte Netzwerk - -#### Weiterführende Funktionen -* Sicherheit: alle Nachrichten authentifiziert -* Mehrere Pfade mit gleichen Kosten erlaubt -* Für jeden Link gibt es mehrere Kostenmetriken für verschiedene Types of Service (TOS) -* Integrierter Support für Uni und Multicast - > Unicast: Ein Sender, ein Empfänger - > - > Multicast: Ein Sender, eine Gruppe von Empfänger - > - > Broadcast: Ein Sender, alle Teilnehmer eines Netzes - -#### Hierarchisches OSPF -* Zwei Level Hierarchie: local Area, backbone - * Link State Advertisements nur im eigenen Gebiet - * Jeder Knoten mit detaillierter Gebietstopologie, kennt aber nur die Richtung zu Netzwerken in anderen Gebieten -* Area Border Router: Fassen Distanzen zu Netzen im eigenen Gebiet zusammen, senden Adverisements an andere Area-Border-Router -* Backbone Router: führen OSPF uneingeschränkt auf Backbones aus -* Boundary Router: verbinden zu anderen ASs - -#### BGP - Border Gateway Protokoll -* De facto Standard -* BGP stellt jedem autonomen System die Möglichkeit bereit: - * Subnetzerreichbarkeitsinfos vom Nachbar AS zu erhalten - * Erreichbarkeitsinformationen im gesaten AS zu verteilen - * Gute Routen zu Subnetzen herauszufinden - * Erlaubt es Subnetzen deren Existenz zu verkünden - -#### BGP - Grundlagen -* Routerpaare tauschen Routinginformationen über semipermanente TCP Verbindungen aus: BGP Sitzungen (sind keine physischen Links) -* Wenn AS2 einen Prefix an AS1 verkündet, so ist dies ein Versprechen, alle an diesen Prefix adressierten Datagramme dorthin weiterzuleiten - -#### Verteilung von Erreichbarkeitsinformationen -* Dank eBGP Sitzung zwischen 3a und 1c sendet AS3 eine Prefixerreichbarkeitsinformation an AS1 -* 1c kann dann iBGP verwenden um diese neue Prefixerreichbarkeitsinformation an alle Router in AS1 verschicken -* 1b kann diese neue Erreichbarkeitsinformation an AS2 über die 1b zu 2a eBGP Sitzung weiter verteilen -* Wenn ein Router etwas über einen eneuen Prefix lernt, so erstellt er einen Eintrag für diesen Prefix in seiner eigenen Weiterleitungstabelle - -#### Pfadattribute und BGP Routen -* Wenn ein Prefix verkündet wird, so enthält diese Verkündigung BGP Attribute: - * Prefix + Attribute = Route -* Zwei wichtige Attribute - * AS-Pfad: Erhält die AS,durch die welche die Verkündigung für den Prefix hindurchgegangen ist - * NEXT-HOP: Indiziert den spezifischen internen AS Router, welcher sozusagen spezifiuiert, in welches AS man als nächsten Hop gehen sollte -* Wenn der Gatewayrouter eine Routenankündigung erhält, so verwendet er eine import policy zum Annehmen oder Ablehnen der Route - -#### BGP Routenwahl -* Falls mehr als eine Route zum Prefix führt muss eine gewählt werden, bspw. durch Policyentscheidungen, kürzeste AS Pfade oder Hot-Potato-Routing, … - -#### BGP Nachrichten -* BGP Nachrichten werden in TCP Nachrichten übertragen - * OPEN: Öffnet TCP Verbindung zum Peer und authentifiziert den Sender - * UPDATE: Kündigt neuen Pfad an oder verwirft den Alten - * KEEPALIVE: Hält die Verbindung am Leben wenn keine Update-Nachrichten verschickt werden müssen, ebenfalls das ACK für die OPEN Anfrage - * NOTIFICATION: Zeigt Fehler in vorheriger Nachricht an; wird auch zum Terminieren der Verbindung verwendet - -## Zusammenfassung Kapitel 7 -* Routing in großen Netzwerken benötigt nicht nur adäquate Routingalgorithmen für generelle Graphen, sondern auch eine angemessene, hierarchische Struktur für Netzwerke -* Die Netzwerkstruktur muss sich in der Adressierungsstruktur zeigen, da flache Adressen in einem vermeidbaren Overhead resultieren würden -* Verschiedene Metriken und Ziele müssen erreicht werden, insbesondere im Interdomainrouting, bei welchem Optimalität nur ein einzelner Aspekt ist - ---- -# Kapitel 8: Transport Layer -## Transportlayerdienste und Protokolle -* Stellen logische Kommunikation zwischen Anwendungsprozessen von verschiedenen Hosts bereit - * Sendeseite: Segmentiert Anwendungsnachrichten und leitet diese Segmente an die Netzwerkschicht - * Empfangsseite: Reassembliert Segmente in Nachrichten und leitet diese an die Anwendungsschicht weiter -* Als Transportprotokolle werden im Internet hauptsächlich TCP und UDP verwendet - -## Transport vs. Netzwerklayer -* Netzwerklayer: logische Kommunikation zwischen zwei Hosts -* Transportlayer: logische Kommunikation zwischen zwei Prozessen - -## Transportlayerprotokolle im Internet -* Zuverlässige, in Order Zustellung: TCP - * Stau- & Flusskontrolle - * Verbindungsaufbau -* Unzuverlässige, ungeordente Zustellung: UDP - * Einfache Erweiterung des best Effort IP Ansatzes -* Nicht vorhanden sind: Verzögerungs- und Bandbreitengarantien - -## Adressierung und Multiplexing -* Stelle mehrere SAPs bereit um mehrere Anwendungen zu Multiplexen -* Bspw: Portnummern - * Dynamisch alloziert, aber teils vordefiniert für bekannte Dienste, Webserver Port 80, Port 25 für Mail - -## Multiplexing und Demultiplexing -* Multiplexing auf Sendeseite: - * Sammeln von Daten an mehreren Sockets, verpacken der Daten mit Header zum Demultiplexing -* Demultiplexing auf Empfangsseite: - * Zustellen empfangener Segmente an den korrekten Socket - -### Wie funktioniert Demultiplexing? -* Hosts verwenden IP-Adressen und Portnummern um Segmente an korrekte Sockets zuzustellen - -### Verbindungsloses Demultiplexing -* Erstelle Sockets mit Portnummern - * DatagramSocket mySocket1 = new DatagramSocket(9111); - * DatagramSocket mySocket1 = new DatagramSocket(9222); -* UDP Sockets werden übber Zweiertupel aus Ziel IP und Ziel Port identifiziert - -### Verbindungsorierntiertes Demultiplexing -* TCP Sockets werden durch ein Vierertupel aus Quell-IP, Quellport, ZielIP und Zielport identifiziert -* Der Emfpänger verwendet alle vier Werte um das Segment an den passenden Socket weiterzuleiten -* Pro Server gleichzeitig mehrere Sockets, eindeutig bestimmt durch das 4er Tupel -* Webserver haben verschiedene Sockets für jeden verbundenen Client - * Nichtpersistentes HTML hat verschiedene Sockets für jede Anfrage - -### Multithreaded-Webserver -* Behandelt jede Anfrage als einen neuen Thread, anstelle eines neuen Prozesses, dh. ein Prozess handelt mehrere simultane Verbindungen -> höhere Crashwahrscheinlichkeit - -### Verbindungskontrolle -* Bei verbindungsorientierten Diensten gibt es drei Phasen der Verbindung: - * Connect - * Data - * Disconnect -* Für jede Phase gibt es spezielle Dienstprimitive, wobei wir je nach Layer noch einen layerspezifischen Prefix an die Primitive hinzufügen - * Transportlayer: T-Connect, T-Data, T-Disconnect - -#### Aufbau der Transportverbindung -* bestätigendes Serviceprimitiv: T-Connect -* Primitive: - * T-Connect.Request(Zieladr., Quelladr) - * T-Connect.Indication(Zieladr., Quelladr.) - * T-Connect.Response(Antwortadresse) - * T-Connect.Confirmation(Antwortadresse) - -#### Datentransferdienst -* Datentransferdienst: T-Data (bestätigungslos) -* Primitive: - * T-Data.req(userdata) - * T-Data.ind(userdata) - -#### Verbindungsabbau -* bestätigungsloser Abbaudienst: T-Disconnect -* Verwendung: - * Abrupter Abbau einer Verbindung (möglw. Verlust von TSDUs) - * Ablehnen einer Verbindungsanfrage -* Primitive: - * T-Disconnect.req(userdata) - * T-Disconnect.ind(reason, userdata) -* Parameter: - * Grund des Abbaus: z.B. unbekannt, Veranlasst durch anderen Nutzer, Fehlen von Ressourcen, Auftreten von Fehler, Unerreichbarkeit - -#### Probleme während des Verbindungsaufbaus -* Verlust der CR (Connection Request) oder CC (Connection Confirm) TPDU -* Duplikate von TPDUs - -##### Drei Wege Handshake -* Problematisch ist vor allem der Verlust der CC TPDU -* Lösung: Drei Wege Handshake während des Verbindungsaufbaus - * Verbindung wird Aufgabaut, sobald beide Verbindungsaufbau TPDUs bestätigt wurden - * Benötigt zusätzliches ACK (Acknowledgement) oder DT (Data) -* Neues Problem: Schützt noch nicht vor verspäteten Duplikaten - * Problem: Wenn sowohl die Verbindungsanfrage CR, als auch die Verbindungsbestätigung CC dupliziert und verspätet sind, so hat der Empfänger wieder keine Möglichkeit herauszufinden ob dies eine neue oder alte Kopie ist -* Lösung: Der Sender muss eine Frage beantworten, welche der Empfänger fragt - * Packe hierzu eine Sequenznummer in die CR, ACK, CC, DATA TPDUs - * Muss durch die Gegenseite kopiert werden, und erlaubt den Verbindungsaufbau nur dann, wenn die korrekte Nummer bereit gestellt wird. Verwende Sequenznummern deshalb möglichst nicht schnell hintereinander erneut -* Neue Lösung funktioniert für Duplikate der CR und der CR + ACK - -##### Verbindungsablehnung -* Ablehnung einer eingehenden CR mit einer DR oder Error TPDU - * Gründe: - * Ablehnung durch Transportdienstbenutzer - * Nichterfüllbarkeit der Dienstanforderungen - -##### Verbindungsabbbau -* Normaler Abbau - * Kann den Verlust von nicht bestätigten Daten nach sich ziehen, TCP verhindert dies, indem alle gesendeten PDUs vor Beenden der Verbindung bestätigt werden müssen - * Varianten: - * implizit: Abbau der Netzwerklayerverbindung - * explizit: Verbindungsfreigabe mit Disconnect-TPDUs -* Sobald ein Verbindungskontext aufgebaut ist, sollte es einfach sein, eine Verbindung wieder abzubauen - * Ziel: Abbau der Verbindung erst dann, wenn beide Teilnehmer zugestimmt haben, nichts mehr sagen zu wollen und alles erhalten zu haben -> Praktisch ist dies unmöglich: Denn woher weiß man, dass der Andere weiß, dass man weiß, dass der Andere weiß …, dass alles volständig übertragen wurde? -> Problem der zwei Armeen - -##### Verbindungsabbau in der Realität -* Problem der zwei Armeen ist dem des Verbindungsbbaus äquivalent -* Wenn eine Verbindung abgebaut wird, kann man aber größere Risiken in Kauf nehmen -* Typischerweise gelößt mit 3-Wege-Handshake: Sende DR, setze einen Timer, warte auf den DR des Teilnehmers und bestätige diesen -* Auch die drei Problemfälle von verlorenem ACK, Verlorene zweite DR + erneute Übertragung der ersten DR sowie verlorene zweite DR + verlorenes ACK werden gelöst. - ---- -### Flusskontrolle -#### Motivation: Kontrolle von Überlastsituationen -Typischweise sind ein Sender, Empfänger und das Netzwerk dazwischen in der Kommunikation involviert, um Überlastsituationen zu verhindern, muss die Menge an Daten den vorhandenen Kapazitäten der Systeme angepasst werden - -#### Flaschenhälse auf der Empfängerseite -* Annahme: Das Netzwerk selbst ist kein Flaschenhals, es kann alle Pakete ausliefern -* Gründe für Flaschenhälse auf der Empfangsseite: verschiedene Performancecharakteristika oder mehrere Sender auf einen Empfänger -* Konsequenzen: Empfänger ist überfordert mit ankommenden Paketen, Puffer laufen über und Daten gehen verloren - -#### Flusskontrolle -* Aufgabe: Schutz des Empfängers vor zu vielen ankommenden Paketen von der Sendeseite -* Bereitgestellt auf der: - * Linklayerebene: um Überlastung von "forwarding Segmenten" zu verhindern - * Höhere Layer: um Überlastung von Verbindungen zu verhindern -* Flusskontrolle auf dem Transportlayer ist komplizierter - * Viele Verbindungen, benötigt dynamische Allokation von Pufferspeicher - * Transportlayer PDUs mit schwankender Größe - * Puffermöglichkeiten des Netzes fügen weitere Komplexität hinzu - -#### Flusskontrolle - Pufferallokation -* Flusskontrolle abhängig von der Puffermöglichkeit -* Um ausstehdene Pakete zu unterstützen müssen diese entweder sofort und in korrekter Reihenfolge beim Empfänger ankommen, oder es muss genügend Puffer vorhanden sein -* Wie erreicht man Puffersicherheit? - * Empfänger verlangsamt den Sender - * Anforderung von Pufferspeicher durch den Sender - * Mitteilung des Empfängers an den Sender, dass nur noch so viel Puffer verfügbar ist (bei Sliding Window einfach das Sendefenster anpassen) - -#### Flusskontrolle durch Continue und Stop -* Einfachste Lösung: Sende Stopnachrichten wenn der Empfänger nicht schritthalten kann und Continue, sobald wieder Ressourcen vorhanden sind -* Beispiel: XON/XOFF: funktioniert aber nur bei Fullduplexverbindungen - -#### Implizite Flusskontrolle -* Idee: Halte ACKs oder NACKs zurück, um den Sender zu verlangsamen, somit werden Fehlerkontrollmechanismen nun zur Flusskontrolle missbraucht werden -* Nachteil: Senderseitig keine Unterscheidung mehr möglich, ob Pakete verloren gingen, oder er verlangsamt werden soll, was in unnötigen Wiederholungsübertragungen resultiert - -#### Kreditbasierte Flusskontrolle -* Der Empfänger gewährt dem Sender expliziten Kredit, sodass dieser meherere Pakete senden kann -* Ist der Kredit aufgebraucht, so muss der Sender warten, bis er wieder neuen zugeteilt bekommt -* Hierbei benötigen wir Fehlerkontrolle um auf verlorene Kreditnachrichten resultieren zu können -* Alternativ: absoluter Kredit oder Kreditfenster - -#### Flusskontrolle - Permits und Acknowledgements -* Permits = Empfänger hat Pufferspeicher, sende also weiter -* Acknowledgements = Empfänger hat Anzahl X an Paketen empfangen -* Kombinierbar mit dynamisch wachsendem Pufferplatz beim Emfänger (Beispiel TCP) - ---- -### Staukontrolle -#### Warum benötigt man Staukontrolle? -Jedes Netzwerk kann nur eine gewisse Anzahl an Traffic pro Zeit transportieren, wenn nun mehr Traffic von den Quellen ausgeht, als das Netzwerk als nominelle Kapazität hat, so kommt es zu Staukollapsen und verlorenen Paketen - -#### Gründe für Stau -1. Zwei Sender, zwei Empfänger, ein Router mit unendlich viel Pufferspeicher, keine erneuten Übertragungen - * Große Verzögerung bei Stau -2. Ein Router mit endlich viel Pufferspeicher, Sender überträgt Pakete nur erneut, wenn sie tatsächlich verloren gehen - * Immer λ-in = λ-out (goodput) - * Kosten des Staus: - * Mehrarbeit wegen der erneuten Übertragung für einen goodput - * Unbenötigte erneute Übertragungen -3. Vier Sender, Multihoppfade, Timeout/Erneute Übertragungen - * Wenn ein Paket verworfen wird oder verloren geht, so war jede Übertragungskapazität für dieses Paket verloren und verschwendet. - -#### Zusammenfassung -* Staukontrolle ist essentiell, um Schneeballeffekte zu vermeiden - * Sobald ein Netzwerk einmal überladen ist, wird es Pakete verlieren - * Nach Erkennung von Paketverlusten durch ein zuverlässiges Transportprotokoll, werden Pakete erneut übertragen, was die Last abermals erhöht - * -> Teufelskreislauf - -#### Adaptiere die Senderate an die Netzwerkkapazität -* Die Senderate jeder Quelle muss an die aktuelle Kapazität des Netzwerks angepasst werden -* Staukontrolle ist ein globales Problem, da dies abhängig von allen Routern, Weiterleitungsdisziplinen, Lastinjektionenund so weiter ist. -* Flusskontrolle wiederum ist ein lokales Problem - * Die Quelle darf das Ziel nicht überlasten, also sind nur Ziel und Quelle involviert - -#### Wünschenswerte Eigenschaften von Staukontrolle -* Sollte dazu führen, dass möglichst viele Pakete mit kurzer Verzögerung zugestellt werden -* Alle Teilnehmer sollten einen gerechten Anteil der verfügbaren Kapzität erhalten, aber wie bewertet man Fairness und was sollte alles beachtet werden? - -#### Designoptionen für Staukontrollmechanismen -* Open Loop: Designe das System von Beginn an so, dass es korrekt funktioniert und man keine Korrekturen zur Laufzeit vornehmen muss -* Closed Loop: Verwende Feedback, um zu erlauben, dass sich der Sender an die Situation anpasst -* Explizited Feedback: Die Stelle, an welcher der Stau auftritt informiert den Sender -* Implizites Feedback: der Sender extrahiert aus dem Netzwerkverhalten Informationen darüber, wie er sich verhalten sollte - -#### Mögliche Aktionen -* Erhöhen der Kapzität -> teuer, kurzfristig nicht umsetzbar -* Reservierungen und Zugriffskontrolle - erlaube also keinen zusätzlichen Verkehr wenn das Netzwerk stark ausgelastet ist -> nur für schaltkreisbasierende Netzwerke verfügbar -* Reduzierung der Last in kleiner Granularität -> Bringe einzelne Quellen dazu ihre Last zu reduzieren, sodass nichts terminiert werden muss (benötigt Feedback vom Netz: closed loop) - -#### Mögliche Aktionen - Taxonomie -* Router vs. Hostzentriert - * Wo werden die Informationen erhoben, Entscheidungen getroffen und Aktionen veranlasst? -* Fenster vs. Ratenbasiert - * Wie wird die erlaubte, ins Netz zu gebende Last definiert, durch - * die Rate, also X Bytes die Sekunde, oder - * durch ein Staufenster, als Menge von Sequenznummern von Bytes, welche versendet werden müssen, bevor weitere Permits benötigt werden - -#### Routeraktionen - Verwerfen von Paketen -* Pufferplatz eines Routers ist voll und ein neues Paket kommt an, welches verwirft man, das neu ankommende oder eines aus der Warteschlange? - * Für Medieninhalte sind neue wichtiger als alte Pakete - -#### Verwerfen von Paketen - Implizites Feedback -* Das sendende Protokoll kann Verluste erkennen, in kabelgebundenen Netzwerken ist annehmbar, dass Paketverluste nur durch Stau entstehen -> Verlust von Paketen als klarer Hinweis auf Stau -* Bei Open Loop Systemen sollte es nie vorkommen, dass ein Paket an einer vollen Warteschlange ankommt - -#### Vermeiden von vollen Warteschlangen - Proaktive Aktionen -* Wenn ein in einem Netzwerk Pakete an einer vollen Warteschlange ankommen, so steht es bereits relativ schlecht um das Netz -> Eingreifen bereits vor dieser Situation -* Reagiere sobald die Queue einen gewissen Staufaktor erreicht hat -> Der Router ist dann in einem Warnzustand - -#### Choke Pakete -* Sobald ein Stau der Router einen Stau erkannt hat -> Sende Chokepakete -* Chokepakete sagen dem Ziel, dass es seine Senderate verringern soll -* Problem hierbei: Wie sinnvoll ist es, in ein sowieso schon volles Netzwerk noch weitere Pakete zu injezieren? Und wie lange dauert es eigentlich bis die Quelle vom Stau erfährt (BW\*Delay)? - -#### Warnungsbits -Sobald ein Router feststellt, dass er von Stau betroffen ist, setzt er ein Warnbit in allen Paketen die er verschickt -> Da das Ziel das Warnungsbit in sein ACK Paket aufnimmt, erfährt die Quelle vom Stau und kann ihre Sendeleistung minimieren - -#### Random Early Detection -* nutze verworfene Pakete als implizites Feedback, bereits bevor die Warteschlange voll ist, wirf also vorzeitig Pakete weg um Feedback zu geben -* Mit steigender Staubelastung am Router kann die Entwurfswahrscheinlichkeit erhöht werden - -#### Was passiert aber, wenn Feedback empfangen wurde? -* Ratenbasierte Protokolle: - * Reduzieren der Rate ist einfach, aber wann erhöht man wieder? -* Fensterbasierte Protokolle: Schrumpfe das Staufenster - * Um welchen Faktor? Wie lässt man das Fenster überhaupt wachsen? - ---- -### Transportprotokolle im Internet -#### UDP - User Datagram Protocol -* Kein Schnickschnack, minimalistisches Internettransportprotokoll -* Best Effort Dienst -> UDP Segmente können verloren gehen, nicht reihenfolgegetreu zugestelllt werden -* Verbindungslos -> Kein Handshaking und unabhängige Behandlung der Pakete -* UDP wird oftmals für das Streamen von Multimediainhalten verwendet -> Tolerant gegenüber Verlusten und Ratenempfindlich (weiterhin für DNS und SNMP) -* Verlässliche Dienste unter UDP mit Zuverlässigkeit auf dem Applikationslayer - -##### UDP Checksummen -* Ziel: erkenne im Übertragenen Segment -* Senderseite: - * Behandle Segmentinhalte als Sequenz von 16-Bit Integern - * Checksumme: Addition der Segmentinhalte (1-Komplement) - * Platziere den Checksummenwert in das Checksummenfeld -* Empfängerseite: - * Berechne Checksumme des empfangengen Segments - * Prüfe ob der berechnete Wert gleich dem im Cheksummenfeld ist - * Falls nein -> Fehler erkannt - * Falls ja -> kein Fehler erkannt, dass keiner passiert ist, ist aber dadurch nicht gesagt - -#### TCP - Transmission Control Protocol -* Punkt-zu-Punkt: Ein Sender, ein Empfänger -* Zuverlässiger, reihenfolgegetreuer Bytestrom -> keine Nachrichtengrenzen -* Pipelined: Staukontrolle und Flusskontrolle bestimmen die Fenstergröße -* Sende und Empfangspuffer -* Vollduplex Daten: Bidirektionaler Datenfluss -* Verbindungsorientiert: Handshaking initialisiert den Sender- und Empfängerzustand bevor Daten ausgetauscht werden -* Fluss und Staukontrolle: Kein Überfordernd des Empfängers oder des Netzwerkes - -##### TCP - Sequenznummern und ACKs -* Sequenznummern: Bytestromnummer des ersten Bytes aus den Daten des Segments -* ACKs: Sequenznummer des nächsten von der anderen Seite erwarteten Bytes -* Die Frage wie man Pakete, welche nicht in Reihenfolge angekommen sind, behandeln soll, überlässt TCP dem Implementierer - -##### TCP Round Trip Time und Timeouts -* Zuverlässsiger Datenverkehr benötigt eine Behandlung von Timeouts -* Frage: Wie setzt man einen TCP Timeoutwert? - * Länger als die schwankende RTT, nicht zu kurz -> Unnötige Neuübertragungen, nicht zu lange -> langsame Reaktion auf Segmentverlust -* Frage: Wie kann man die RTT abschätzen? - * SampleRTT: gemessene Zeit von der Übertragung eines Segments bis zum Erhalt der ACK Nachricht - * Besser: Mittelung über mehrere SampleRTTs - > EstimatedRTT = (1-a) · EstimatedRTT + a · SampleRTT -* Exponentiell gewichteter Durchschnitt, typisch für a: 0,125 -* Setzen des Timeouts auf EstimatedRTT + Sicherheitsbereich -* Erste Einschätzung, wie groß die Abweichung des SampleRTT zum EstimatedRTT ist: - * DevRTT = (1-ß) · DevRTT + ß · |SampleRTT - EstimatedRTT| - * mit ß = 0,25 -* Setzen das Timeoutintervall auf: EstimatedRTT + 4 · DevRTT - -##### TCP Verbindungsaufbau -* TCP Verbindungen können aktiv oder passiv hergestellt werden: - * Active: Anfragen einer TCP Verbindung mit speziellem, über IP und Portnummer, spezifizierten Transportdienstnutzer - * Passiv: eine Anwendung informiert TCP, dass sie bereit ist eine eingehende Verbindung zu akzeptieren. - * Es kann ein Socket spezifiziert werden, auf welchem die Verbindung erwartet wird, oder - * jede Verbindung wird angenommen (unspecified passive open) - * Egal wie die Verbindung zustandekommt, wird allerdings ein neuer Socket erstellt - -##### Verbindungsidentifikation bei TCP -* TCP Verbindungen laufen zwischen Initiator und Responder, bzw. den Anwendungsprozessen welche auf den Systemen laufen -* Eine TCP Verbindung wird über ein Vierertupel identifiziert - >(Quellport, Quell IP, Zielport, Ziel IP) - -##### TCP Verbindungsmanagement -* Drei Wege Handshake - * Client sendet ein TCP SYN (SYN = 1, ACK = 0) an den Server -> spezifiziert initiale, nie benutzte Sequenznummer - * Server erhält das SYN Paket und antwortet mit einem SYNACK (SYN = 1, ACK = 1) -> Server alloziert Puffer und spezifikation der initialen Sequenznummer des Servers - * Der Client erhält das SYNACK und antwortet hierauf mit einem ACK (SYN = 0, ACK = 1), hier können nun erstmals Daten enthalten sein -* Terminieren einer Verbindung - * Client sendet ein TCP FIN - * Server empfängt das FIN, antwortet mit einem ACK und sendet ebenfalls ein FIN - * Client erhält ein FIN Segment, antwortet darauf mit ACK und geht in timed Wait Zustand, antwortet auf alle FINs mit ACKs - * Server erhält ein ACK, die Verbindung ist geschlossen - -##### TCP Verbindung in drei Phasen -1. Verbindungsaufbau - * 3-Wege Handshake - * Aushandlung der Fenstergröße und der Sequenznummern -2. Datentransfer - * Piggybacking von Acknowledgements -3. Verbindungsabbau - * bestätigt - * verhindert den Verlust von bereits gesendeten Daten - -##### Zuverlässiger Datentransfer in TCP -* TCP erschafft einen zuverlässigen Datendienst oberhalb des unzuverlässigen IP Dienstes -* Eigenschaften: - * Pipelining von Paketen - * Kumulative ACKs - * Verwendung eines einzigen Neuübertragungstimers - * Auslösung von Neuübertragungen durch: - * Timeoutevents - * Duplizierte ACKs - -##### TCP Senderevents -* Daten von der Anwendung empfangen: - * Erstelle Segment mit einer Sequenznummer # - * Sequenznummer = Bytestromnummer des ersten Datenbytes im Segment - * Starte den Timer, falls bisher nicht geschehen -* Timeout: - * Übertrage das, den Timeout auslösende Paket erneut und starte den Timer von vorne -* Empfang eines ACKs - * Falls es zuvor unbestätigte Segmente gab, so aktualisiere was als bestätigt bekannt ist und starte den Timer erneut, sollte es noch ausstehende Segmente geben - -##### TCP Sender (vereinfacht) -* SendBase-1: letztes kumulativ bestätigte Byte (SendBase ist das nächste erwartete Byte) -* Beispiel: - * SendBase = 72, y = 73, der Empfänger will also 73+; y > SendBase, so, dass die neuen Daten bestätigt werden - -```cpp -NextSeqSum = InitialSeqSum -SendBase = InitialSeqSum -loop(forever){ - switch(event) - event: data received from application above, create TCP Segment with sequence number NextSeqSum - if(timer not running){ - start timer - } - pass Segment to IP - NextSeqSum = NextSeqSum + length(data) - - event: timer timout - retransmit not yet acked segment with smallest sequence number - start timer - - event: ACK received, with ACK field value of y - if(y > sendBase){ - SendBase = y - if(there are currently not-yet-acknowledged segments){ - start timer - } - } -} -``` - -##### TCP ACK Generierung -* Ereignis beim Empfänger: - * Ankunft eines Segments in Reihenfolge mit erwarteter Sequenznummer. Alle Daten bis zu dieser Sequenznummer sind bereits bestätigt - * Verspätetes ACK, warte bis zu 500ms auf das nächste Paket. Falls kein Segment eintrifft, so sende die Bestätigung - * Ankunft eines Pakets in richtiger Reihenfolge mit erwarteter Sequenznummer, für ein anderes Paket steht das ACK allerdings noch aus - * Sende sofort eine einzelne kumulierte Bestätigung für beide Pakete - * Ankunft eines out-of-order Seqments mit einer höheren als erwarteten Sequenznummer. Also erkennung einer Lücke - * Sende sofort eine duplizierte Bestätigung, welche die Sequenznummer des nächsten erwarteten Bytes anzeigt - * Ankunft eines Segments, welches eine Lücke teilweise oder vollständig füllt - * Sende sofort eine Bestätigung, unter der Bedingung, dass das Segment am niedrigeren Ende der Lücke startet - -##### Schnelle Neuübertragung -* Die Timeoutperiode ist oft relativ lang -> große Verzögerung, bis ein verlorenes Paket erneut gesendet wird -* Erkenne verlorene Segmente über die ACK Duplikate - * Sender senden oftmals viele Pakete hintereinander, wenn Segmente verloren gehen, so wird es voraussichtlich viele ACKduplikate geben -* Wenn der Sender 3 ACKs für die selben Daten erhält, so nimmt er an, dass das Segment nach den besätigten Daten verloren ging -> Schnelle Neuübertragung noch bevor der Timer ausläuft - -##### Algorithmus -```cpp -event: ACK recevied, with ACK Field value of y -if(y > SendBase){ - SendBase = y; - if(there are currently not-yet-acked segments){ - start timer - } -} -else { - increment count of duplicate ACKs received for y - if(count of duplicate y ACKs = 3){ - resend segment with sequence number y - } -} -``` - -### TCP Fluss- und Staukontrolle -#### Sende- und Empfangspuffer bei TCP -* Sender: Puffer um Fehlerkontrolle bereit zu stellen -* Empfänger: Zwischenspeichern von noch nicht abgerufenen, oder nicht reihenfolgegetreu angekommenen Paketen - * Bemerkung: Alte TCP Versionen verwendeten GoBackN und verwarfen diese Pakete - -#### TCP Flusskontrolle: Angebotenes Fenster -* Der Empfänger kann seine Empfangpufferkapazitäten verkünden - * Verwendeter Pufferspeicher = (NextByteExpected-1)-LastByteRead - * Maximal verfügbarer Puffer = MaxRcvdBuffer - * Angebotener Pufferplatz = MaxRcvdBuffer - ((NextByteExpected-1)-LastByteRead) -* Erinnerung: Das angebotene Fenster beschränkt die Menge an Daten welche der Sender in das Netzwerk schickt (Sender stellt sicher, dass LastByteSend-LastByteAcked <= Advertised Window ist) - -#### Nagles Algorithmus - Selbsttaktung und Fenster -* TCP Selbsttaktung: Ankunft eines ACKs ist ein Zeichen dafür, dass neue Daten auf das Netzwerk geschickt werden können -* Es wäre allerdings sinnlos, für kleine Größen, wie ein Byte, direkt nach dem ACK weiterzusenden (silly window syndrome) -* Nagles Algorithmus beschreibt wie viele Daten TCP Senden darf - * Wenn eine Anwendung zu versendende Daten produziert - * falls sowohl angebotene Daten und das angebotene Fenster >= MSS -> Sende ein volles Segment - * andernfalls - * falls unbestätigte Daten auf dem Weg sind, so puffere neue Daten bis das MSS voll ist, - * andernfalls schicke die Daten sofort - -#### Staukontrolle bei TCP -* Implizites Feedback durch verworfene Pakete - * Annahme: Stau als Hauptgrund für verworfene Pakete -* Fensterbasierte Staukontrolle - * TCP führt Buch über die Anzahl an Bytes die es noch in das Netzwerk injezieren darf, diese Fenstergröße kann wachsen oder schrumpfen - * Der Sender beschränkt die Übertragung zusätzlich: - * LastByteSend-LastByteAcked <= CongWin - -##### TCP ACK/Selbsttaktung -Durch die ACKs kann der Sender darüber Aufschluss erhalten, wann die Pakete das Netzwerk verlassen -> Folglich dienen ACKs nicht nur als Bestätigung, sondern auch als Erlaubnis wieder die selbe Anzahl an Daten in das Netzwerk zu senden - -##### Gute und schlechte Nachrichten -* Gute Nachricht: Ankunft eines ACKs - * Dh. wir haben das Netzwerk bisher nicht überlastet, versuchen folglich das Staufenster noch ein bisschen zu vergrößern -* Schlechte Nachrichten: Kein ACK, ein Timeout tritt auf - * Das Paket wurde verworfen, das Netzwerk ist überlastet, versuchen also das Staufenster zu verkleinern - -##### Verkleinern des Staufensters -* Überlastete Fenster sind äußerst unpraktisch, greifen deshalb drastisch ein, und halbieren das Staufenster, sobald ein Timeout eintritt -* Falls ein Paket durch Übertragungsfehler und nicht durch Überlastung verloren geht, so wird dies durch TCP missinterpretiert und es reagiert über - * Tritt in Kabelnetzwerken selten auf, führt aber zu Problemen bei Drahtlosnetzwerken - -##### Vergrößern des Staufensters -Der Sender kann sich hier nicht sicher sein, ob tatsächlich noch Kapzitäten vorhanden sind, deshalb versuche, wenn alle Pakete, der in der letzten RTT gesendeten Pakete, angekommen sind, ein Paket mehr zu senden - -##### Additives Erhöhen -* Wartet nicht auf eine volle RTT um zusätzliche Last hinzuzufügen, sondern verwendet dazu bereits einzelne ACKs -```cpp -Increment = MSS · (MSS / Congestion Window) -Congestion Window += Increment - -Mit MSS als maximale Segmentgröße -``` - -##### AIMD - Sägezahnmuster der angebotenen TCP Last -* TCP verwendet AIMD, also additive increase, multiplicative decrease Taktik -* Es wird also kontinuierich auf zusätzliche Bandbreite geprüft und durch die Erhöhung der Bandbreitengrenze wird das Netzwerk regelmäßig die multiplikative Verringerung ausführen -> Sägezahnmuster - -##### Schnelle initialisierung - Slow Start (historischer Name) -* Problem: Es dauert ewig, bis wir mit einem neuen Netzwerk überhaupt mittels additive increase an die Bandbreitengrenze kommen -* Idee Vergrößerung des Staufensters mittels Verdopplung nach jeder RTT oder Hinzufügen eines Pakets je ACK - -##### Verlassen des Slowstarts -Sobald die Bandbreitengrenze erreicht ist, werden Paketverluste und Timeouts auftreten, TCP wechselt ab diesem Zeitpunkt wieder in den normalen Modus - -##### Problematik der Paketbursts -* Ein Sender sendet sein volles Fenster, alle Pakete kommen an, ACKs gehen verloren und es kommt zu Timeouts die das Staufenster halbieren -* Ein Paket wird erneut übertragen, und es kommt ein kumulatives ACK für alle Pakete an, der Sender allerdings sendet nun in seinem halbierten Sendefenster nochmals die selben Daten -> ACK Taktung fehlt - -###### Lösung: Auch hier Slow Start verwenden -* Verhindern solcher Paketbursts durch lineare Erhöhung des Staufensters - * Setzen das Staufenster auf 1 und starten Slow Start -* Weiterhin haben wir nun grundlegende Informationen über die Netzwerkkapazität - * Müssen auf den ersten Paketverlust warten, hier ist das halbierte Fenster eine gute Annahme - * Wir können nun den Verlust von Paketen verhindern, wenn wir das vorherige Staufenster als Stauschwellenwert ansehen - -#### Zusammenfassung TCP Staukontrolle -* Wenn das Sendefenster < Schwellenwert, dann ist der Sender in der Slow Start Phase und das Fenster wächst exponentiell -* Wenn das Staufenster > Schwellenwert, dann ist der Sender in der Stauvermeidungsphase und das Fenster wächst linear -* Wenn ein dreifach dupliziertes ACK auftritt, so wird der Schwellenwert auf Staufenster/2 und das Staufenster auf den Schwellenwert gesetzt -* Wenn ein Timeout auftritt, so wird der Schwellenwert auf Staufenster/2 und das Staufenster auf 1 MSS gesetzt -* Erweiterungen: Fast Retransmit, fast recovery - * Ergreifen korrigierende Aktionen ohne auf ein Timeout warten zu müssen - * Nötig für Netze mit großen Bandbreitenverzögerungen -* Verschiedene TCP Versionen: TCP Tahoe, TCP Reno, TCP Vegas -* Größte Quelle für Komplikationen: Die Dummheit des Netzwerks - -#### TCP Performance -##### TCP Durchsatz -Der Durchschnittliche Durchsatz von TCP ist 0,75 · W/RTT - -##### TCP Fairness -* Fairnessziel: Wenn K TCP Sitzugen des selben Flaschenhalses mit Bandbreite R durchschreiten müssen, so sollten alle eine durchschnittliche von R/K haben. -* TCP ist fair, da: - * Eine additive Erhöhung eine Steigung von 1 ergibt, sobald sich der Durchsatz erhöht - * Multiplikative Verringerung den Durchsatz proportional verringert - -#### Fairness -###### Fairness und UDP -UDP wird für Multimediaanwendungen verwendet, da sie durch die Staukontrolle nicht gedrosselt werden wollen, wir senden also mit konstanter Rate und kümmern uns nicht um Verluste - -###### Fariness und parallele TCP-Verbindungen -* Programme können mehrere TCP-Verbindungen zu einem Host aufbauen -* Beispiel: Linkrate R unterstützt 9 Verbindungen - * Eine neue Anwendung fragt nach einer TCP Verbindung und erhält Rate R/10 - * Eine neue Anwendung fragt nach neun TCP Verbindungen und erhält Rate R/2 - -###### Verzögerungsmodellierung -* Wie lange dauert es, bis ein Objekt nach der Anfrage bei einem Webserver empfangen wird? - * Ohne Stau nur abhängig vom Verbindungsaufbau, der Datenübertragungsverzögerung und Slow Start -* Bemerkungen: - * Link L zwischen Client und Server mit Rate R, S = MSS, O = Objektgröße in Bits, keine Neuübertragungen - * Fenstergröße: - * Zuerst feste Größe, W Segmente - * Dann dynamische Fenster und Slowstart - -###### Festes Staufenster -1. WS/R > RTT + S/R: ACK für das erste Segment im Fenster kommt an, bevor einganzes Fenster an Daten verschickt wurde, erlaubt kontinuierliches Dauersenden - ``` - delay = 2RTT + O/R - ``` -2. WS/R < RTT + S/R: Warte auf das ACK nachdem ein Sendefenster an Daten geschickt wurde - ``` - delay = 2RTT + O/R + (K-1)[S/R + RTT - WS/R] - ``` - -###### TCP Verzögerungsmodellierung: Slow Start -* Die Verzögerung für ein Objekt ist die folgende: - ``` - Latenz = 2RTT + O/R + P[RTT+S/R]-((2^p)-1) · (S/R) - ``` -* Wobei P die Anzahl an Zeiten ist, in denen TCP beim Server in Bereitschaft ist: - ``` - P = min{Q, K-1} - ``` -* wobei Q die Anzahl an Zeiten ist, in denen der Server in Bereitschaft ist, unter der Bedingung, dass die Objekte von unendlicher Größe wären -* und K die Anzahl an Fenstern ist, welche das Objekt belegt -* Mit den Verzögerungskomponenten: - * 2RTT für Verbindungsaufbau und Anfrage - * O/R um das Objekt zu Übertragen - * Zeit die der Server durch Slowstart ruht - -### Fallstudie HTTP Modellierung -* Eine Webseite besteht aus folgenden Teilen - * 1 Basis HTML Seite von O Bits - * M Bildern zu je O Bits -* Nichtpersistentes HTTP (eine Verbindung pro Objekt) - * M+1 TCP Verbindungen in einer Reihe - * Antwortzeit: - * (M+1) · O/R + (M+1) · 2RTT + Idlezeiten -* Persistentes HTTP (eine Verbindung für alle Objekte) - * 2RTT für die Anfrage und den Empfang der Basis HTML Datei - * 1 RTT zum Anfordern der Bilder und deren Erhalt - * Antwortzeit - * (M+1) · O/R + 3RTT + Idlezeiten -* Nichtpersistentes HTML mit X parallelen Verbindungen - * 1 TCP Verbindung für die Basisdatei - * M/X parallele Verbindungen für die Bilder - * Antwortzeit - * (M+1) · O/R + (M/X +1) · 2RTT + Idlezeiten - -#### HTTP Antwortzeiten -* Für kleine Bandbreiten wird die Verbindungs- und Antwortzeit durch die Übertragungszeit dominiert - * Persistente Verbindungen zeigen nur geringfügige Verbesserungen gegenüber parallelen Verbindungen -* Bei größeren RTTs wird die Antwortzeit vom TCP - Aufbau und Slowstartverzögerungen dominiert - * Persistente Verbindungen sind nun deutlich im Vorteil, insbesondere in Netzen mit großem Bandwithdelayprodukt - -## Zusammenfassung Kapitel 8 -* Prinzipien hinter Transportlayerdiensten - * Adressierung, Mulitplexing, Demultiplexing - * Verbindungskontrolle - * Flusskontrolle - * Staukontrolle -* Instantiierung und Implementierung im Internet - * UDP - * TCP -* Drei wichtige Protokollfunktionen sind bei TCP direkt in einem Sliding Window Protokoll implementiert: - * Fehlerkontrolle: Durch Sequenznummern, ACKs und Neuübertragungen - * Flusskontrolle: Durch Inspizieren von ACKs und Permits - * Staukontrolle: Durch das Verlangsamen des Senders, wenn Pakete oder ACKs verloren gehen - -# Kapitel 9: Internet Application Layer -## Erstellen einer Netzwerkanwendung -* Schreibe Programme, die: - * auf verschiedenen Endsystemen laufen - * über ein Netzwerk kommunizieren -* Keine Software wird explizit für das Kernnetzwerk geschrieben - * Kernnetzgeräte arbeiten nicht auf der Anwendungsschicht - * Dieses Design erlaubt extrem schnelle Anwendungsentwicklung - -## Prinzipien von Netzwerkanwendungen: Architekturen -* Client-Server -* Peer-to-Peer -* Hybride aus Client-Server und Peer-to-Peer - -### Client-Server Architektur -* Server - * ständig eingeschaltet und mit permanenter IP-Adresse - * Serverfarmen zur Skalierung -* Clients - * Kommunizieren zeitweise mit dem Server - * Können dynamische IP-Adressen haben - * Kommunizieren nie direkt miteinander - -### Peer-to-Peer Architketur -* Ohne ständig eingeschalteten Server -* Beliebige Endsysteme kommunizieren direkt miteinander, sind dabei zeitweise verbunden und haben wechselnde IP Adressen - -### Hybride Client-Server und P2P -* Ursprüngliches Napster-Filesharing - * Filetransfer über P2P, mit zentralisierter Dateisuche -* Instant Messaging - * Chatten zwischen den Anwendern verwendet P2P - * Anwesenheitserkennung und Lokalisierung ist zentralisiert - -## Prozesskommunikation -* Prozesse: Programm welches auf einem Host ausgeführt wird - * Zwei Prozesse welche auf einem Host laufen, verwenden Interprozesskommunikation um zu kommunizieren - * Prozesse auf unterschiedlichen Hosts verwenden Nachrichtenaustausch - * Clientprozess: Initiiert die Verbindung - * Serverprozess: Wartet darauf kontaktiert zu werden - * Bemerkung: Anwendungen, welche die P2P Architektur verwenden, haben Client und Server Prozesse - -### Sockets -* Prozesse Senden und Empfangen Nachrichten an oder von ihrem Socket -* Application Programming Interface - * Wahl des Transportprotokolls - * Möglichkeit einige Parameter zu definieren - -### Adressierung von Prozessen -* Prozesse die Nachrichten empfangen sollen, müssen einen Bezeichner haben -* Jeder Host hat eine einzigartige 32-Bit IP-Adresse sowie eine Portnummer, beides zusammen ist durch den Bezeichner dann beschrieben - -## Durch das Anwendungsprotokoll festgelegte Eigenschaften -* Arten von ausgetauschten Nachrichten -* Syntax der Nachrichtenarten und Semantik der einzelnen Felder -* Regeln darüber, wann Prozesse, wie welche Nachrichten senden und darauf reagieren -* Offene vs. proprietäre Protokolle - * Public-Domain Protokolle - * offen für jeden Zugänglich, erlauben Interoperabilität - * Beispiel: HTTP, FTP, SMTP - * Proprietäre Protokolle - * Definiert durch einen Vertreiber, meist keine öffentlichen Spezifikationen - * Beispiel: KaZaA, Skype - -### Welche Transportdienste werden von den Anwendungen benötigt? -* Datenverlust - * Audio verkraftet einiges an Verlust - * Datenaustausch oder Telnet benötigen einen 100% zuverlässigen Datenaustausch -* Zeitliches Verhalten - * Internettelefonie oder Games brauchen kurze Latenzen -* Bandbreite - * Multimediaanwendungen benötigen teils eine minimale Bandbreite um funktionieren zu können - * Elastische Anwendungen hingegen, kommen mit so viel Bandbreite zurecht, wie sie eben zugesprochen bekommen - -## Internettransportprotokolldienste -* TCP - * Verbindungsorientiert -> Verbindungsaufbau zwischen Client und Server benötigt - * zuverlässiger Transport - * Flusskontrolle -> Der Sender überlastet den Empfänger nicht - * Staukontrolle -> Verlangsame den Sender, wenn das Netzwerk nahe der Belastungsgrenze ist - * Nicht vorhanden -> Timing, Garantien über die Bandbreite -* UDP - * Unzuverlässiger Datentransfer - * Nicht bereitgestellt - * Verbindungsaufbau - * Zuverlässigkeit - * Fluss- und Staukontrolle - * Timing oder Bandbreitengarantien - -## Web & HTTP -* Eine Website beseht aus Objekten -* Objekte können ein Bild, eine HTML Datei, ein Java Applet sein -* Eine Webseite besteht aus einer grundlegenden HTML Datei, welche verschiedene Referenzen auf Objekte enthält -* Jedes Objekt ist durch eine URL adressierbar - -### HTTP Übersicht -HTTP - Hyper Text Transfer Protocol -* Das Anwendungsnachrichtenprotokoll des Webs -* Client-Server Modell -* Wichtige Entwicklungsstufen: - * HTTP 1.0 (schließt die Verbindung nach jeder Anfrage) - * HTTP 1.1 (hält die Verbindung auch weiterhin Aufrecht) -* HTTP verwendet TCP - * Clients bauen eine TCP Verbindung zum Server an Port 80 auf - * Server akzeptieren diese Anfragen und HTTP Nachrichten werden zwischen dem Browser und dem Webserver ausgetauscht - * Die TCP Verbindung wird geschlossen -* HTTP selbst ist zustandslos, d.h. der Server hält keine Informationen über frühere Besuche auf der Website - -### HTTP Verbindungen -* Nichtpersistentes HTTP: - * höchstens ein Objekt wird über die TCP Verbindung verschickt - * HTTP/1.0 ist nichtpersistent -* Persistentes HTTP - * Mehrere Objekte können über eine TCP Verbindung zwischen Client und Server ausgetauscht werden - * HTTP/1.1 verwendet standardmäßig Persistenz - -### Antwortzeitmodellierung -> RTT\ -> Benötigte Zeit um ein kleines Paket so zu senden, dass es vom Client zum Server und zurück geschickt wird. - -* Antwortzeit - * eine RTT um die TCP Verbindung aufzubauen - * eine RTT für die HTTP Anfrage und die ersten paar Bytes der Antwort -* Totalzeit - * 2 RTT + Dateiübertragungszeit - -### Persistentes HTTP -* Probleme nicht persistenten HTTPs - * Benötigt 2RTT pro Objekt - * Allokierung von Hostressourcen für jede TCP Verbindung - * Browser können immerhin oftmals mehrere TCP Verbindungen aufbauen, um referenzierte Objekte zu Empfangen -* Persistentes HTTP - * Der Server lässt die Verbindung auch nach der Antwort noch am Leben - * Nachfolgende HTTP Nachrichten werden also über den selben, bereits allokierten Kanal gesendet -* Persistenz ohne Pipeling - * Der Client stellt nur dann eine Anfrage, wenn die vorherige Antwort empfangen wurde - * Eine RTT für jedes referenzierte Objekt -* Persistenz mit Pipelining - * Standard in HTTP/1.1 - * Der Client sendet eine Anfrage, sobald er ein referenziertes Objekt entdeckt - * Nur eine RTT für alle referenzierten Objekte - -### HTTP Anfragenachrichten -Insgesamt nur zwei Arten von Nachrichten: request und response - -![screenshot013.png](/core/preview?fileId=295415&x=1024&y=1024&a=true#mimetype=image%2Fpng&hasPreview=true&fileId=295415) - -### Hochladen von Einfaben -* POST Methode - * Webseiten beinhalten oft Formulareingaben, die Eingabe wird dann im Entity Body an den Server geschickt -* URL Methode - * Verwendet die GET Methode - * Die Eingaben werden im URL Feld der Requestline hochgeladen - -### Methodentypen -* HTTP 1.0 - * GET - * POST - * HEAD (Anweisung, das angefragte Element in der Antwort außen vor zu lassen) -* HTTP 1.1 - * GET, POST, HEAD - * PUT (Läd die Datei im Entity Body an den in der URL spezifizierten Pfad) - * DELETE (Löscht die in der URL spezifizierte Datei) - -### HTTP Statuscodes -* 200 OK - Anfrage okay, das angefragte Objekt folgt -* 301 Moved Permanently - das angefragte Objekt wurde verschoben, der neue Pfad folgt -* 400 Bad Request - Anfrage wurde nicht verstanden -* 404 Not Found - angefrodertes Objekt konnte auf dem Server nicht gefunden werden -* 505 HTTP Version not supported - -### HTTP Webcaching und Cookies -#### Nutzer-Server-Zustand: Cookies -* Vier Komponenten - * Cookieheaderzeile in der Antwort - * Cookieheaderzeile in der Anfrage - * Die Cookiedatei wird auf dem Rechner des Hosts gespeichert und vom Browser verwaltet - * Speichern der Cookieinformationen in einer Backenddatenbank der Webseite -* Welchen Nutzen haben Cookies? - * Autorisierung - * Warenkörbe und Empfehlungen - * Nutzersitungszustand - -> Cookies erlauben es den Webseite viel über einen Nutzer herauszufinden, -man gibt beispielsweise unfreiwillig Namen und Emailadressen weiter, -welche zum Beispiel für Werbeagenturen gefundenes Fressen sind. - -#### Webcaches (Proxyserver) -Ziel: Bedienen der Clientanfrage ohne den urpsrünglichen Webserver dabei zu involvieren -* Der Nutzer stellt den Browser so ein, dass dieser über einen Cache auf das Netz zugreift -* Alle Anfragen des Browsers gehen zuerst an den Cache, hat er das angefragte Material, so wird er dieses an den Client schicken, oder andernfalls beim Webserver besorgen und dem Client dann weiterleiten - -##### Weitere Informationen über Webcaches -* Der Cache agiert sowohl als Client als auch als Server -* Gründe für Webcaches - * Reduzieren von Antwortzeiten für Clientanfragen - * Reduzieren von Verkehr auf dem Zugangslink des ISPs - * Ein Internet voller Caches erlaubt es armen Anbietern effektiv Inhalte zu übertragen - -##### Bedingtes GET -* Ziel: Sende das Objekt nicht, wenn eine aktuelle Version des Objekts bereits im Cache liegt -* Cache: Spezifiziere das letzte Änderungsdatum der Datei im Cache in der HTTP Anfrage -* Server: Die Antwort beinhaltet das Objekt nur dann, wenn die Kopie im Cache veraltet ist - -### Webserverarchitekturen -#### Grundlegende Webserveraufgaben -* Zum Empfang von Anfragen bereitmachen -* Annehmen von Verbindungen und Anfragen -* Lesen und Verarbeiten von Anfragen -* Antworten auf Anfragen -* Bereitmachen und Annehmen von Anfragen - -#### Webserverarchitekturen -* Prozessmodell -* Threadmodell -* In-Kernel Modell -* Eventbasiertes Modell - -##### 1. Prozessmodell -* Einem Prozess werden alle benötigten Schritte zugewiesen, welche benötigt werden, um eine Anfrage zu bearbeiten -* Wenn die Bearbeitung abgeschlossen ist, so ist der Prozess wieder in der Lage neue Verbindungen zu akzeptieren -* Typischerweise werden mehrere Prozesse benötigt -* Ein Prozess blockiert, beispielsweise read(), dann entscheidet das OS, welcher Prozess als nächstes ausgeführt werden darf -* Die Parallelität wird durch die Anzahl an Prozessen limitiert -* Beispiel: Apache auf UNIX -* Vorteile - * Synchronisation dem Prozessmodell inhärent - * Absicherung zwischen Prozessen -* Nachteile - * Langsam - * Schwere Ausführbarkeit von Operationen, welche auf globalen Informationen beruhen - -##### 2. Threadmodell -Verwende Threads anstelle von Prozessen -* Motivation: - * Threaderstellung und Threadlöschung ist billiger - * Austausch von Daten zwischen Threads ist einfacher als bei Prozessen, aber Synchronisation wird nun für geteilte Daten benötigt -* Beispiele: - * JAWS, IIS, Apache unter Windows -* Vorteile: - * Schneller als Prozesse - * Teilen standardmäßig aktiv -* Nachteile: - * Benötigt OS Unterstützung - * Kann per Prozess Limitierungen überlasten - * Beschränkte Kontrolle über Schedulingentscheidungen - -##### 3. In-Kernel Modell -* Eine Möglichkeit: ganzer Server im Kernel -* Meist: nur statische Dateien werden vom Kernel bedient, andere Anfragen gehen an den regulären User-Space-Server -* Dedizierter Kernelthread für HTTP Anfragen -* Vorteile: - * Vermeidet das Kopieren von und in den Userspace - * Sehr schnell, solange es eng in den Kernel integriert ist -* Nachteile: - * Bugs können das OS, also die ganze Maschine crashen - * Schwer zu debuggen und zu Erweitern - * Inhärent OS-spezifisch -* Beispiele: - * khttpd - * TUX - * AFPA (Advanced Fast Path Architecture) - -##### 4. Eventbasiertes Modell -Verwenden eines einzelnen Webserverprozesses um mehrere Anfragen zu behandeln -* Beispiele: Zeus, Flash, Boa, Mathopd, ScatterWeb EWS -* Ein einzelnes HTTP Servermodell mit einer Liste an HTTP Verbindungen: list[index]; -* myHttpConnection[index].status = {response, begin, end, dynamic} -* myHttpConnection[index].PosInPage = readpointer; -* Vorteile - * Sehr schnell, kein Kontextwechsel - * Inhärentes Teilen ohne Locks - * Komplette Kontrolle über die Schedulingentscheidungen - * Kein komplexer OS-Support benötigt -* Nachteile - * Per-Prozess Begrenzungen - * Nicht jedes OS mit voll asynchroner E/A, so können beim Lesen immernoch Blockierungen entstehen - * Flash verwendet immerhin Hilfsprozesse um dies zu verhindern - -#### Performancevergleich -###### Webservercluster -* Zwei Wege um die Kapazität zu erhöhen: - * eine größere Maschine - * Cluster an billigen Standardmaschinen, beispielsweise PCs -* Zur Zeit dominiert v.a. die zweite Variante aufgrund: - * der Skalierbarkeit - * der Hochverfügbarkeit - * der Kosten -* Es stellt sich eine wichtige Designfrage: Anfragenverteilung - * Traditionell: Round Robin - * Effizienter: Inhaltsbasiert - -#### FTP: Das Dateitransferprotokoll -* Übertrage Daten von und zum Server -* Client Server Modell -* Standard FTP Port: 21 - -##### Separate Kontroll- & Datenverbindung -* Der FTP Client kontaktiert den Server auf Port 21 und verwendet dazu das TCP Protokoll -* Der Client wird über eine Kontrollverbindung autorisiert -* Der Client kann nun auf dem entfernten Verzeichnis arbeiten, idem er Kommandos über die Kontrollleitung sendet -* Wenn ein Server ein Kommando zum Dateitransfer erhält, so öffnet er eine TCP Datenverbindung zum Client -* Nachdem eine Datei übertragen wurde, schließt der Server die Verbindung, im Falle von einer weiteren zu übertragenden Datei, eröffnet der Server eine zweite TCP Datenverbindung -* -> Out of Band Kontrolle -* FTP Server behalten den Zustand, also derzeitiges Verhältnis und frühere Authentifizierung - -##### FTP Kommandos und Antworten -* Beispielkommandos: - * gesendet als ASCII Text über die Kontrollleitung - * USER username - * PASS password - * LIST gibt den Inhalt des aktuellen Verzeichnis aus - * RETR filename holt die Datei - * STOR filename speichert die Datei auf dem entfernten Host -* Beispielrückgabecodes: - * Statuscode und Phrase (wie bei HTTP) - * 331 Username OK. password required - * 125 data connection already open: transfer starting - * 425 can't open data connection - * 452 Error writing File - -#### Electronic Mail: E-Mail -* Bestehend aus drei Hauptkomponenten - * Useragent - * Mailserver - * Einfaches Mailübertragungsprotokoll: SMTP -* Useragent - * Erlaubt das Schreiben, Lesen und Bearbeiten von Nachrichten - * Ein- und ausgehende Nachrichten werden auf einem Server gespeichert -* Mailserver - * Die Mailbox beinhaltet eingehende Nachrichten, die Nachrichtenschlange die ausgehenden Nachrichten - -##### SMTP -* Verwendet TCP um Nachrichten zuverlässig vom Client zum Server zu übertragen, verwendet Port 25 -* Direkte Übertragung: vom Sender zum Empfänger -* Dreiphasige Übertragung - * Handshaking - * Übertragung der Nachrichten - * Terminieren der Verbindung -* Kommando/Antwort Interaktion - * Kommandos: ASCII Text - * Antwort: Statuscode und Phrase -* Nachrichten müssen in 7 Bit ASCII kodiert sein -* SMTP verwendet persistente Verbindungen -* SMTP Server verwenden CRLF um das Ende einer Nachricht zu erkennen - * Führt zu Problemen, wenn man versucht ohne Bitstuffing einen einzelnen . zu versenden - -###### SMTP Vergleich mit HTTP - -* Beide verwenden ASCII Statuscodesund Kommando/Antwort Interaktion -* HTTP: - * PULL: Der Initiator fragt den Antwortenden nach den Inhalten welche er haben möchte - * Jedes Objekt in eigener Antwortnachricht -* SMTP: - * PUSH: Der Initiator sendet dies, welches er kommunizieren will an den Antwortenden - * Mehrere Objekte werden in einer mehrteiligen Nachricht gesendet - -##### Mailnachrichtenformat -* SMTP als Protokoll, um Nachrichten auszutauschen -* RFC 822 als Standard für das Textnachrichtenformat -* Headerzeilen, beispielsweise: - * To: - * From: - * Subject: -* Body: - * Die Nachricht, bestehend nur aus ASCII Zeichen - -###### Nachrichtenformat: Multimediaerweiterungen -* MIME: Multimedia Mail Extensions -* Zusätzliche Zeilen im Nachrichtenheader deklarieren den MIME Inhaltstyp - -##### Mailzugriffsprotokolle -* SMTP: Zustellen/Speichern auf dem Empfangsserver -* Mailzugriffsprotokoll: Anfordern vom Server - * POP: Post Office Protocol - * Autorisierung und Download - * IMAP: Internet Mail Access Protocol - * Mehr Features aber komplexer - * Manipulation der serverseitig gespeicherten Nachrichten - * HTTP: Yahoo Mail, Hotmail, etc. - -##### POP3 -* Autorisierungsphase - * Clientkommandos: - * user: Nutzernamen deklarieren - * pass: Passwort übermitteln - * Serverantworten - * +OK - * -ERR -* Transaktionsphase - * Client - * list: Listet die Nachrichtennummern auf - * retr: Ruft die Nachrichten durch ihre Nummern ab - * dele: Löscht die Nachricht - * quit: Logout - -##### POP3 und IMAP -* POP3 - * Das Beispiel nutzt den Download und Delete Modus - * Bob kann die Emails also nicht nochmals lesen, wenn er den Client wechselt - * Download und Keep: - * Ermöglicht es Kopien von Nachrichten auf mehreren Clients zu haben - * POP3 ist zustandlos über mehrere Sitzungen -* IMAP - * Behält alle Nachrichten am Server - * Erlaubt es Nachrichten geräteübergreifend in Ordnern zu organisieren - * IMAP hält den Nutzerzustand über Sitzungsgrenzen hinweg - -### DNS - Domain Name System -* Für Menschen gibt es viele verschiedene Bezeichner, für Internethosts und Router gibt es IP Adressen und Namen, doch wie kann man einen Namen auf eine IP-Adresse mappen? -* DNS - * verteilte Datenbank implementiert in der Hierarchie von vielen verschiedenen Nameservern - * Anwendungsschichtprotokoll für Hosts, Router und Nameserver zum Kommunizieren zur Namensauflösung -* DNS Dienste - * Hostname auf IP Adressen Übersetzung - * Host Aliasing - * Mailserver - * Lastverteilung mittels replizierter Webserver - Eine Menge von IP-Adressen für einen cannonical Namen -* Warum zentralisiert man DNS nicht? - * Single Point of Failure - * Verkehrsaufkommen, Instandhaltung und Wartung - * Eine zentrale Autorität über die weltweite Namensauflösung? - --> Skaliert einfach viel zu schlecht - -#### Verteilte hierarchische Datenbank -* Client möchte die IP für www.amazon.com - * Rootserver wird nach dem .com Server gefragt - * .com DNS Server wird nach dem amazon.com DNSServer gefragt - * Der Client fragt den amazon.com DNS Server nach der IP für www.amazon.com - -#### DNS: Root Name Server -* Kontaktiert von einem lokalen Nameserver, welcher den Namen nicht auflösen kann -* Root Name Server - * Kontaktiert den autorativen Nameserver, falls das Namensmapping unbekannt ist, erhält das Mapping und leitet dies an den lokalen Nameserver zurück - -#### TLD, Authorative und lokale DNS Server -* TLD (Top Level Domain) Server - * Verantwortlich für .com, .org, .net, .edu und die Landesdomains -* Authorative DNS Server - * DNS Server einer Organisation, stellen den authorativen Hostnamen für das IP Mapping der Organisationsserver - * Verwaltung durch Organisation oder Dienstanbieter -* Lokale DNS Server - * Gehören nicht strikt zur Hierarchie - * Jeder ISP hat einen eigenen - * Wenn ein Host eine DNS Anfrage stellt, so wird die Frage zuerst zum lokalen DNS Server gesendet (fungiert also als ein Proxy) - -##### Iterative Anfragen -Der kontaktierte Server antwortet mit dem Namen des zu kontaktierenden Servers: "Ich kenne seinen Namen nicht, aber frage diesen Server und er wird dir helfen können" - -##### Rekursive Anfragen -* Legt dem kontaktierten Server die Namensauflösung auf -* Aufgrund der hohen Last nicht durch TLD oder Rootserver unterstützt - -#### DNS Caching und Updaten von Records -* Sobald ein Server ein Mapping kennenlernt, cacht er diese für eine bestimmte Zeit - * TLD Server sind typischerweise in lokalen Nameservern gecacht, sodass nicht jedes mal der Rootserver besucht werden muss -* Update-/Benachrichtigungsmechanismen - * Verwendet von DHCP Servern um DNS Einträge in den Servern aktuell zu halten - * Alternativ auch DDNS über HTTPS um DNS Einträge für Hosts mit oft wechselnden IP Adressen zu aktualisieren - -#### DNS Records -* DNS: Verteilte Datenbank, welche die Ressource Records (RR) speichert - > RR Format: (name, value, type, ttl) -* Typ A -* name = Hostname -* value = IP Adresse -* Typ NS - * name = die Domain - * value = IP des authorativen Nameservers für diese Domain -* Typ MX - * value ist der Name des Mailservers, welcher mit dem name assoziert ist -* Typ CNAME - * name ist der Aliasname für irgendeinen cannonical Namen - * www.ibm.com ist tatsächlich servereast.backup2.ibm.com - * value ist der cannonical Name - -#### DNS Protokoll, Nachrichten -* DNS Protokoll: Frage und Antwortnachrichten mit selbem Nachrichtenformat -* Nachrichtenheader - * Identfizierung - 16 Bit Nummer für die Frage, identisch für die Antwort - * Flags - * Frage oder Antwort - * Rekursion erwünscht - * Rekursion verfügbar - * Antwort ist authorativ - -##### Einfügen von Records ins DNS -* Registrieren den Namen bei einem Registrar - * Müssen dem Registrar die Namen und IP Adressen von unserem authorativen Nameserver bereitstellen - * Der Registrar fügt zwei RRs in den .com TLD Server: - * (networkutopia.com, dns1.networkutopia.com, NS) - * (dns1.networkutopia.com, 212.212.212.1, A) - * Setzen dann einen Typ A Record für www.networkutopia.comund einen Typ MX Record für networkutopia.com in den authorativen Server - -### P2P Filesharing -* Ausführung eines Filesharingclients auf dem eigenen Rechner, erhalten für jede Verbindung eine neue IP Adresse, suchen nach einer Datei, welche Alice von Bob kopieren will. Währenddessen können andere Leute schon bei Alice Dateien per HTTP kopieren -* Ein Peer ist sowohl ein Webclient als auch ein transienter Webserver -* Alle Peers sind Server -> Hoch Skalierbar - -#### Probleme mit einem zentralisierten Verzeichnis -* Ein Single Point of Failure -* Performanceflaschenhals -* Copyrightverletzungen -> Dateiübertragung ist dezentralisiert, die Lokalisierung findet allerdings zentral statt. - -#### Anfragefluten: Gnutella -* Grundlegende Eigenschaften - * komplett verteilt, also kein zentraler Server - * Viele Gnutella Clients implementieren das Public Domain Protocol -* Overlaynetzwerk: Graph - * Kante zwischen Peer X und Y, falls eine TCP Verbindung zwischen ihnen existiert - * Alle aktiven Kanten und Knoten formen das Overlaynetzwerk - * Eine Kante ist **kein** physischer Link - -##### Gnutella Protokoll -* Fragenachricht wird über existierende TCP Verbindungen geschickt -* Peers leiten die Anfragenachricht weiter, Anfragentreffer werden dann rückwärts über den Pfad geschickt - -##### Gnutella Peerjoining -* Ein neu hinzukommender Peer X muss andere Peers im Gnutellanetzwerk finden: verwende hierzu eine Liste an Peerkandidaten -* X versucht sequentiell Verbindungen mit Peers aufzubauen, bis X die Verbindung mit Y aufbaut -* X sendet eine Pingnachricht an Y, Y leitet diese weiter -* Alle Peers die dadurch eine Pingnachricht erhalten, senden eine Pongnachricht zurück -* X erhält nun viele Pongnachrichten. Hierauf kann X nun viele neue Verbindungen eingehen - -### Socketprogrammierung mit TCP -Ziel: Lernen wie man Client/Server Anwendungen programmieren kann, welche Sockets zur kommunikation verwenden. -* Eingeführt in BSD 4.1 UNIX -* Sockets werden explizit erstellt, benutzt und durch Anwendungen freigegeben -* Client/Server Paradigmen -* Zwei Artenvon Transportdiensten über die Socket API: - * Unzuverlässige Datagramme - * Zuverlässig & Bytestromorientiert -> Socket\ -> Ein lokal auf dem Host laufendes, von einer Anwendung erstelltes, OS-kontrolliertes Interface, durch welches ein Anwendungsprozess sowohl Nachrichten vom und zu anderen Anwendungsprozessen Senden, als auch Empfangen kann. - -#### Socketprogrammierung unter Verwendung von TCP -* Socket: Tür zwischen Anwendungsprozess und dem Ende zu Ende Transportprotokoll -* TCP Dienst: zuverlässsige Übertragung von Bytes von einem Prozess zu einem anderen Prozess -* Der Client muss den Server kontaktieren - * Der Serverprozess muss zuerst ausgeführt werden und einen Socket erstellt haben, welcher auf den Clientkontakt wartet -* Der Client kontaktiert den Server durch: - * Erstellen eines lokalen TCP Sockets - * Spezifizieren der IP-Adresse und der Portnummer des Serverprozess - * Wenn der Client den Socket erstellt, dann baut das Client TCP eine Verbindung zum Server-TCP auf, das Server TCP erstellt daraufhin auch einen neuen Socket, sodass nun kommuniziert werden kann. - * Dies erlaubt es dem Server mit mehreren Clients zu sprechen - * Die Quellportnummern unterscheiden die Clients - > Sichtweise der Anwendung\ - > TCP stellt eine zuverlässige und reihenfolgegetreue Übertragung von Bytes zwischen Client und Server sicher - -#### Stream Jargon -* Ein Stream ist eine Sequenz aus Zeichen, welche in oder aus einem Prozess fließen -* Ein Eingangsstream ist an eine Eingabequelle gebunden, beispielsweise eine Tastatur oder einen Socket -* Ein Ausgangsstream ist an eine Ausgabequelle gebunden, wie einen Monitor oder einen Socket - -### Socketprogrammierung mit UDP -Bei UDP: Keine Verbindung zwischen Client und Server -* Kein Handshaking -* Der Sender fügt die IP-Adresse und den Zielport des Ziels explizit an jedes Paket -* Der Server muss die IP-Adresse und den Port des Senders aus dem erhaltenen Paket extrahieren -* Bei UDP können Daten nicht reihenfolgegetreu ankommen, oder verloren gehen -> Sichtweise der Anwendung\ -> UDP stellt eine unzuverlässige Übertragung von Gruppen an Bytes zwischen Client und Server bereit - -### Bauen eines einfachen Webservers -* Behandelt eine HTTP Anfrage, akzeptiert diese und parst den Header -* Zieht die angeforderte Datei vom Serverdateisystem -* Erstellt eine HTTP Antwortnachricht: Headerzeilen + Datei -* Sendet die Antwort an den Client - -## Zusammenfassung Kapitel 9 -* Anwendungsarchitekturen - * Client/Server - * Peer2Peer - * Hybride -* Anforderungen an Anwendungsdienste - * Zuverlässigkeit, Bandbreite, Verzögerung -* Internettransportdienstmodelle - * Verbindungsorientiert, verlässlich: TCP - * Unzuverlässig, mit Datagrammen: UDP -* Spezifische Protokolle - * HTTP - * FTP - * SMTP, POP, IMAP - * DNS -* Socketprogrammierung -* **Das wichtigste: Anwendungsprotokolle** - * Typischerweise Anfrage/Antwort Nachrichtenaustausch - * Clients fragen Info oder Dienst an - * Server antworten mit Daten und Statuscode - * Nachrichtenformate - * Header: Felder welche Info über die Daten geben - * Daten: Informationen, welche kommuniziert werden - * Kontroll vs. Datennachrichten - * In-Band vs. Out-of-Band - * Zentralisiert vs. Dezentralisiert - * Zuverlässiger vs. unzuverlässiger Nachrichtenaustausch - * Komplexität am Rande des Netzwerks - ---- -# Kapitel 10: Netzwerk Sicherheit -## Einführung - Bedrohungen, Sicherheitsziele, Schutzmaßnahmen -### Was ist eine Bedrohung in einem Kommunikationsnetzwerk? -* Abstrakte Definition - * Eine Bedrohung in einem Kommunikationsnetzwerk ist jedes mögliche Ereignis oder eine Sequenz von Aktionen, welche zu einer Verletzung einer oder mehrerer Sicherheitsziele führen - * Die Realisierung einer Bedrohung wird Attacke genannt -* Beispiele: - * Hacker brechen in Computer ein, Emails werden verändert, Finanzdaten werden verändert, ein Hacker legt eine Webseite lahm -* Was sind Sicherheitsziele: - * Sicherheitsziele können definiert werden: - * Abhängig vom Anwendungsumfeld, oder einem generelleren, technischeren Weg - -#### Sicherheitsziele (Security Objectives) in Abnhängigkeit von der Anwendungsumgebung -* Banking - * Schutz gegen Betrüger oder versehentliche Veränderung an Transaktionen - * Eindeutiges und fälschungssicheres Identifizieren der Kunden - * Sichern der PINs gegen zufälllige Entdeckung und der Privatspäre der Kunden -* Elektronisches Handeln - * Schützen der Privatsphäre der Kunden und des Unternehmens - * Bereitstellen von rechtlich bindenden Signaturen für Transaktionen -* und viele weitere im Bereich der Regierung, öffentlicher Telekommunikationsanbieter, Geschäfte und privater Haushalte -* Ziel ist es in jedem Fall sich gegen Angriffe von Außen zu schützen - -#### Sicherheitsziele technisch definiert -* Vertraulichkeit: - * Verschickte oder gespeicherte Daten sollen nur einem bestimmten Nutzerkreis zugänglich sein - * Vertraulichkeit von Instanzen wird auch als Anonymität bezeichnet -* Datenintegrität - * Es sollte möglich sein, jede Veränderung von Daten zu erkennen, dies benötigt unter anderem, die Möglichkeit den Ersteller von Daten identifizieren zu können -* Verantwortlichkeit - * Es sollte möglich sein, eine Instanz zu identifizieren, welche für irgendein Kommunikationsereignis zuständig ist -* Verfügbarkeit - * Dienste sollten verfügbar sein und auch funktionieren -* Kontrollierter Zugriff - * Nur autorisierte Instanzen solle in der Lage sein auf bestimmte Dienste oder Daten zuzugreifen - -#### Bedrohungen technisch definiert -* Maskerade (Spoofing) - * Eine Instanz behauptet jemand Anderes zu sein -* Abhören (Sniffing) - * Jemand versucht Daten zu lesen, welche er nicht lesen darf und soll -* Autorisierungsverletzungen - * Eine Instanz verwendet Ressourcen die sie nicht verwenden darf -* Verlust oder Veränderung von übertragener Information - * Veränderung oder Zerstörung von Daten -* Fälschung von Daten - * Eine Instanz erzeugt Daten im Namen einer Anderen -* Abstreiten von Kommunikationsereignissen (Repudiation) - * Eine Instanz streitet seine Beteiligung an einem Kommunikationsereignis ab -* Sabotage - * Jede Art von Aktion welche darauf abzielt, die Verfügbarkeit oder korrekte Funktion von Diensten zu reduzieren - -#### Sicherheitsanalyse von gelayerten Protokollarchitekturen -* Dimension 1: Auf welchem Interface findet der Angriff statt? -* Dimension 2: Auf welchem Layer findet der Angriff statt? - -##### Angriff auf dem Nachrichtenlevel -* Passive Übergriffe: - * Spähen -* Aktive Angriffe: - * Verzögerung von PDUs - * Wiederholung von PDUs - * Löschen von PDUs - * Veränderung von PDUs - * Einfügen von PDUs -* Ein erfolgreicher Angriff benötigt: - * Seiteneffektsfreiheit auf andere Kommunikationen - * Steineneffektsfreiheit auf andere PDUs in der selben Datenübertragung -* Eine Sicherheitsanalyse einer Protokollarchitektur muss diese Angriffe bezüglich der Layer der Architektur analysieren - -##### Sicherheitsmechanismen gegen Bedrohungen -* Physische Sicherheit: - * Abschließen der Betriebsräume, Zutrittskontrolle - * Tamper Proofing von sensitivem Equipment - * Schutz vor Überwachung der Umgebung -* Personelle Sicherheit - * Sensitivität bei Mitarbeitern erzeugen - * Überprüfung der Angestellten - * Sicherheitstraining -* Administrative Sicherheit - * Kontrollieren neuer Software - * Prozeduren um Sicherheitsverstöße zu erkennen - * Ansehen und Reagieren auf Audittrails -* Ausstrahlungssicherheit - * Steuerung von Frequenzen und anderer elektromagnetischer Ausstrahlungen -* Mediensicherheit - * Kontrollieren der Erstellung, Reproduktion und Zerstörung von Informationen - * Scannen von Medien auf Schadsoftware -* Lifecyclekontrollen - * Vertrauenswürdiges Systemdesign der Implementierung, Evaluation und Unterstüzung - * Dokumentierung - * Einhalten von Programmierstandards -* Computersicherheit - * Schutz der Informationen, während diese auf Rechnern gespeichert oder verarbeitet werden - * Schutz der Rechner selbst -* Kommunikationssicherheit - * Schutz der Informationen beim Transport von einem zum anderen System - * Schutz der Kommunikationsinfrastruktur an sich - -## Grundlagen der Sicherheitstechnologie -### Terminologie -* Sicherheitsdienst: - * Abstrakter Dienst, welcher versucht, eine bestimmte Sicherheitseigenschaft zu gewährleisten - * Kann mittels kryptographischer Algorithmen oder auf konventionelle Weise realisiert werden -* Kryptographischer Algorithmus - * Eine mathematische Transformation von Eingangsdaten (Daten, Schlüsseln) zu Ausgangsdaten -* Kryptographisches Protokoll - * Eine Serie an Schritten und Nachrichtenaustauschen zwischen mehreren Instanzen, um ein spezifisches Sicherheitsziel zu erfüllen - -### Sicherheitsdienste - Übersicht -* Authentisierung - * Grundlegender Sicherheitsdienst, welcher sicherstellt, dass eine Instanz tatsächlich die Identität hat, welche sie vorgibt zu haben -* Integrität - * Kleiner Bruder der Authentisierung, da er sicherstellt, dass Daten, welche von einer gewissen Einheit erstellt worden sind, nicht ohne Erkennung verändert werden können -* Vertraulichkeit - * Stellt sicher, dass die geschützen Daten geheim bleiben -* Zugriffskontrolle - * Kontrolliert, dass jede Identität nur auf die Informationen und Dienste zugreift, zu welchen sie auch zugriffsberechtigt ist -* Nicht Ablehnung - * Schütz davor, dass andere Einheiten nach einer Kommunikation behaupten können, nie daran teilgenommen zu haben - -### Kryptologie - Definition und Terminologie -* Kryptologie: - * Wissenschaft, die sich mit Kommunikation in sicherer und geheimer Art befasst - * Kryptologie besteht aus - * Kryptographie (graphein = schreiben): Die Lehre der Prinzipien und Techniken, durch welche Informationen in Ciphertext verpackt und später durch legitimierte Nutzer, wieder durch einen geheimen Schlüssel entschlüsselt werden können - * Kryptoanalyse (analyein = etwas lösen): Die Wissenschaft und Kunst Informationen von Ciphern wiederherzustellen und dies ohne das Wissen über den Schlüssel zu schaffen -* Cipher: - * Methode eine Nachricht so zu transformieren, dass die Bedeutung nicht mehr erkannt werden kann - * Cipher sind nur eine Klasse kryptographischer Algorithmen - * Die Transformation hat typischerweise eine Nachricht und einen geheimen Schlüssel als Eingabe - -#### Kryptographische Algorithmen -* Für die Netzwerksicherheit sind vor allem das Verschlüsseln und Signieren von Daten von Bedeutung: - * Verschlüsseln von Daten: Transformiert Plaintext in Ciphertext um die Inhalte zu verschleiern - * Signieren von Daten: Berechnet einen Checkwert oder eine digitale Signatur zu einem gegebenen Plaintext oder Ciphertext, sodass dieser durch alle oder einige Instanzen mit Zugriff verifiziert werden kann -* Prinzipielle Kategorien von Kryptographiealgorithmen - * Symmetrische Kryptographie verwendet einen Schlüssel für Ver- und Entschlüsselung oder Signieren und Überprüfen - * Assymmetrische Kryptographie verwendet zwei Schlüssel für Ver- und Entschlüsselung - * Kryptographische Hashfunktionen verwenden keinen Schlüssel (ist kein separater Input, wird in die Daten gemischt oder angehängt) - -#### Wichtige Eigenschaften von Verschlüsselungsalgorithmen -* Fehlerausbreitung: Charakterisiert die Effekte von Bitfehlern während der Übertragung von Ciphertext zum rekonstruierten Klartext -* Synchronisation: Charakterisiert die Effekte von verlorenen Ciphertexten auf den rekonstruierten Klartext - -##### Symmetrische Verschlüsselung -* Der selbe Schlüssel wird zur Ver- und Entschlüsselung eingesetzt -* Beispiele: DES, 3DES, AES, IDEA, RC4,… - -##### Asymmetrische Kryptographie -* Idee: - * Verwende zwei verschiedene Schlüssel +K und -K für Ver- und Entschlüsselung - * Gegeben ein zufälliger Ciphertext c = E(+K,m) und +K, so sollte es unmöglich sein, m = D(-K,c) zu berechnen - * Der Schlüssel -K ist nur A selbst bekannt und wird As privater Schlüssel genannt - * Der Schlüssel +K ist As öffentlicher Schlüssel, den jeder kennen darf -* Anwendungen: - * Verschlüsselung - * Wenn B eine Nachricht mit As öffentlichem Schlüssel +K verschlüsselt, so kann sich B sicher sein, dass nur A diese Nachricht mit dem Schlüssel -K entschlüsseln kann - * Signieren - * Wenn A eine Nachricht mit seinem privaten Key -K verschlüsselt, so kann jeder diese Signatur mit As öffentlichem Schlüssel +K entschlüsseln -* Praktische Überlegungen - * Asymmetrische Verschlüsselungsverfahren sind um Größenordnungen langsamer als symmetrische Verschlüsselung, deshalb verwendet man die asymmetrische Verschlüsselung eher in Verbindung mit symmetrischer, nämlich indem man die Datenmengen symmetrisch verschlüsselt, und nur den Schlüssel auf asymmetrische Art verschlüsselt - -##### Erkennung verschlüsselter Nachrichten -* Motivation - * Fehlererkennungscodes erlauben es uns zu erkennen, ob Nachrichten während der Übertragung durch Bitflips o.ä. verändert wurden (Parität, CRC, …) - * -> Wunsch nach ähnlichem Wert, welcher besagt, ob eine Nachricht mutwillig verändert wurde -* Realisierung von MCVs: - * Kryptographische Hashfunktionen - * Entweder kombiniert mit asymmetrischer Kryptographie um einen signierten modification detection code (MDC) zu erhalten, oder Inklusion eines geteilten, geheimen, mit der Nachricht gemischten Schlüssel in der Nachricht - * Message Authentication Codes - * Häufige message authentication codes (MAC) werden aus einem symmetrischen Blockcipher konstruiert - -##### Kryptographisches Protokoll -* Definition: Ein kryptographisches Protokoll wird definiert als eine Serie von Schritten und Nachrichtenaustauschen zwischen mehreren Einheiten um ein spezielles Sicherheitsziel zu erreichen -* Anwendungen kryptographischer Protokolle - * Schlüsselaustausch - * Authentisierung - * Integrität: Erlaubt dem Empfänger zu verifizieren, von wem eine Nachricht kam und ob sie verändert wurde - * Einheitenauthentisierung: Erlaubt es Kommunikationspartnern die Identität ihrer Peers zu verifizieren - -## Einführung in die Sicherheitsdienste von Kommunikationsnetzwerken -### Sicherheit in Netzwerken: Was sollen wir wo tun? -* Dimension 1: Welcher Sicherheitsdienst auf welchem Knoten? -* Dimension 2: Welcher Sicherheitsdienst auf welcher Netzwerkebene? - -### Pragmatisches Modelll für sicheres und vernetztes Rechnen -* Anwendung: - * Ein Stück Software muss eine gewisse Aufgabe ausführen, beispielsweise Email, Webdienste, Speichern von Daten, … -* Endsystem: - * Irgendein Gerät, von PC bis Server oder Mainframe - * Endsysteme haben aus Sicherheitsgründen typischerweise eine Richtlinienautorität -* Subnetzwerk: - * Sammlung von Kommunikationsstellen unter der Kontrolle einer administrativen Organisation - * Aus Sicherheitsgründen haben Subnetz typischerweise eine Richtlinienautorität -* Inter-Netzwerk: - * Sammlung von untereinander verbundener Subnetzwerken - * Grundsätzlich haben in einem Inter-Netzwerk verbundene Subnetze eigene, also verschiedene Richtlinienautoritäten -* Vier Ebenen mit jeweils unterschiedichen Anforderungen an Sicherheitsprotokollelemente - * Anwendungsebene: Sicherheitsptrotokollelemente sind anwendungsabhängig - * Endsystemebene: Bereitstellung von Schutz auf einer Endsystem zu Endsystembasis - * Subnetzwerkebene: Bereitstellung von Schutz über ein Subnetzwerk oder Inter-Netzwerk welches als weniger sicher als andere Stellen des Netzwerks gilt - * Linkebene: Bereitstellung von Schutz in einem Subnetzwerk, beispielsweise über einen Link, welcher weniger vertrauenswürdig als andere Stellen des Subnetzwerks gilt - -### Beziehungen zwischen Layern und Anforderungsleveln -* Die Beziehungen zwischen Protokolllayern und den Protokollelementssicherheitsanforderungen lassen sich nicht 1zu1 abbilden: - * Sicherheitsmechanismen welche sowohl Anforderungen an Endsystemen oder Subnetzwerkebenen erfüllen, können entweder in der Transport, und/oder in der Netzwerkschicht realisiert werden - * Link-Level-Anforderungen können erfüllt werden, indem man Sicherheitsmechanismen entweder im Linklayer, und/oder auf der physischen Ebene integriert - -### Die IP Sicherheitsarchitektur IPSec -#### Sicherheitsprobleme des Internetprotokolls -* Wenn eine Instanz ein IP Paket erhält, so hat es keinen Nachweis über: - * Die Herkunft der Daten und deren Integrität - * Also, dass das Paket tatsächlich von der Einheit gesendet wurde, welche in der Quelladresse des Pakets referenziert wird - * dass das Paket noch den ursprünglichen Inhalt enthält - * dass die Empfangseinheit tatsächlich die Einheit ist, an welche der Sender das Paket schicken wollte - * Vertraulichkeit - * Dass die ursprünglichen Daten nicht von einem Dritten inspiziert und gelesen wurden, während das Paket auf dem Weg vom Sender zum Empfänger war - -#### Sicherheitsziele von IPSec -* Datenherkunftsauthentisierung/ Verbindungslose Datenintegrität: - * Es soll unmöglich sein, ein IP Datagramm mit einer maskierten Quell- oder Zieladresse zu versenden, ohne, dass dies der Emfpänger erkennen kann. - * Es soll unmöglich sein, ein IP Paket während der Übertragung so zu verändern, dass es dem Empfänger nicht auffallen kann - * Wiederholungsschutz: Es soll nicht möglich sein, ein gespeichertes Paket zu späterem Zeitpunkt zu versenden, ohne, dass dies der Empfänger mitbekommt -* Vertrauenswürdigkeit: - * Es soll nicht möglich sein, den Inhalt der IP Datagramme auszuspähen - * Es soll weiterhin eine begrenzte Traffic Flow Confidentiality geben -* Sicherheitsrichtlinie - * Sender, Empfänger und zwischenliegende Knoten sollen erkennen können, ob ein Paket ihrer Sicherheitsrichtlinie entspricht und dieses gegebenenfalls verwerfen - -#### IPSec: Sicherheitsassoziation -* Eine Sicherheitsassoziation (SA) it eine "Simplexverbindung" welche Sicherheitsdienste für den von ihr beförderten Verkehr anbietet - * Sicherheitsdienste werden einer SA durch die Verwendung von entweder AH (Authentication Header) oder ESP (Encapsulating Security Payload) bereitgestellt - * Für bidirektionale Kommunikation werden zwei SA benötigt - * Eine SA ist eindeutig bestimmt durch ein Tripel, welches aus eine Sicherheitsparamterindex (SPI), einer Ziel-IP-Adresse und einem Sicherheitsprotokollbezeichner (AH/ESP) besteht - * Eine SA kann zwischen folgenden Peers aufgebaut werden - * Host <-> Host - * Host <-> Gateway - * Gateway <-> Host - * Gateway <-> Gateway - * Es gibt zwei konzeptionelle Datenbanken, die mit SAs assoziiert werden - * Die Sicherheitsrichtliniendatenbank (SPD), spezifiziert welche Sicherheitsdienste wie für IP Pakete bereitgestellt werden - * Die Sicherheitsassoziationsdatenbank (SADB) - -#### IPSec Protokollmodi -* Eine SA ist immer von einem der folgenden Typen: - * Der Transportmodus kann nur zwischen Endpunkten der Kommunikation verwendet werden - * Host <-> Host - * Host <-> Gateway (falls Gateway hier Kommunikationsendpunkt) - * Der Tunnelmodus kann mit beliebigen Peers verwendet werden -* Unterschiede zwischen den Modi: - * Der Transportmodus fügt nur einen sicherheitsspezifischen Header hinzu (+ potentiellen Trailer) - * Der Tunnelmodus kapselt IP Pakete -* Die Kapselung von IP-Paketen ermöglicht es den Gateways , Daten im Auftrag von anderen Instanzen zu schützen - -#### IPSec: Verschachtelung von Sicherheitsassoziationen -Beispiel: Host A und Gateway RB führen Datenherkunftsauthentisierung aus und die Gateways RA und RB führen Subnetz-to-Subnetz Vertraulichkeit aus - -##### IPSec Authentication Header (AH) -* Im Tunnelmodus stellt der Payload nochmals ein ganzes IP Paket dar -* Wichtig: AH funktioniert nur in NAT freien Umgebungen - -##### IPSec Encapsulating Security Protocol (ESP) -* Dem ESP Header folgt direkt ein IP Header oder ein AH-Header -* Das next-header Feld vom vorhergehenden Header indiziert 50 für ESP - -#### IPSec: Etablierung von Sicherheitassoziationen -* Bevor ein Paket von IPSec geschützt wird, muss eine SA zwischen den beiden "kryptographischen Endpunkten", welche den Schutz bereitstellen, aufgebaut werden -* SA Etablierung kann auf folgende Arten geschehen - * Manuell, durch proprietäre Methoden des Systemmanagements (nur in Ausnahmefällen) - * Dynamisch, durch ein standardisiertes Authentisierungs- und Schlüsselmanagementprotokoll -* IPSec definiert eine standardisierte Methode für die Etablierung von SAs - * Internet Security Association and Key Management Protocol (ISAKMP) - * Definiert Protokollformate und Prozeduren für die Sicherheitsaushandlung - * Internet Key Exchange (IKE) - * Definiert IPSecs Standardauthentisierungs- und Schlüsselaustauschprotokoll - -## Internetfirewalls -* Eine Netzwerkfirewall kann gut mit einer mittelalterlichen Zugbrücke verglichen werden: - * Sie beschränkt, welche Menschen die Burg betreten, da es nur den einen kontrollierten Eingang gibt - * Sie hält Angreifer davon ab, zu den weiteren Schutzmaßnahmen vorzudringen - * Sie beschränkt, welche Leute die Burg am streng überwachten Übergang verlassen -* Typischerweise wird eine Firewall an einem Punkt installiert, dan dem ein geschützes Subnetz an ein weniger vertrauenswürdiges Netzwerk angeschlossen wird -* Grundsätzlich realisieren Firewalls also Zugriffskontrolle auf dem Subnetzlevel - -### Terminologie -* Firewall: - * Eine oder eine Menge an Komponenten, welche den Zugriff zwischen einem geschützten Netzwerk und dem Internet oder zwischen einer Menge an Netzwerken beschränkt -* Paketfiltern/Screening: - * Die Aktion, welche ein Gerät ausführt, um selektiv den Fluss an Daten in und aus einem Netzwerk zu kontrollieren - * Paketfiltern ist eine wichtige Technik um Zugriffskontrolle auf dem Subnetzwerklevel für paketorientierte Netzwerke zu implementieren -* Bastion Host: - * Ein Computer, welcher besonders gesichert werden muss, da er anfälliger für Angriffe ist, als andere Computer im Subnetz - * Ein Bastion Host in einer Firewall ist typischerweise der Hauptansprechpartner für Nutzerprozesse von Hosts innerhalb des Netzwerks zu Prozessen von externen Hosts -* Dual Homed Host - * Ein Computer mit > 2 Netzwerkinterfaces -* Proxy: - * Ein Programm, welches sich im Auftrag interner Clients mit externen Servern beschäftigt - * Proxies leiten genehmigte Clientanfragen an die Server, und die Antworten auch wieder an den Client weiter - * Wenn ein Proxy die Kommandos eines Anwendungsprotokollls versteht und interpretiert, dann ist es ein Application Level Proxy, andernfalls, falls er die PDUs nur zwischen Cient und Server weiterreicht, so ist es ein Circuit Level Proxy -* Network Address Translation (NAT): - * Eine Prozedur, durch welche ein Router die Daten in Paketen ändert um die Netzwerkadressen zu modifizieren - * Dies erlaubt es die interne Netzwerkstruktur zu verschleiern -* Perimeternetzwerk - * Ein Subnetz, welches zwischen einem externen und einem internen Netzwerk hinzugefügt wird, um eine weitere Sicherheitseben bereitzustellen - * Ein Synonym hierfür ist DMZ (De Militarized Zone) - -### Firewallarchitekturen -#### Einfache Paketfilterarchitektur -* Einfachste Architektur bestehend aus einem paketfilternden Router -* Realisierbar durch PC mit zwei Netzwerkinterfaces oder einem dedizierten Router - -#### Die Screened Host Architektur -* Der Paketfilter erlaubt zuverlässigen Verkehr zwischen dem screended Host und dem Internet und blockiert jeglichen Verkehr zwischen anderen internen Hosts und dem Internet -* Der screened Host stellt Proxydienste bereit - * Ungeachtet des teilweisen Schutz durch den Paketfilter, fungiert der screened Host als ein Bastion Host - -#### Die Screened Subnet Architektur -* Ein Perimeternetzwerk wird zwischen zwei Paketfiltern installiert -* Der innere Paketfilter dient zum zusätzlichen Schutz im Falle, dass der Bastion Host je kompromittiert wird (so kann ein übernommener Bastion Host keinen internen Verkehr mithören) -* Dieses Perimeternetzwerk ist ebenfalls ein guter Ort, um einen öffentlich erreichbaren Server zu hosten - -#### Firewalls: Paketfiltrierung -* Was kann man mit Paketfiltern alles erreichen? - * Theoretisch alles, da alle Informationen, welche in einer Kommunikation ausgetauscht werden als Pakete transportiert werden - * Praktisch allerdings, dient folgendes als Orientierungshilfe - * Operationen, welche detaillierte Kenntnisse über Protokolle höherer Schichten erfordern, oder die verlängerte Nachverfolgung von vergangenen Ereignissen benötigen, sind in Proxysystemen einfacher zu realisieren - * Operationen, die zwar einfach sind, aber sehr schnell ausgeführt werden müssen, sind in Paketfiltersystemen einfacher zu handhaben -* Grundlegendes Paketfiltern erlaubt es den Datentransfer anhand folgender Kriterien zu kontrollieren: - * Quell IP - * Ziel IP - * Transportprotokoll - * Quell- und Zielanwendungsport - * Potentielle, spezifische Kontrollflags +--- +title: Telematik 1 +date: Sommersemester 2020 +author: Felix Husslein, Robert Jeutter +--- + +- [Kapitel 1: Kurze Übersicht](#kapitel-1-kurze-übersicht) + - [Unterschiede zwischen Telefon und Internet](#unterschiede-zwischen-telefon-und-internet) + - [Verbindungsarten:](#verbindungsarten) + - [Phyische Verbindungen (Arten)](#phyische-verbindungen-arten) + - [Größere Netzwerke](#größere-netzwerke) + - [Multiplexing](#multiplexing) +- [Kapitel 2: Architektur](#kapitel-2-architektur) + - [Verbindungsorientiert vs. Verbindungslos](#verbindungsorientiert-vs-verbindungslos) + - [Protokolle](#protokolle) + - [Protokollspezikiationen:](#protokollspezikiationen) + - [Layering: Vor- und Nachteile](#layering-vor--und-nachteile) + - [ISO/OSI Referenzmodell](#isoosi-referenzmodell) + - [Kritik am ISO/OSI Modell](#kritik-am-isoosi-modell) + - [Architekturvoraussetzungen für das Internet](#architekturvoraussetzungen-für-das-internet) + - [Grundlagen der Internetarchitektur](#grundlagen-der-internetarchitektur) + - [TCP/IP Referenzmodell](#tcpip-referenzmodell) + - [Kritik am TCP/IP Modell](#kritik-am-tcpip-modell) + - [ISO/OSI vs TCP/IP](#isoosi-vs-tcpip) + - [Standardisierung](#standardisierung) + - [ISO Standardisierverfahren](#iso-standardisierverfahren) + - [Zusammenfassung Kapitel 2](#zusammenfassung-kapitel-2) +- [Kapitel 3: Physikalisches Layer](#kapitel-3-physikalisches-layer) + - [Synchronisation](#synchronisation) + - [Vereinfachtes Konzept:](#vereinfachtes-konzept) + - [Breitband- vs. Basisbandübertragung](#breitband--vs-basisbandübertragung) + - [Breitbandübertragung](#breitbandübertragung) + - [Digitales vs. Analoges Signal](#digitales-vs-analoges-signal) + - [Zusammenfassung Kapitel 3](#zusammenfassung-kapitel-3) +- [Kapitel 4: Data Link Layer](#kapitel-4-data-link-layer) + - [Services des Link Layers](#services-des-link-layers) + - [Einfache Linklayerfunktionen (Übersicht)](#einfache-linklayerfunktionen-übersicht) + - [Framing](#framing) + - [Fehlerkontrolle](#fehlerkontrolle) + - [Verbindungsaufbau](#verbindungsaufbau) + - [Flusskontrolle](#flusskontrolle) + - [Framing](#framing-1) + - [Framing durch Zählen der Charakter](#framing-durch-zählen-der-charakter) + - [Framing durch Flagbitmuster/Bitstuffing](#framing-durch-flagbitmusterbitstuffing) + - [Framing durch Codeverletzungen](#framing-durch-codeverletzungen) + - [Fehlerkontrolle - Redundanz](#fehlerkontrolle---redundanz) + - [Parität](#parität) + - [Checksummen](#checksummen) + - [Hammingdistanz](#hammingdistanz) + - [Frame Mengen - Code Books, Code](#frame-mengen---code-books-code) + - [Cyclic Redundancy Check - CRC](#cyclic-redundancy-check---crc) + - [Rückwärtsfehlerkontrolle](#rückwärtsfehlerkontrolle) + - [Send and Wait](#send-and-wait) + - [Alternating Bit Protokoll](#alternating-bit-protokoll) + - [ARQ - Sliding Windows](#arq---sliding-windows) + - [Übertragungsfehler und Empfangsfenstergröße](#übertragungsfehler-und-empfangsfenstergröße) + - [Go-Back-N](#go-back-n) + - [Selective Reject / Selective Repeat](#selective-reject--selective-repeat) + - [Duplexoperation und Piggybacking](#duplexoperation-und-piggybacking) + - [Leistungsverhalten:](#leistungsverhalten) + - [Folgerung Kapitel 4](#folgerung-kapitel-4) +- [Kapitel 5: Medium Access Control (MAC)](#kapitel-5-medium-access-control-mac) + - [Einführung: Multiple Access Link und Protokolle](#einführung-multiple-access-link-und-protokolle) + - [Multiple Access Protokoll](#multiple-access-protokoll) + - [Broadcastkanal mit Rate R b/s](#broadcastkanal-mit-rate-r-bs) + - [Statisches Multiplexing](#statisches-multiplexing) + - [Berstender Verkehr (Burst)](#berstender-verkehr-burst) + - [Statisches multiplexing berstenden Verkehrs - Verzögerung](#statisches-multiplexing-berstenden-verkehrs---verzögerung) + - [Dynamische Kanalzuweisung](#dynamische-kanalzuweisung) + - [Annahmen für die dynmaische Kanalzuweisung](#annahmen-für-die-dynmaische-kanalzuweisung) + - [Zahlen von Merit](#zahlen-von-merit) + - [Durchsatz und angebotene Last](#durchsatz-und-angebotene-last) + - [Grundlegende Optionen für MAC](#grundlegende-optionen-für-mac) + - [Kollisionsbehaftete Protokolle](#kollisionsbehaftete-protokolle) + - [Carrier Sensing](#carrier-sensing) + - [CSMA und die Ausbreitungsverzögerung](#csma-und-die-ausbreitungsverzögerung) + - [Collision Detetion - CSMA/CD](#collision-detetion---csmacd) + - [Wahl einer zufälligen Wartezeit](#wahl-einer-zufälligen-wartezeit) + - [Adaption von k an die Last](#adaption-von-k-an-die-last) + - [Binary exponential Backoff](#binary-exponential-backoff) + - [Wettbewerbsfreie Protokolle](#wettbewerbsfreie-protokolle) + - [Polling und Tokenweitergabe](#polling-und-tokenweitergabe) + - [Bit-Map-Protokoll](#bit-map-protokoll) + - [Limited Contention Protokolle](#limited-contention-protokolle) + - [Fallstudie Ethernet](#fallstudie-ethernet) + - [Topologien](#topologien) + - [Unzuverlässiger, verbindungsloser Dienst](#unzuverlässiger-verbindungsloser-dienst) + - [Physisches Layer](#physisches-layer) + - [Ethernet verwendet CSMA/CD](#ethernet-verwendet-csmacd) + - [Ethernet - CSMA-CD Algorithmus](#ethernet---csma-cd-algorithmus) + - [Effizienz](#effizienz) + - [Hubs](#hubs) + - [Switch](#switch) + - [Geschwindigkeiten der Ethernetversionen](#geschwindigkeiten-der-ethernetversionen) + - [Zusammenfassung Kapitel 5](#zusammenfassung-kapitel-5) +- [Kapitel 6 Internetworking](#kapitel-6-internetworking) + - [LAN Verbindungen](#lan-verbindungen) + - [Gründe für mehrere LANs](#gründe-für-mehrere-lans) + - [Möglichkeiten des Überwindens der Begrenzungen](#möglichkeiten-des-überwindens-der-begrenzungen) + - [Physical Layer Verbindungen](#physical-layer-verbindungen) + - [Repeater](#repeater) + - [Hub](#hub) + - [Data Link Layer](#data-link-layer) + - [Switch](#switch-1) + - [Pfaderkennung - Selbstlernen](#pfaderkennung---selbstlernen) + - [Weiterleiten](#weiterleiten) + - [Bridges](#bridges) + - [Rückwärtslernen in Bridges - Bootstrapping](#rückwärtslernen-in-bridges---bootstrapping) + - [Lösung 1: Einschränken des Flutens](#lösung-1-einschränken-des-flutens) + - [Lösung 2: Spanning Trees](#lösung-2-spanning-trees) + - [Higher-Layer Verbindungen](#higher-layer-verbindungen) + - [Router](#router) + - [Gateways](#gateways) + - [Weitere Probleme mit LAN/LAN Verbindungen](#weitere-probleme-mit-lanlan-verbindungen) + - [Zusammenfassung Kapitel 6](#zusammenfassung-kapitel-6) +- [Kapitel 7: Netzwerklayer](#kapitel-7-netzwerklayer) + - [Bauen großer Netzwerke](#bauen-großer-netzwerke) + - [Netzwerklayerfunktionen](#netzwerklayerfunktionen) + - [Weiterleitung](#weiterleitung) + - [Durchsuchen der Routingtabelle](#durchsuchen-der-routingtabelle) + - [Zusammenspiel zwischen Routing und Weiterleitung](#zusammenspiel-zwischen-routing-und-weiterleitung) + - [Verbindungsaufbau](#verbindungsaufbau-1) + - [Netzwerkservicemodell](#netzwerkservicemodell) + - [Virtuelle Schaltkreisbasierte vs. Datagrammorientierte Netzwerke](#virtuelle-schaltkreisbasierte-vs-datagrammorientierte-netzwerke) + - [Verbindungslose und Verbindungsbasierende Dienste auf dem Netzwerklayer](#verbindungslose-und-verbindungsbasierende-dienste-auf-dem-netzwerklayer) + - [Virtuelle Schaltkreise](#virtuelle-schaltkreise) + - [Implementierung virtueller Schaltkreise](#implementierung-virtueller-schaltkreise) + - [Weiterleitungstabellen](#weiterleitungstabellen) + - [VC Signalprotokolle](#vc-signalprotokolle) + - [Datagrammnetzwerke](#datagrammnetzwerke) + - [Longest Prefix Matching](#longest-prefix-matching) + - [Datagramm vs. VC-Netzwerk](#datagramm-vs-vc-netzwerk) + - [Wie ist ein Router eigentlich aufgebaut?](#wie-ist-ein-router-eigentlich-aufgebaut) + - [Eingangsportfunktionen](#eingangsportfunktionen) + - [Switching Fabric](#switching-fabric) + - [Ausgangsports](#ausgangsports) + - [Ausgangsportwarteschlangen](#ausgangsportwarteschlangen) + - [Eingangsportwarteschlangen](#eingangsportwarteschlangen) + - [IP - Datagrammformat und Paketverarbeitung](#ip---datagrammformat-und-paketverarbeitung) + - [IP Paketformat](#ip-paketformat) + - [IP Fragmentierung und Reassemblierung](#ip-fragmentierung-und-reassemblierung) + - [IP Adressierung](#ip-adressierung) + - [Scheitern von einfachen Adressierungsmethoden](#scheitern-von-einfachen-adressierungsmethoden) + - [Adressierung und hierarchisches Routing](#adressierung-und-hierarchisches-routing) + - [Nähe](#nähe) + - [internetnamen und Adressen](#internetnamen-und-adressen) + - [Klassen von IP-Adressen](#klassen-von-ip-adressen) + - [IP-Adressierung](#ip-adressierung-1) + - [Subnets](#subnets) + - [IP Adressen](#ip-adressen) + - [CIDR: Classless Inter Domain Routing](#cidr-classless-inter-domain-routing) + - [Wie bekommt man eigentlich eine IP-Adresse?](#wie-bekommt-man-eigentlich-eine-ip-adresse) + - [Wie kommt das Netzwerk eigentlich an seinen Subnetpart von IP-Adressen?](#wie-kommt-das-netzwerk-eigentlich-an-seinen-subnetpart-von-ip-adressen) + - [IP Adressierung: Allokation von Adressen](#ip-adressierung-allokation-von-adressen) + - [NAT - Network Address Translation](#nat---network-address-translation) + - [Schließen der letzten Lücke: ARP](#schließen-der-letzten-lücke-arp) + - [ARP Protokoll im gleichen LAN](#arp-protokoll-im-gleichen-lan) + - [Routing in ein anderes LAN](#routing-in-ein-anderes-lan) + - [ICMP und IPv6](#icmp-und-ipv6) + - [ICMP: Internet Control Message Protocol](#icmp-internet-control-message-protocol) + - [Traceroute und ICMP](#traceroute-und-icmp) + - [IPv6](#ipv6) + - [IPv6 Header](#ipv6-header) + - [Weitere Veränderungen zu IPv4](#weitere-veränderungen-zu-ipv4) + - [Übergang von IPv4 zu IPv6](#übergang-von-ipv4-zu-ipv6) + - [Routing Algorithmen](#routing-algorithmen) + - [Überblick über Routingalgorithmen](#überblick-über-routingalgorithmen) + - [Fluten](#fluten) + - [Mögliche Anwendungsfelder fürs Fluten](#mögliche-anwendungsfelder-fürs-fluten) + - [Zufallsrouting](#zufallsrouting) + - [Adaptive Routingalgorithmen](#adaptive-routingalgorithmen) + - [Zentralisiertes adaptives Routing](#zentralisiertes-adaptives-routing) + - [Isoliertes adaptives Routing](#isoliertes-adaptives-routing) + - [Rückwärtslernen](#rückwärtslernen) + - [Verteiltes adaptives Routing](#verteiltes-adaptives-routing) + - [Klassifikation von Algorithmen für dezentralisiertes adaptives Routing](#klassifikation-von-algorithmen-für-dezentralisiertes-adaptives-routing) + - [Distanzvektorrouting Algorithmen](#distanzvektorrouting-algorithmen) + - [Distanzvektorrouting - Übersicht](#distanzvektorrouting---übersicht) + - [Distanzvektoralgorithmus - Quelltext](#distanzvektoralgorithmus---quelltext) + - [Distanzvektor: Reaktion auf Veränderung der Linkkosten](#distanzvektor-reaktion-auf-veränderung-der-linkkosten) + - [Poisoned Reverse](#poisoned-reverse) + - [Link State Routing](#link-state-routing) + - [Dijkstrasalgorithmus zur Berechnung kürzester Pfade](#dijkstrasalgorithmus-zur-berechnung-kürzester-pfade) + - [Weiterführende Diskussion zu Dijkstras Algorithmus](#weiterführende-diskussion-zu-dijkstras-algorithmus) + - [Link State Routing mit Dijkstras Algorithmus](#link-state-routing-mit-dijkstras-algorithmus) + - [Vergleich zwischen Link-State und Distanzvektoralgorithmen](#vergleich-zwischen-link-state-und-distanzvektoralgorithmen) + - [Hierarchisches Routing](#hierarchisches-routing) + - [Autonome Systeme](#autonome-systeme) + - [Routing im Internet](#routing-im-internet) + - [Verschiedenes Intra-AS und Inter-AS Routing, aber warum?](#verschiedenes-intra-as-und-inter-as-routing-aber-warum) + - [Verbundene autonome Systeme](#verbundene-autonome-systeme) + - [Inter-AS Aufgaben](#inter-as-aufgaben) + - [Beispiel: Setzen der Weiterleitungstabelle in Router 1d](#beispiel-setzen-der-weiterleitungstabelle-in-router-1d) + - [Beispiel: Wählen aus mehreren ASen](#beispiel-wählen-aus-mehreren-asen) + - [Routing im Internet](#routing-im-internet-1) + - [Intra-AS Routing (IGP)](#intra-as-routing-igp) + - [RIP - Routing Information Protokoll](#rip---routing-information-protokoll) + - [RIP - Advertisements](#rip---advertisements) + - [RIP - Linkausfall und Linkrecovery](#rip---linkausfall-und-linkrecovery) + - [RIP - Tabellenverarbeitung](#rip---tabellenverarbeitung) + - [OSPF - Open Shortest Path First](#ospf---open-shortest-path-first) + - [Weiterführende Funktionen](#weiterführende-funktionen) + - [Hierarchisches OSPF](#hierarchisches-ospf) + - [BGP - Border Gateway Protokoll](#bgp---border-gateway-protokoll) + - [BGP - Grundlagen](#bgp---grundlagen) + - [Verteilung von Erreichbarkeitsinformationen](#verteilung-von-erreichbarkeitsinformationen) + - [Pfadattribute und BGP Routen](#pfadattribute-und-bgp-routen) + - [BGP Routenwahl](#bgp-routenwahl) + - [BGP Nachrichten](#bgp-nachrichten) + - [Zusammenfassung Kapitel 7](#zusammenfassung-kapitel-7) +- [Kapitel 8: Transport Layer](#kapitel-8-transport-layer) + - [Transportlayerdienste und Protokolle](#transportlayerdienste-und-protokolle) + - [Transport vs. Netzwerklayer](#transport-vs-netzwerklayer) + - [Transportlayerprotokolle im Internet](#transportlayerprotokolle-im-internet) + - [Adressierung und Multiplexing](#adressierung-und-multiplexing) + - [Multiplexing und Demultiplexing](#multiplexing-und-demultiplexing) + - [Wie funktioniert Demultiplexing?](#wie-funktioniert-demultiplexing) + - [Verbindungsloses Demultiplexing](#verbindungsloses-demultiplexing) + - [Verbindungsorierntiertes Demultiplexing](#verbindungsorierntiertes-demultiplexing) + - [Multithreaded-Webserver](#multithreaded-webserver) + - [Verbindungskontrolle](#verbindungskontrolle) + - [Aufbau der Transportverbindung](#aufbau-der-transportverbindung) + - [Datentransferdienst](#datentransferdienst) + - [Verbindungsabbau](#verbindungsabbau) + - [Probleme während des Verbindungsaufbaus](#probleme-während-des-verbindungsaufbaus) + - [Drei Wege Handshake](#drei-wege-handshake) + - [Verbindungsablehnung](#verbindungsablehnung) + - [Verbindungsabbbau](#verbindungsabbbau) + - [Verbindungsabbau in der Realität](#verbindungsabbau-in-der-realität) + - [Flusskontrolle](#flusskontrolle-1) + - [Motivation: Kontrolle von Überlastsituationen](#motivation-kontrolle-von-überlastsituationen) + - [Flaschenhälse auf der Empfängerseite](#flaschenhälse-auf-der-empfängerseite) + - [Flusskontrolle](#flusskontrolle-2) + - [Flusskontrolle - Pufferallokation](#flusskontrolle---pufferallokation) + - [Flusskontrolle durch Continue und Stop](#flusskontrolle-durch-continue-und-stop) + - [Implizite Flusskontrolle](#implizite-flusskontrolle) + - [Kreditbasierte Flusskontrolle](#kreditbasierte-flusskontrolle) + - [Flusskontrolle - Permits und Acknowledgements](#flusskontrolle---permits-und-acknowledgements) + - [Staukontrolle](#staukontrolle) + - [Warum benötigt man Staukontrolle?](#warum-benötigt-man-staukontrolle) + - [Gründe für Stau](#gründe-für-stau) + - [Zusammenfassung](#zusammenfassung) + - [Adaptiere die Senderate an die Netzwerkkapazität](#adaptiere-die-senderate-an-die-netzwerkkapazität) + - [Wünschenswerte Eigenschaften von Staukontrolle](#wünschenswerte-eigenschaften-von-staukontrolle) + - [Designoptionen für Staukontrollmechanismen](#designoptionen-für-staukontrollmechanismen) + - [Mögliche Aktionen](#mögliche-aktionen) + - [Mögliche Aktionen - Taxonomie](#mögliche-aktionen---taxonomie) + - [Routeraktionen - Verwerfen von Paketen](#routeraktionen---verwerfen-von-paketen) + - [Verwerfen von Paketen - Implizites Feedback](#verwerfen-von-paketen---implizites-feedback) + - [Vermeiden von vollen Warteschlangen - Proaktive Aktionen](#vermeiden-von-vollen-warteschlangen---proaktive-aktionen) + - [Choke Pakete](#choke-pakete) + - [Warnungsbits](#warnungsbits) + - [Random Early Detection](#random-early-detection) + - [Was passiert aber, wenn Feedback empfangen wurde?](#was-passiert-aber-wenn-feedback-empfangen-wurde) + - [Transportprotokolle im Internet](#transportprotokolle-im-internet) + - [UDP - User Datagram Protocol](#udp---user-datagram-protocol) + - [UDP Checksummen](#udp-checksummen) + - [TCP - Transmission Control Protocol](#tcp---transmission-control-protocol) + - [TCP - Sequenznummern und ACKs](#tcp---sequenznummern-und-acks) + - [TCP Round Trip Time und Timeouts](#tcp-round-trip-time-und-timeouts) + - [TCP Verbindungsaufbau](#tcp-verbindungsaufbau) + - [Verbindungsidentifikation bei TCP](#verbindungsidentifikation-bei-tcp) + - [TCP Verbindungsmanagement](#tcp-verbindungsmanagement) + - [TCP Verbindung in drei Phasen](#tcp-verbindung-in-drei-phasen) + - [Zuverlässiger Datentransfer in TCP](#zuverlässiger-datentransfer-in-tcp) + - [TCP Senderevents](#tcp-senderevents) + - [TCP Sender (vereinfacht)](#tcp-sender-vereinfacht) + - [TCP ACK Generierung](#tcp-ack-generierung) + - [Schnelle Neuübertragung](#schnelle-neuübertragung) + - [Algorithmus](#algorithmus) + - [TCP Fluss- und Staukontrolle](#tcp-fluss--und-staukontrolle) + - [Sende- und Empfangspuffer bei TCP](#sende--und-empfangspuffer-bei-tcp) + - [TCP Flusskontrolle: Angebotenes Fenster](#tcp-flusskontrolle-angebotenes-fenster) + - [Nagles Algorithmus - Selbsttaktung und Fenster](#nagles-algorithmus---selbsttaktung-und-fenster) + - [Staukontrolle bei TCP](#staukontrolle-bei-tcp) + - [TCP ACK/Selbsttaktung](#tcp-ackselbsttaktung) + - [Gute und schlechte Nachrichten](#gute-und-schlechte-nachrichten) + - [Verkleinern des Staufensters](#verkleinern-des-staufensters) + - [Vergrößern des Staufensters](#vergrößern-des-staufensters) + - [Additives Erhöhen](#additives-erhöhen) + - [AIMD - Sägezahnmuster der angebotenen TCP Last](#aimd---sägezahnmuster-der-angebotenen-tcp-last) + - [Schnelle initialisierung - Slow Start (historischer Name)](#schnelle-initialisierung---slow-start-historischer-name) + - [Verlassen des Slowstarts](#verlassen-des-slowstarts) + - [Problematik der Paketbursts](#problematik-der-paketbursts) + - [Lösung: Auch hier Slow Start verwenden](#lösung-auch-hier-slow-start-verwenden) + - [Zusammenfassung TCP Staukontrolle](#zusammenfassung-tcp-staukontrolle) + - [TCP Performance](#tcp-performance) + - [TCP Durchsatz](#tcp-durchsatz) + - [TCP Fairness](#tcp-fairness) + - [Fairness](#fairness) + - [Fairness und UDP](#fairness-und-udp) + - [Fariness und parallele TCP-Verbindungen](#fariness-und-parallele-tcp-verbindungen) + - [Verzögerungsmodellierung](#verzögerungsmodellierung) + - [Festes Staufenster](#festes-staufenster) + - [TCP Verzögerungsmodellierung: Slow Start](#tcp-verzögerungsmodellierung-slow-start) + - [Fallstudie HTTP Modellierung](#fallstudie-http-modellierung) + - [HTTP Antwortzeiten](#http-antwortzeiten) + - [Zusammenfassung Kapitel 8](#zusammenfassung-kapitel-8) +- [Kapitel 9: Internet Application Layer](#kapitel-9-internet-application-layer) + - [Erstellen einer Netzwerkanwendung](#erstellen-einer-netzwerkanwendung) + - [Prinzipien von Netzwerkanwendungen: Architekturen](#prinzipien-von-netzwerkanwendungen-architekturen) + - [Client-Server Architektur](#client-server-architektur) + - [Peer-to-Peer Architketur](#peer-to-peer-architketur) + - [Hybride Client-Server und P2P](#hybride-client-server-und-p2p) + - [Prozesskommunikation](#prozesskommunikation) + - [Sockets](#sockets) + - [Adressierung von Prozessen](#adressierung-von-prozessen) + - [Durch das Anwendungsprotokoll festgelegte Eigenschaften](#durch-das-anwendungsprotokoll-festgelegte-eigenschaften) + - [Welche Transportdienste werden von den Anwendungen benötigt?](#welche-transportdienste-werden-von-den-anwendungen-benötigt) + - [Internettransportprotokolldienste](#internettransportprotokolldienste) + - [Web & HTTP](#web--http) + - [HTTP Übersicht](#http-übersicht) + - [HTTP Verbindungen](#http-verbindungen) + - [Antwortzeitmodellierung](#antwortzeitmodellierung) + - [Persistentes HTTP](#persistentes-http) + - [HTTP Anfragenachrichten](#http-anfragenachrichten) + - [Hochladen von Einfaben](#hochladen-von-einfaben) + - [Methodentypen](#methodentypen) + - [HTTP Statuscodes](#http-statuscodes) + - [HTTP Webcaching und Cookies](#http-webcaching-und-cookies) + - [Nutzer-Server-Zustand: Cookies](#nutzer-server-zustand-cookies) + - [Webcaches (Proxyserver)](#webcaches-proxyserver) + - [Weitere Informationen über Webcaches](#weitere-informationen-über-webcaches) + - [Bedingtes GET](#bedingtes-get) + - [Webserverarchitekturen](#webserverarchitekturen) + - [Grundlegende Webserveraufgaben](#grundlegende-webserveraufgaben) + - [Webserverarchitekturen](#webserverarchitekturen-1) + - [1. Prozessmodell](#1-prozessmodell) + - [2. Threadmodell](#2-threadmodell) + - [3. In-Kernel Modell](#3-in-kernel-modell) + - [4. Eventbasiertes Modell](#4-eventbasiertes-modell) + - [Performancevergleich](#performancevergleich) + - [Webservercluster](#webservercluster) + - [FTP: Das Dateitransferprotokoll](#ftp-das-dateitransferprotokoll) + - [Separate Kontroll- & Datenverbindung](#separate-kontroll---datenverbindung) + - [FTP Kommandos und Antworten](#ftp-kommandos-und-antworten) + - [Electronic Mail: E-Mail](#electronic-mail-e-mail) + - [SMTP](#smtp) + - [SMTP Vergleich mit HTTP](#smtp-vergleich-mit-http) + - [Mailnachrichtenformat](#mailnachrichtenformat) + - [Nachrichtenformat: Multimediaerweiterungen](#nachrichtenformat-multimediaerweiterungen) + - [Mailzugriffsprotokolle](#mailzugriffsprotokolle) + - [POP3](#pop3) + - [POP3 und IMAP](#pop3-und-imap) + - [DNS - Domain Name System](#dns---domain-name-system) + - [Verteilte hierarchische Datenbank](#verteilte-hierarchische-datenbank) + - [DNS: Root Name Server](#dns-root-name-server) + - [TLD, Authorative und lokale DNS Server](#tld-authorative-und-lokale-dns-server) + - [Iterative Anfragen](#iterative-anfragen) + - [Rekursive Anfragen](#rekursive-anfragen) + - [DNS Caching und Updaten von Records](#dns-caching-und-updaten-von-records) + - [DNS Records](#dns-records) + - [DNS Protokoll, Nachrichten](#dns-protokoll-nachrichten) + - [Einfügen von Records ins DNS](#einfügen-von-records-ins-dns) + - [P2P Filesharing](#p2p-filesharing) + - [Probleme mit einem zentralisierten Verzeichnis](#probleme-mit-einem-zentralisierten-verzeichnis) + - [Anfragefluten: Gnutella](#anfragefluten-gnutella) + - [Gnutella Protokoll](#gnutella-protokoll) + - [Gnutella Peerjoining](#gnutella-peerjoining) + - [Socketprogrammierung mit TCP](#socketprogrammierung-mit-tcp) + - [Socketprogrammierung unter Verwendung von TCP](#socketprogrammierung-unter-verwendung-von-tcp) + - [Stream Jargon](#stream-jargon) + - [Socketprogrammierung mit UDP](#socketprogrammierung-mit-udp) + - [Bauen eines einfachen Webservers](#bauen-eines-einfachen-webservers) + - [Zusammenfassung Kapitel 9](#zusammenfassung-kapitel-9) +- [Kapitel 10: Netzwerk Sicherheit](#kapitel-10-netzwerk-sicherheit) + - [Einführung - Bedrohungen, Sicherheitsziele, Schutzmaßnahmen](#einführung---bedrohungen-sicherheitsziele-schutzmaßnahmen) + - [Was ist eine Bedrohung in einem Kommunikationsnetzwerk?](#was-ist-eine-bedrohung-in-einem-kommunikationsnetzwerk) + - [Sicherheitsziele (Security Objectives) in Abnhängigkeit von der Anwendungsumgebung](#sicherheitsziele-security-objectives-in-abnhängigkeit-von-der-anwendungsumgebung) + - [Sicherheitsziele technisch definiert](#sicherheitsziele-technisch-definiert) + - [Bedrohungen technisch definiert](#bedrohungen-technisch-definiert) + - [Sicherheitsanalyse von gelayerten Protokollarchitekturen](#sicherheitsanalyse-von-gelayerten-protokollarchitekturen) + - [Angriff auf dem Nachrichtenlevel](#angriff-auf-dem-nachrichtenlevel) + - [Sicherheitsmechanismen gegen Bedrohungen](#sicherheitsmechanismen-gegen-bedrohungen) + - [Grundlagen der Sicherheitstechnologie](#grundlagen-der-sicherheitstechnologie) + - [Terminologie](#terminologie) + - [Sicherheitsdienste - Übersicht](#sicherheitsdienste---übersicht) + - [Kryptologie - Definition und Terminologie](#kryptologie---definition-und-terminologie) + - [Kryptographische Algorithmen](#kryptographische-algorithmen) + - [Wichtige Eigenschaften von Verschlüsselungsalgorithmen](#wichtige-eigenschaften-von-verschlüsselungsalgorithmen) + - [Symmetrische Verschlüsselung](#symmetrische-verschlüsselung) + - [Asymmetrische Kryptographie](#asymmetrische-kryptographie) + - [Erkennung verschlüsselter Nachrichten](#erkennung-verschlüsselter-nachrichten) + - [Kryptographisches Protokoll](#kryptographisches-protokoll) + - [Einführung in die Sicherheitsdienste von Kommunikationsnetzwerken](#einführung-in-die-sicherheitsdienste-von-kommunikationsnetzwerken) + - [Sicherheit in Netzwerken: Was sollen wir wo tun?](#sicherheit-in-netzwerken-was-sollen-wir-wo-tun) + - [Pragmatisches Modelll für sicheres und vernetztes Rechnen](#pragmatisches-modelll-für-sicheres-und-vernetztes-rechnen) + - [Beziehungen zwischen Layern und Anforderungsleveln](#beziehungen-zwischen-layern-und-anforderungsleveln) + - [Die IP Sicherheitsarchitektur IPSec](#die-ip-sicherheitsarchitektur-ipsec) + - [Sicherheitsprobleme des Internetprotokolls](#sicherheitsprobleme-des-internetprotokolls) + - [Sicherheitsziele von IPSec](#sicherheitsziele-von-ipsec) + - [IPSec: Sicherheitsassoziation](#ipsec-sicherheitsassoziation) + - [IPSec Protokollmodi](#ipsec-protokollmodi) + - [IPSec: Verschachtelung von Sicherheitsassoziationen](#ipsec-verschachtelung-von-sicherheitsassoziationen) + - [IPSec Authentication Header (AH)](#ipsec-authentication-header-ah) + - [IPSec Encapsulating Security Protocol (ESP)](#ipsec-encapsulating-security-protocol-esp) + - [IPSec: Etablierung von Sicherheitassoziationen](#ipsec-etablierung-von-sicherheitassoziationen) + - [Internetfirewalls](#internetfirewalls) + - [Terminologie](#terminologie-1) + - [Firewallarchitekturen](#firewallarchitekturen) + - [Einfache Paketfilterarchitektur](#einfache-paketfilterarchitektur) + - [Die Screened Host Architektur](#die-screened-host-architektur) + - [Die Screened Subnet Architektur](#die-screened-subnet-architektur) + - [Firewalls: Paketfiltrierung](#firewalls-paketfiltrierung) + +--- +# Kapitel 1: Kurze Übersicht + +## Unterschiede zwischen Telefon und Internet +- Telefon: Kontinuierliche Übertragung der Daten in beide Richtungen in nahezu Echtzeit +- Internet: Daten werden übertragen, Latenzen sind verschmerzbar + +## Verbindungsarten: +Jede Verbindung benötigt eine Stelle welche von Bits in Signale wandelt und umgekehrt +> Signale sind die physische Repräsentation von Daten in der Form einer charakteristischen Variation in Zeit oder Ausbreitung… + +Wichtige Eigenschaften auf niedrigem Niveau: +- Delay d: Zeit vom Versenden bis zum Empfangen +- Speed v: Wie schnell reist das Signal im Übertragungsmedium (Kupfer/Glasfaser bei 2/3c, WLAN bei c) + +> delay = distance / v + +## Phyische Verbindungen (Arten) +- Simplex: Nur ein Teilnehmer kann immer senden +- Half Duplex: Beide Seiten senden abwechselnd Daten über den selben Kanal + - TDD (Time Division Duplex): Nutzer senden in einem festgelegten Zeitrahmen und kommen sich somit nicht in die Quere +- Full Duplex: Beide Nutzer können gleichzeitig senden + - FDD (Frequenzy Division Duplex): Die Nutzer senden gleichzeitig auf unterschiedlichen Frequenzen. Somit ist ein Kabel für eine Verbindung in beide Richtungen ausreichend. + - TDD (Time Division Duplex): Ist möglich, wenn einer sendet und der andere das zu Sendende kurz zwischenspeichert und später den Inhalt des Caches und das Aktuelle gleichzeitig sendet (Funktioniert nur, wenn das Medium doppelt so viel Kapazität wie die Datenrate des Senders hat) + +## Größere Netzwerke +Einfaches untereinander Verbinden wird unübersichtlich, deshalb Einführung eines neuen Strukturelementes: +* Option 1: Circuit Switching + * einfach + * einmal aufgesetzt verbleiben die Ressourcen beim Nutzer + * Circuit muss hergestellt werden, bevor kommuniziert werden kann +* Option 2: Packet Switching + * Aufteilen von Daten in kleinere Pakete die nach und nach gesendet werden + * Problem: Informationen zu Sender/Empfänger und Start/Endzeitpunkt eines Pakets müssen mit übermittelt werden + * Switches übernehmen zusätzliche Aufgaben: + * Zwischenspeichern in Puffern + * Herausfinden des Ziels + * Weiterleiten + * Wird deshalb 'Store and Forward' Netzwerk genannt + +## Multiplexing +Ähnlich, das Switch-Element hat aber nur eine ausgehende Leitung +1. TDM (Time Division Multiplexing): Übertrage ein Paket nach dem Anderen (Zeitliche Unterteilung) +2. FDM (Frequency Division Multiplexing): Gebrauch verschiedener Frequenzen um gleichzeitig Mehreres übertragen zu können. + +Alternativen: CDM (Code DM), SPM (Space DM) + +Sinn der Sache: Simuliert jedem Gerät seine eigene Datenleitung zu haben, ohne mehrere Leitungen bereitstellen zu müssen. + +Ein Mux benötigt immer einen Demux, sodass das Paket den Weg korrekt verfolgen kann. + +> Broadcast Medium: +>- Nur ein Sender zu jeder Zeit +>- Zugriffskontrolle (MUX o. Absprache) + +Optionen für die Auswahl des nächsten Hops bei großen Netzwerken: +1. Fluten: Sende das Paket an alle Nachbarn +2. Hot Potato Routing: Sende an einen zufälligen Nachbarn +3. Routingtabellen: In jedem Switch mit einem Eintrag pro Ziel. Enthält Info über kürzeste Wege + * Kriterien: Schleifenfreiheit, gute Einschätzungen + * Konstruktion: Anfangs leer, wie soll ein Knoten etwas erfahren? + * Passiv: Beobachtung des Traffics + * Aktiv: Austausch von Informationen zwischen Routern + * Problem: Ab gewisser Größe keine Speichermöglichkeit für jedes Ziel mehr + * Lösung: Divide and Conquer: Aufteilen des Netzwerks in Ebenen + +Fehlerquellen: +* Umwandlung von Bits in Signale +* Zugriff nicht möglich +* Paketverlust +* Fehlerhafte Routingtabellen +* Falsche Anordnung der Pakete +* Empfangsrate des Empfängers niedriger als die Senderate des Senders + +Umgang mit Fehlern: +* Fehlerkontrolle := Zwischen Nachbarn oder Endpunkten +* Überlastungskontrolle + * Schutz gegen Pufferüberläufe, Regulierung der ins Netz geschickten Pakete (Staukontrolle) + * Schutz von Endsystemen gegen zu viele ankommende Pakete (Flusskontrolle) +* Wo und Wie ist die wichtige Frage: + * Im Endsystem oder im Netzwerk + * Großer Unterschied zwischen Telefon und Internet + +--- +# Kapitel 2: Architektur +Netzwerke werden irgendwann zu groß, um sie als eine Ebene zu betrachten, deshalb: Aufspaltung in verschiedene Layer. +* Jedes Layer besitzt eigene Regeln und Prozeduren +* Jeder Dienst besitzt Schnittstellen zu höheren Ebenen +* Dienste können über ihren SAP (Service Access Point) erreicht werden und sind sozusagen ein Versprechen, was mit den Daten die am SAP ankommen passiert. + +Services: Layer bieten ihren Nutzern über ihre Interfaces Dienste an. + +Konvention für die Layer: Fortlaufende Nummerrierung, je höher desto abstrakter + +Serviceprimitive: Menge an Operationen welche auf dem Interface eines Dienstes möglich sind + +* Main Groups + * Viele verschiedene Serviceprimitive sind denkbar, normalerweise werden vier verwendet: + * Request (Req) := Anfrage an ein Layer einen Service auzuführen + * Indication (Ind) := Ein Layer zeigt seinem Nutzer, dass etwas passiert ist (asynchrone Benachrichtigung) + * Response (Res) := Ein Nutzer von höherem Layer beantwortet eine Indication + * Confirmation (Conf) := Der ursprüngliche Dienstaufrufer wird über die Beendigung des Servicerequests informiert + * Nicht alle Typen müssen immer zur Verfügung stehen +* Dateneinheiten + * Dateneinheiten sind wohl begrenzte Nachrichten + * Nur vollständige Nachrichten werden gesendet + * Nur vollständige Nachrichten werden empfangen + * Dateneinheit ist das einzelne Byte, eine Folge von Bytes oder ein Bytestream + * Nicht in Nachrichten strukturiert + * Sender sendet eine Folge, wovon der Empfänger jede Teilsequenz verwenden kann +* Korrektheitsanforderungen + * Completeness: Alle gesendeten Nachrichten werden irgendwann zugestellt + * Correctness: Alle Daten die ankommen, sind auch genau die, die losgeschickt wurden (unverändert, ohne Bitfehler) + * Reihenfolgegetreu: Nachrichten und Bytesequenzen kommen in der korrekten Reihenfolge an + * Verlässlich: Sicher, Verfügbar,… + * Bestätigt: Erhalt von Daten wird dem Sender bestätigt + +Nicht alle Anforderungen müssen immer erfüllt sein + +## Verbindungsorientiert vs. Verbindungslos +* Telefonie vs. Post + * Service mit Einrichtungsphase -> Verbindungsorientierter Dienst + * Drei Phasen: Verbinden, Datenaustausch, Trennen + * Aufruf eines Serviceprimitivs kann zu zu jeder Zeit stattfinden -> Verbindungsloser Dienst + * Die Unterscheidung ist unabhängig von der Wahl von Circuit vs. Paketswitching +* Verbindungsorientierte Dienste müssen Primitive Bereitstellen um Verbindungen handhaben zu können: + * CONNECT - Einrichtung der Verbindung + * LISTEN - Warten auf Verbindungsanfragen + * INCOMING_CONN - Anzeige eingehender Connectionrequests + * ACCEPT - Annahme einer Verbindung + * DISCONNECT - Terminierung einer Verbindung + +Typische Servicebeispiele: +* Datagrammdienst: + * Dateneinheit -> Nachrichten + * Korrekt, aber nicht in Reihenfolge + * Verbindungslos + * unsicher/ nicht zuverlässig, nicht bestätigt +* Zuverlässiger Bytestream: + * Dateneinheit -> Bytestrom + * Korrekt, vollständig, reihenfolgegetreu, bestätigt + * Manchmal sicher/zuverlässig + * Verbindungsorientiert + +## Protokolle +Was macht ein Protokoll aus? … spezielle Nachrichten werden versand, auf welche hin spezielle Taten unternommen werden +> Protokolle bestimmen das Format, die Reihenfolge von Nachrichten, welche über Netzwerkeinrichtungen versandt und empfangen werde, sowie Aktionen welche bei Übertragung und Erhalt von Nachrichten ausgeführt werden. + +* Protokolle sind Regelsätze, welche beschreiben wie zwei oder mehr entfernte Teile (peers oder protocol entities) eines Layers kooperieren, um den Dienst des gegebenen Layers zu implementieren. +* Ein Protokoll ist die Implementierung eines Services + +### Protokollspezikiationen: +* Das formale Verhalten eines Protokolls muss präzise spezifiziert werden +* Hierfür geeignet: FSMs (Finite State Machines) + +Protokolle und FSMs +* FSMs implementieren die tatsächlichen Verhaltensregeln eines Protokolls +* Müssen mit entfernten Peers kommunizieren: + * müssen hierfür den Service des darunterliegenden Layers verwenden + * Mittels Serviceprimitiven, welche auch ankommende Daten an das Protokoll beretstellen können + * Anzeigen von niedrigeren Layern in Events für die Protokollengine des höheren Levels + +Wenn niedere Services verwendet werden, so werden den Nachrichten administrative Infos hinzugefügt, entweder als Header oder als Trailer +> Strict Layering:\ +> Jedes Layer verwendet nur den Service des darunter liegenden Layers + +Protokollmechanismen: +* Adressing +* Fragmentation +* Re-Sequencing +* Error-Control +* Flow-Control +* Congestation-Control +* Ressource-Allocation +* Multiplexing +* Compression +* Privacy, Authentication + +Wie sollten Layer strukturiert werden? +* Modularisation vereinfacht die Wartung +* Layerstruktur und Protokolle definieren die Kommunikationsarchitektur + +### Layering: Vor- und Nachteile +| Vorteile | Nachteile | +| -- | -- | +| Layer nötig um Komplexität zu verwalten und zu beherrschen | Layer können Funktionen redundant haben | +| Änderung der Implementierung eines Layerdienstes ist transparent | Verschiedene Layer können selbe Information benötigen | +| Typische Funktion: Ideales Netzwerk | Layer n benöitigt eventuell Einblick in Layern n+x | + +Es existieren zwei Referenzmodelle: +* ISO/OSI +* TCP/IP + +## ISO/OSI Referenzmodell +* Designprinzipien: + * Ein Layer per Ebene + * Jedes Layer mit wohldefinierter Funktion + * Layergrenzen mit mglst. wenig Informationsfluss + * Genug Layer zur Unterscheidung, wenig genug um Verwaltbarkeit zu schaffen + +Insgesamt 7 Layer werden unterschieden. +* Physisches Layer (PH) + * Bietet eine bittransparente Schnittstelle zum physischen Medium + * Spezifiziert mechanische, elektrische, funktionale und prozedurale Mittel um die **physische Verbindung zwischen zwei offenen Systemen zu unterstützen.** + * Physische Verbindung impliziert nicht die verbindungsorientierte Operation + * Verschiedene Übertragungsmedien können genutzt werden, jeweils verschiedene Protokolle sind von Nöten + * In-sequence Zustellung der Bits ist sichergestellt + * Fehlererkennung ist manchmal inkludiert +* Link Layer (L) + * Unterstützt Übertragung von service data units (SDU) größer als „word“ unter Systemen, welche über einen einzigen physischen Pfad verbunden sind. + * Essentielle Funktion ist block synchronization + * Teilweise wird Fehlererkennung oder Fehlerkontrolle zur Verfügung gestellt. + * Im Fall von Halb-duplex oder multipoint links muss der Zugriff auf das Medium **kontrolliert werden und Peersysteme müssen addressiert werden.** +* Network Layer (N) + * Erschafft einen logischen Pfad zwischen offenen Systemen, welche verbunden sind mit individuellen, möglicherweise verschiedenen Subnetworks + * Dieser logische Pfad kann durch mehrere, möglicherweise verschiedene dazwischenliegende Subnetworks gehen + * Diese Netzwerkebene unterstützt Routing, also müssen sich N-Service Benutzer nicht **um den Pfad kümmern** + * Der N-Service ist uniform, unabhängig von der Variation an Subnetwork Technologien, Topologien, QoS und der Organisation + * Netzwerk Addresse = Endsystem Addresse +* Transport Layer (T) + * Vervollständigt den Übertragungsteil des OSI Stacks. Unterstützt die Übertragung mit **gefordertem QoS, auf wirtschaftliche Weise zwischen (T)-nutzern (normalerweise Prozessse in einem Endsystem), unabhängig von der Netzwerkstruktur** + * Verschiedene Klassen von Protokollen mit verschiedenen Funktionalitäten sind **festgelegt (connectionoriented / connectionless; reliable / unreliable)** +* Session Layer (S) + * Unterstützt die Synchronisation des Dialogs und die Verwaltung des Datenaustausches (möglicherweise über mehrere transport layer connections aufspannend) + * Quarantine Data delivery - Eine ganze Gruppe von übertragenen S-SDUs wird zugestellt auf explizite Anfrage des Senders + * Interaktionsverwaltung erlaubt ausdrücklich festzulegen, welcher S-User das Recht bekommt zu übertragen + * Zurücksetzen der Verbindung auf vordefinierte Synchronisationspunkte +* Presentation Layer (P) + * Unterstützt die Übersetzung von Daten und Datenstrukturen in einzigartige Repräsentation + * Ausschließlich die Syntax wird modifiziert um die Semantik beizubehalten + * Auswahl von einer der allgemein anerkannten Transfersyntax + * Die lokale Syntax von jedem Endsystem wird in oder von der ausgewählten Transfer Syntax übersetzt +* Application Layer (A) + * Unterstützt den direkten Endnutzer durch die Bereitstellung einer Vielzahl an application services + * Dies kann sein: + * Genereller Typ (z.B. Entfernte prozedurale Anrufe, Transaktionsdurchführung,...) + * Spezifischer Typ (z.B. Virtuelles Terminal, Dateiübertragungszugriff und Verwaltung, Arbeitswechsel,...) + * Ein typisches Beispiel: virtuelles Terminal (Funktionen des reellen Terminals werden in **virtuelle Funktionen gemappt**) + +#### Kritik am ISO/OSI Modell +* Das Modell als solches mit der Unterteilung in Layer ist heutzutage sehr einflussreich +* Im praktischen Gebrauch aber eher irrelevant +* ISO konnte sich nicht durchsetzen +* Im Internetprotokoll (IP-Modell) wurden die obersten drei OSI-Layer in ein Applicationlayer zusammengefasst + +#### Architekturvoraussetzungen für das Internet +* Generalität := Unterstütze alle möglichen Sets von Applikationen +* Heterogenität := Verbinde alle Arten von Netzwerktechnologien +* Robustheit := Wichtiger als Effizienz +* Erweiterbarkeit := Wichtiger als Effizienz +* Skalierbarkeit := Spätere Entdeckung + +#### Grundlagen der Internetarchitektur +* Dumme Netzwerke, smarte Endgeräte +* Dumme Netzwerke brauchen nur einen geringsten gemeinsamen Dienst + * Datagrammdienst: kein Verbindungsstatus in den Routern + * Best effort: Gleichbehandlung + * Verlieren, verdoppeln und vertauschen +* Intelligente Hosts + * Behalten den Zustand + * "Schicksalsteilung" - Wenn ein Host zusammenbricht und den Kommunikationszustand verliert, so teilen alle Applikationen, welche kommunizieren dieses Schicksal + + +### TCP/IP Referenzmodell +* Basierend auf dem ARPANET +* Definiert nur zwei Layer + * Internetlayer: Packetswitching, Adressierung, Routing und Forwarding. Insbesondere für hierarchische Netze + * Transportlayer + * zuverlässiger Bytestrom: TCP (Transport Control Protokoll) + * unzuverlässiges Datagramm: UDP (User Datagramm Protokoll) +* Niedere und höhere Layer nicht wirklich definiert + * Host zu Host Kommunikation als gegeben angesehen + * Anwendungen geschätzt +* Jedes Layer nimmt Daten vom darüberliegenden Layer, fügt eine Headereinheit hinzu und erstellt eine neue Dateneinheit und schickt diese an das Layer darunter +* TCP/IP - Reihe von Protokollen: viele anwendungsspezifische Protokolle über IP + +#### Kritik am TCP/IP Modell +* keine klare Unterteilung zwischen Service, Protokoll und Interface + * Gleichstellung von TCP mit zuverlässigem Bytestrom eigentlich nicht zulässig + * Insbesondere unter IP +* Stark spezialisierter Stack, erlaubt keine Generalisierung +* Große Lücke unterhalb von IP +* Viele Einzelfalllösungen + +### ISO/OSI vs TCP/IP +* ISO/OSI: Sehr nützliches Modell, keine existierenden Protokolle +* TCP/IP: Nicht existentes Modell, sehr nützliche Protokolle +* Deshalb: ISO/OSI Modell aber TCP/IP Stack + +## Standardisierung +* Zum Bau großer Netzwerke werden Standards benötigt +* Traditionell aus dem Telekommunikationshintergrund + * Eingelaufen, weltweit aber langsam +* Internet + * Hauptsächlich um die IETF herum + * Zählungsorientiert, Fokus auf funktionierenden Implementationen + * Hoffnung auf schnelle Einführungszeiten + * Herstellergremien + +### ISO Standardisierverfahren +Standardisierungsprozess: +* DP: Draft Proposal +* DIS: Draft International Standard +* IS: International Standard + +## Zusammenfassung Kapitel 2 +* Komplexitätsbeherrschung nur mit Teilung in Subsysteme mit klar definierten Rollen -> Layering +* Jedes Layer bietet einen bestimmten Service an + * Services werden mächtiger, je höher man in der Hierarchie aufsteigt +* Um einen Service anzubieten, muss ein Layer über entfernte Geräte verteilt sein +* Entfernte Teile eines Layers verwenden ein Protokoll um Zusammenzuarbeiten + * Ein Protokoll ist eine horizontale, ein Service eine vertikale Beziehung +* Zwei wichtige Referenzmodelle existieren, welche beschreiben, wie man Funktionalitten in Layer gruppieren kann, welcher Service wo bereitgestellt wird, und wie man Protokolle strukturiert. + +--- +# Kapitel 3: Physikalisches Layer +## Synchronisation +Wann sollte man das Signal eigentlich sampeln? +* Wie weiß der Empfänger, wann das Signal auf einen Wert gemappt werden soll? + * Konvention: In der Mitte jedes Symbols, nur wann ist das nun genau? + * Länge ist typischerweise bekannt über die Konvention über die Symbolrate +* Der Empfänger muss mit dem Sender auf Bitlevel synchronisiert sein + * Link-Layer zuständig für Framesynchronisation + +### Vereinfachtes Konzept: +* Nimm an, dass Sender und Empfänger irgendwann synchron sind und beide eine Uhr haben, welche bei jedem Symbolschritt tickt +* Problem: Uhrendrift ist ein großes Problem - die Synchronisation wird verloren gehen +* Lösung: + 1. Stelle ein explizites Uhrensignal auf einem parallelen Kanal bereit + 2. Synchronisiere nur an kritischen Punkten (Uhrendrift ist nicht so schnell) + 3. Extrahiere Uhreninformation aus dem Signal selbst + +Idee: Mit NRZL (Non-Return to Zero Level) müsste sich die Länge der Bits herausfinden lassen + +Problem: Lange 1 oder 0 Folgen bieten keine Anhaltspunkte für die Bitgrenzen, somit hinfällig + +Idee: Manchesterkodierung, stelle dem Sender bei jedem Bit Informationen bereit, dass dies eine Stelle ist, bei der ein Bit startet, stoppt, seine Mitte erreicht hat + +Stellt eine ausreichende Anzahl an Signalwechseln sicher + +Problem: Benötigen die doppelte Bandbreite, da die Baudrate = 2*Bitrate ist. + +> Baudrate:\ +> Die Baudrate beschreibt die Anzahl der Symbole welche innerhalb einer Zeiteinheit übertragen werden + +## Breitband- vs. Basisbandübertragung +* Bisherige Übertragungsschemen: Basisbandübertragung + * Schieben die digitalen Symbolsequenzen direkt auf den Draht + * Verschiedene Level von Spannung/Stromstärke und co wird verwendet +* Probleme: Beschränkte Bandbreite verändert das Signal, Dämpfung und Verzerrung + +### Breitbandübertragung +* Lösen vom breiten Spektrum für DC-Übertragung +* Verwende Sinuswelle als Träger, hat meist eine, allerdings auch nur eine, hohe Frequenz +* Reine Sinuswellen haben keine Information, deshalb Beeinflussung durch + * Amplitude a + * Frequenz f + * Phase φ + +Unterschiedliche Varianten der Signalmodulation möglich: +1. Amplitudenmodulation\ + Die Amplitude lässt sich beispielsweise als das zu sendende Signal s(t) geben. Spezialfälle: + * s(t) analog - Amplitudenmodulation + * s(t) digital - Amplitudenkeying + * s(t) 0 oder 1 - An/Aus Keying +2. Frequenzmodulation +3. Phasenmodulation + * Phasenmodulation mit hohen verschiedenen Werten pro Symbol + * Der Empfänger kann gut zwischen Phasenwechseln unterscheiden + * Verwende Phasenverschiebungen von 0, π/2, π, 3π/2 um je zwei Bits je Symbol zu kodieren + * Besser noch in π/4 Schritten, somit Uhrenextraktion ermöglicht und Datenrate = 2* Symbolrate + * Wird QPSK genannt + * Verschiedene Modulationsarten können gut miteinander kombiniert werden + * Beispiel: 16-QAM (Quadrature Amplitude Modulation) + * Verwendet 16 Kombinationen von Phasenwechseln und Amplitude für jedes Symbol, somit Pro Symbol 2⁴ Bits codiert und übertragen + +## Digitales vs. Analoges Signal +* Digitale Übertragung: Endliches Set von verschiedenen Signalen +* Analoge Übertragung: Unendliches Set von verschiedenen Signalen +* Beispiel: Signal korresponidert zur Stromstärke auf der Leitung + * Digital: Endlich viele erlaubte Stromstärken, zb. 1A, 2A, 3A, 4A + * Analog: Jede Stromstärke ist erlaubt +* Vorteil von digitaler Übertragung: Hohe Chance, dass der Empfänger, das gesendete Signal sehr gt rekonstruieren kann + +Beispiele für Übertragungsmedien +* Geführte Übertragungsmedien + * Kupferdrähte - Twisted Pair + * Kupferdrähte - Koaxialkabel + * Fibre Optics (Glasfaser) +* Drahtlose Übertragung + * Radio + * Mikrowellen + * Infrarot + * Lichtwellen + +## Zusammenfassung Kapitel 3 +* Das physikalische Layer ist zuständig für die Umwandlung einer logischen Sequenz an Bits in ein physisches Signal, welches sich durch den Raum ausbreiten kann +* Viele verschiedene Formen von physischen Signalen sind möglich +* Signale sind limitiert durch ihre Ausbreitung ineinem physikalischen Medium (begrenzte Bandbreite, …) und Rauschen. +* Bits können kombiniert werden in vielfach besetzte Symbole für die Übertragung + * Erhöht die Differenz zwischen Baud- und Bitrate + * Basisbandübertragung ist fehlerbehaftet, teilweise verbesserbar durch die Modulation eines Signals auf einen Träger (Breitbandübertragung) + +--- +# Kapitel 4: Data Link Layer +## Services des Link Layers +* Der Link Layer sitzt oberhalb des physischen Layers + * Kann also einen Bitstromübertragungsdienst verwenden + * Service kann allerdings inkorrekte Bits haben +* Erwartungen des höheren Netzwerklayers + * Entweder Paketservice oder Bitstromdienst + * Möchte von Fehlern nichts wissen und sich darum auch nicht kümmern + +Optionen für Linklayer-Services +* Zuverlässig (Ja/Nein) + * Zugestelltes Paket mit gleichem Inhalt wie das losgeschickte + * Zustellung aller Pakete + * Reihenfolgentreue +* Fehlerkontrolle verfügbar? + * Vorwärts oder Rückwärtsorientiert +* Verbindungsorientiert? + * Soll gemeinsamer Kontext etabliert werden +* Paket oder Bitstromabstraktion + * Typischerweise in Computernetzwerken: Pakete + * Gibt es eine maximale Paketlänge? + +## Einfache Linklayerfunktionen (Übersicht) +### Framing +* Wie erstellt man aus dem Bitstrom des physischen Layers klar abgegrenzte Frames und wie erkennt man diese? + * Für Fehlerkontrolle benötigt + * Frames und Pakete sind das selbe, ist nur eine Namenskonvention für das Link Layer +* Zusätzlich: Fragmentation und Wiederzusammensetzung, falls Pakete des Netzwerklayers größer denen des Link Layers sein sollten + +### Fehlerkontrolle +* Typischerweise eher im Netzwerklayer +* Fehlererkennung - gibt es fehlerhafte Bits? +* Fehlerkorrektur - Werden erkannte Fehler repariert? + * Vorwärts - Investiere Arbeit bevor der Fehler passiert + * Rückwärts - Investiere Arbeit nachdem der Fehler passiert ist, unternimm Reparaturversuche + +### Verbindungsaufbau +* Verbindungen in vielerlei Hinsicht nützlich + * Anwendungskontext + * Fehlerkontrolle +* Frage: Wie baut man Verbindungen auf und wieder ab? + * Insbesondere oberhalb von Frames, mittels virtueller Verbindungen, da es keine geswitchte Ende-zu-Ende Verbindung gibt + +### Flusskontrolle +* Schneller Sender, langsamer Empfänger -> Puffer des Empfängers werden schneller gefüllt, als er diese leeren kann -> Verlorener Übertragungsaufwand +* Deshalb Adaptierung der Anzahl an Frames pro Link Layer Sendungen pro Zeit an den Empfänger + +## Framing +* Wie kann man einen Bitstrom in eine Sequenz von Frames umwandeln? + +### Framing durch Zählen der Charakter +* Idee: Veröffentlichen der Anzahl an Bits in einem Frame an den Empfänger + * Hinzufügen der Infos in den Frameheader +* Problem: Fehlerhafte Zählerinformation zerstört wiederum die gesamte Framesynchronisation + +### Framing durch Flagbitmuster/Bitstuffing +* Verwende ein Bitmuster welches Start/Ende markiert +* Verwende Bitstuffing, wann immer 5*1 hintereinander, so füge eine 0 daran an, außer beim Flagmuster +* Der Empfänger wiederum, wirft dann alle 0en nach 5*1 weg + +### Framing durch Codeverletzungen +* Angenommen, die Codierungsregeln des physischen Layers lassen noch Spielraum + * nicht alle Möglichkeiten an Kombinationen sind genutzt + * Bei Manchester z.B. nur low/high und high/low +* Falls diese Regeln verletzt werden, können zusätzliche Daten übertragen werden, z.B. Beginn und Ende eines Frames +* Bei Manchester dann high/high oder low/low +* Zerstört zwar das Selbstclocking Feature aber bei kurzen Übertragungen verschmerzbar + +## Fehlerkontrolle - Redundanz +* Zwei grundlegende Aspekte: + * Erkennen + * Korrigieren +* Beides ist unabhängig voneinander möglich + * Erkennen ohne Korrigieren: Tu einfach so als wäre das Paket nie angekommen + * Korrigiere aber erkenne nicht: Versuche so viel wie möglich zu korrigieren, aber versuche keine neuen zu entdecken und kümmere dich auch nicht darum + * Beispiel: Videoanruf oder Musikstreaming, dort sind kleinere Bitfehler voll verschmerzbar + > EDC = Error Detection and Correction Bits\ + > D = Data protected by error checking +* Fehlerdetektion ist nie 100% möglich: Fehler können übersehen werden … +* Irgendeine Form von Fehlerkontrolle erfordert Redundanz in den Frames +* Ohne Redundanz: + * Frame der Länge m kann 2^m Frames darstellen + * alle davon sind legal + * Unmöglich hier Veränderungen zu erkennen +* Kernidee: Deklariere einige Nachrichten als illegal + * Benötigen dennoch 2^m legale Frames, deshalb Frames mit n > m Gesamtlänge + * Die extra Bits werden in Headern oder Trailern mit versand und erlauben es dem Empfänger illegale Frames zu erkennen +* Wie hilft das bei der Bitfehlererkennung? + * Sender sendet nur legale Frames, die vom Medium korrumpiert werden + * Hoffnung: Ein legaler Frame wird nie ein anderer legaler Frame, sondern ein illegaler, notwendig hierfür: nur eine gewisse Anzahl an Bitflips darf auftreten + +### Parität +* Erzeugung eines redundanten Bit: Parität + * ungerade Parität: füge ein Bit hinzu, sodass die Gesamtzahl an 1en ungerade ist + * gerade Parität: füge ein Bit hinzu, sodass die Gesamtzahl der 1en gerade ist +* Angenommen der Empfänger erwartet immer gerade Parität, so kann er Fehler erkennen, sobald es eine ungerade Parität gibt + +### Checksummen +* Zur Berechnung von Checksummen behandelt der Sender die Daten als Sequenz von binären Integers +* Gruppieren in zweier Kombis und aufaddieren von deren Werten um die Checksumme zu erhalten +* Positiv: Einfach zu berechnen +* Negativ: Erkennen nicht alle häufigen Fehler + +### Hammingdistanz +Hammingdistanz = Anzahl an Stellen an denen sich zwei Frames x und y in binärer Darstellung unterscheiden lösbar mittels (x XOR y). + +Generalisierung +* Um Bitfehler zu erkennen, ist eine Hammingdistanz von d+1 in der Menge der legalen Frames nötig + * So, dass man unmöglich mit nur d Bitflips einen legalen Frame in einen anderen Schreiben kann +* Um Bitfehler korrigieren zu können ist eine Hammingdistanz von 2d+1 in der Menge der legalen Frames benötigt + * So sind alle Frames die bis zu d Bits vom nächsten legalen Frame entfernt sind, noch mehr als d Bits zum anderen legalen Frame entfernt sind + +### Frame Mengen - Code Books, Code +* Terminologie + * Codebook = Menge von legalen Frames + * Rate R von Code $S: R = log|S|/n$ (Effizienz) + * Distanz d von Code $S: d = d(S)/n$ (Fehlererkennungs/korrekturmöglichkeiten) +* Kriterien für guten Code: hohe Distant und große Rate +* Konstruktion guter Codes schwer, Möglichkeit mehrerer Paritätsbits wappnet gegen Bündelfehler + +### Cyclic Redundancy Check - CRC +* Effizient, hohe Erkennungswahrscheinlichkeit mit wenig Redundanzbits +* Funktion beruht auf polynomieller Arithmetik + * Bitstrings als Repräsentanten von Polynomen + * Koeffizienten 0 und 1 möglich, interpretiert als modulo 2 +* Idee: Fasse die Stränge von Bits als Repräsentation der Koeffizienten des Polynoms auf + * Bitstring mit (n+1) Bits = Polynom von Grad n +* Verwende Polynome um CR Bits zu berechnen + * Definiere eine Generatorpolynom G(x) des Grades g + * Sowohl Sender als auch Empfänger bekannt + * Verwenden g Redundanzbits + * Gegeben Nachricht M(x) + * Sender berechnet Rest r(x) der Division $x^g*M(x)/G(x)$ + * Überträge $T(x) = x^g M(x)-r(x)$ + * T(x) ist restfrei Teilbar durch G(x) + * Empfänger erhält m(x) + * Berechnet den Rest der Division von m(x) durch G(x) + +CRC Übertragung und Empfang +* Keine Fehler T(x) kommt korrekt an +* Bitfehler: T(x) ist verändert, dh. Koeffizienten wurden verändert + * Es kommt also T(x) + E(x) an +* Auf Empfängerseite: + * Empfange m(x) und berechne m(x) / G(x) + * Fehlerfrei: m(x) = T(x) + * Bitfehler: m(x) / G(x) = (T(x)+E(x))/G(x) = T(x)/G(x) + E(x)/G(x) +* Die Wahl von G(x) bestimmt die CRC Eigenschaften +* In der Anwendung werden sämtliche Fehler nach dem CRC-Check ignoriert + * Fehler können dennoch auftretem, insbesondere sind Fehler meist berstend + +### Rückwärtsfehlerkontrolle +Behandlung erkannter Fehler auf zwei Arten und Weisen +- Vorwärts: Sender sendet redundante Infos so, dass der Empfänger selbst ausbessern kann +- Rückwärts: Sender sendet redundante Infos so, dass der Empfänger fehlerhafte Pakete wahrscheinlich erkennt und Pakete in dem Fall nochmal verschickt werden können + +Rückwärtskorrekturverfahrensprotokolle sind unter dem Namen Automatic Repeat Request (ARQ) bekannt: +* Send and Wait +* Go-Back-N +* Selective Reject + +#### Send and Wait +* Sender schickt ein Paket, stellt sich einen Timer, wartet auf eine Quittung, und wenn keine ankommt, dann überträgt er es erneut +* Beschädigte Pakete werden vom Empfänger einfach verworfen +* Problem: Falls das ACK Paket verloren geht/ beschädigt wird, so kann dies der Sender nicht erkennen: + * Schickt einfach neu, und der Empfänger hat plötzlich zwei Kopien des selben Pakets +* Lösung + * Einführen von Sequenznummern, um zwischen verlorenen Paketen und Quittungen, sowie neuen und schon empfangenen Paketen zu unterscheiden + * Konvention: Sende Sequenznummer des zuletzt korrekt empfangenen Pakets in der Quittung + +##### Alternating Bit Protokoll +* Einführung der Sequenznummern 0 und 1 in den Nachrichten und ACKs +* Bedenke: ACKs nun mit doppelter Funktion + * Bestätigen dem Sender, die Ankunft des Pakets + * Erlauben es dem Sender eine weitere Nachricht zu senden + +##### ARQ - Sliding Windows +> Effizienz\ +> Definiert als die Rate der Zeit, in welcher der Sender neue Informationen sendet (für den fehlerfreien Kanal)\ +> Effizienz = $\frac{T_{packet} }{ T_{packet} + d + T_{ack} + d}$ + +* Die Effizienz des einfachen Alternatingbitprotokolls ist gering, wenn die Verzögerung im Vergleich zur Datenrate hoch ist. + +Verbesserung der Effizienz +* Ineffizienz von Alternatingbitprotokollen in Situationen mit großem Bandwith/Delay Produkt hängt mit der Wartezeit und dadurch ungenutztem Speicherplatz zusammen +* Dauerhaftes Senden führt zu höherer Effizienz, deshalb Pipelining von Paketen und Einführen eines größeren Sequenznummernraums + +Sliding Windows +* Führe neuen Sequenznummernraum mit 2^n Sequenznummern ein, wobei nie alle gleichzeitig verwendet werden dürfen +* Verwende Sliding Windows sowohl beim Sender als auch beim Empfänger, um diese Nummern zu behandeln + * Sendefenster = Menge an zum Versand freigegebenen Sequenznummern + * Empfangsfenster = Menge an Sequenznummern welche zur gegebenen Zeit akzeptiert werden + +###### Übertragungsfehler und Empfangsfenstergröße +* Annahme: Linklayer sollte alle Frames korrekt und in Reihenfolge zustellen, der Sender verwendet Pipelining +* Beim Verlieren von Paketen bei einer Empfangsfentergröße 1 werden alle folgenden Pakete verworfen + +#### Go-Back-N +* Bei Empfangsfenstergröße 1 können alle auf einen verlorenen Frame gesendeten Frames nicht vom Empfänger verarbeitet werden + * Sind out of Sequence und können nicht bestätigt werden +* -> Sender wird einen Timeout erfahren + * Da alle Frames in der Zwischenzeit aber weitergesendet wurden, müssen diese erneut übertragen werden +* Go Back N ist leider ziemlich verschwenderisch mit den Ressourcen, minimiert aber den Overhead beim Empfänger + +##### Selective Reject / Selective Repeat +* Empfänger kann nun einige Pakete puffern +* Der Empfänger sendet im Fehlerfall negative Acknowledgements +* Der Sender wiederholt die Übertragung von fehlenden Frames + +##### Duplexoperation und Piggybacking +* Bisher Simplexoperation am oberen Serviceinterface, dh. Empfänger sendet ausschließlich ACKs zurück +* Wenn das obere Dienstinterface Full-Duplex unterstützt, dann wechsle Datenframes und ACK-Frames für eine gegebene Richtung ab + * Stecke die ACK-Info für Richtung A ! B in die Datenframes für B ! A (Piggybacking) + +#### Leistungsverhalten: +* Fehlerfreies Send and Wait: + * S = 1/(1+2a) wobei a = T-prop / T-frame +* Fehlerbehaftetes Send and Wait: + * S = (1-P)/(1+2a) +* Fehlerfreies Sliding Window: + * Sei W die Anzahl an Frames, welche der Sender senden kann, bevor er auf Quittungen warten muss + * Normalisierter Durchsatz: S = {1, falls W >= 2a+1, W/(2a+1) sonst} +* Selective Reject: + * S = {1-P, falls W >= 2a+1, (W(1-P))/(2a+1) sonst} +* Go-Back-N: + * S = {(1-P)/(1+2aP), falls W >= 2a+1, (W(1-P))/((2a+1)(1-P+WP)) sonst} + +## Folgerung Kapitel 4 +* Die meisten Probleme im Linklayer entstehen durch Fehler + * Fehler in der Synchronisation erfordern nichttriviale Framingfunktionen + * Fehler in der Übertragung erfordern Mechanismen diese zu Korrigieren und zu Verstecken, oder sie zu erkennen und zu reparieren +* Flusskontrolle ist oft eng in die Fehlerkontrolle integriert + * Ist allerdings eine separate, auch getrennt implementierbare Funktion +* Wahl des Fehlerkontrollschemas beeinflusst die Performance +* Verbindungsaufbau und -abbau muss noch behandelt werden + +--- +# Kapitel 5: Medium Access Control (MAC) +## Einführung: Multiple Access Link und Protokolle +* Point to Point +* Broadcast (geteiltes Medium) +* Einzelner geteilter Broadcastkanal +* zeitgleiche Übertragung von zwei oder mehr Knoten: Interferenz + +### Multiple Access Protokoll +* Verteilter Algorithmus, der bestimmt, wie Knoten auf ein geteiltes Medium zugreifen +* Oftmals kein out-of-Band Kanal für die Koordination + +### Broadcastkanal mit Rate R b/s +* Will nur einer Senden so kann er dies mit R, wollen M Instanzen senden, so sollen sie dies in R/M können. +* Völllig dezentralisiert und so einfach wie möglich + +### Statisches Multiplexing +* Eine einzelne Ressource kann statisch gemultiplext werden indem: + * Man feste Sendezeiten einräumt + * Mehrere Frequenzbänder verwendet + +### Berstender Verkehr (Burst) +* großes Problem, da + * die Ressource groß genug sein muss um mit der Datenrate sofort zurecht zu kommen + * auf den durchschnittlichen Verbrauch ausgelegt sein muss und aber Puffer benötigt + +### Statisches multiplexing berstenden Verkehrs - Verzögerung +* Basisfall: Kein Multiplexing, einzige Trafficquelle mit durchschnittlicher Rate P und Kapazität C + * Verzögerung ist T +* Multiplexing: Unterteile Ressource in N Quellen mit gesamter totalen Rate, statisch gemultiplext + * Verzögerung T-FDM = N \* T + * Unabhängig von FDM, TDM +* -> Multiplexing erhöht das Delay um das N-fache + +### Dynamische Kanalzuweisung +* Statisches Multiplexing nicht geeignet für berstenden Verkehr +* Alternative: Weise der Quelle welche Senden will den Kanal/Link zu + +#### Annahmen für die dynmaische Kanalzuweisung +* Stationsmodell: + * N unabhängige Stationen + * Mögliches Lastmodell: Wahrscheinlichkeit des Generierens eines Pakets im Intervall t ist x*T, mit x konstant +* Einkanalannahme: + * Nur ein Kanal für alle Stationen und für alle Nachrichten +* Kollisionsannahme: + * Nur je ein Frame zeitgleich fehlerfrei übertragbar +* Zeitmodell: + * Kontinuierlich: Übertragungen können jederzeit stattfinden + * Geslottet: Zeit ist in Slots eingeteilt, Übertragung kann nur an Slotgrenzen beginnen +* Carrier Sensing: + * Stationen können (oder auch nicht) erkennen, ob der Kanal frei oder in Benutzung ist + * Falls Kanal als belegt angesehen, so wird nichts übertragen + +##### Zahlen von Merit +* Wie ist die Effizienz eines dynamischen Kanalzuweisungssystems zu bewerten? + * Bei hoher Last sollen möglichst viele Pakete durchkommen + * Bei niedriger Last soll die Verzögerung so gering als mögich sein + * Fairness - Wird jede Station gleich behandelt? + +###### Durchsatz und angebotene Last +* Last G: falls > 1 so Überladung +* Ideal: S gleicht angebotener Last solange G < 1, S = 1 falls G <= 1 (nicht sehr realistisch) + +### Grundlegende Optionen für MAC +* Kollisionsfreie Protokolle +* Limited Contention Protokolle (beschränkt Kollisionsbehaftet) +* Kollisionsprotokolle + +#### Kollisionsbehaftete Protokolle +* ALOHA: + * Jeder sendet einfach sobald er etwas zu senden hat, keine Benachrichtigung über den Erfolg einer Übertragung möglich + * Paketübertragung bei ALOHA ist nur dann erfolgreich, wenn es keine weitere Übertragung in zwei Paketzeiten gibt -> mittlerer Erreichbarer Durchsatz < 20% +* Slotted ALOHA: + * Verwende nun Zeitslots (werden als irgendwie verfügbar angesehen) + * Dadurch Verdoppelung des Durchsatzes auf ca 36% + * Problem nach wie vor, der Durchsatz bricht zusammen, sobald sich die Last erhöht + +### Carrier Sensing +* Höre bevor du redest, und sende nichts, wenn das Medium gerade belegt ist +* 1-Persistent CSMA + * Falls belegt, so warte bis frei und sende dann -> Probleme entstehen, wenn mehrere nach der jetzigen Nachricht senden wollen +* Non-Persistent CSMA + * Wenn Kanal frei so übertrage, wenn Kanal belegt, so warte eine zufällige Zeit vor dem nächsten Freiheitstest + * Performance abhängig von der Zufallsverteilung, besser bei hoher Last, bei geringer Last nur unnützes Warten +* P-Persistent CSMA + * Kombiniert bisherige Ideen + geslottete Zeit + * Warte ständig auf freiwerden des Kanals, + * übertrage dann aber nicht sofort, sondern werfe eine Münze mit WK p, und sende mit WK p oder Warte mit 1-p auf nächsten Zeitslot und prüfe wieder + +#### CSMA und die Ausbreitungsverzögerung +* Problem jedes CSMAs: Ausbreitungsverzögerung +* Zwei Stationen seien bereit zum Senden zur Zeit t und t+e + * Zum Zeitpunkt t ist der Kanal frei, und Stationen durch Verzögerung d > e getrennt + * -> Station 2 kann bereits begonnene Übertragung von Station 1 nicht erkennen und sendet -> Kollision + +#### Collision Detetion - CSMA/CD +* Bei Kollision zweier Pakete geht viel Zeit durch die Beendigung der Übertragung verloren +* Abhängig vom physischen Layer können Kollisionen erkann werden + * Notwendig: Sender muss während des Sendens in den Kanal hören und dies mit seinem gesendeten vergleichen , falls dies nicht identisch ist, so deklariere es als Kollision +* Sollte eine Kollision aufgetreten sein, so warte eine zufällige Zeit + +#### Wahl einer zufälligen Wartezeit +* Einfach: Wähle einen aus k Slots +* Aber wie beschränkt man k nach oben? + * Kleines k: kurze Verzögerung, mehr Kollisionen + * Großes k: große Verzögerung, weniger Kollisionen + * -> Adaptiere k an die Verkehrslast + +#### Adaption von k an die Last +* Verwende Kollisionen als Indikator für ein zu kleines Wettbewerbsfenster +* Frage: Wie erhöht man k und wie verringert man es wieder? + +#### Binary exponential Backoff +* Erhöhe nach Kollisionen: + * Verdopplung von k bis zu einer gewissen Größe +* Verringern von k: + * Kompliziert: Wenn genug Frames nicht kollidiert sind, so reduziere k + * Einfach: Starte jedesmal wieder bei k = 1 + +### Wettbewerbsfreie Protokolle +* Kollsionen bereiten Probleme -> Medium ohne Wettbewerb nutzen +* Beispiel: Statisches TDMA (Time Division Multiple Access) +* Ansätze um die Nachteile von TDMA zu kompensieren: + * Zuweisung der Zeitslots nur an sendebereite Knoten + * Zentraler Master vergibt Rederechte + * Tokenring + * Stationen übermitteln Sendewunsch + +### Polling und Tokenweitergabe +Polling: +* Masterknoten läd Slaveknoten zum Übertragen in Reihenfolge ein +* Probleme: Polling Overhead, Latenz, Single Point of Failure + +Tokenweitergabe: +* Kontrolltoken wird von einem zum anderen Knoten übertragen +* Probleme: Token Overhead, Latenz, Tokenverlust + +### Bit-Map-Protokoll +* Stationen melden Sendewunsch während eines Reservierungsslots an + +Eigenschaften: +* Verhalten bei geringer Last: + * Wenn kaum ein Paket versendet werden soll, so wiederholt das Medium die Contentionslots - > Wartezeit +* Verhalten bei großer Last: + * Hoher und stabiler Durchsatz mit vernachlässigbarem Overhead +* Bit-Map ist ein Carrier Sense Protokoll + +### Limited Contention Protokolle +* Wünschenswert: Protokoll mit + * geringer Verzögerung bei wenig Last + * hohem Durchsatz bei viel Last +* Idee 1: + * Anpassen der Stationsanzahl per Contentionslot + * Contentionslots sind gut für den Durchsatz, bei geringer Last können wir es uns aber nicht leisten, auf die Antworten zu warten -> Stationen müssen sich dynamisch einen Slot teilen +* Idee 2: Adaptives Baumprotokoll + * Verwende verschiedene Auflösungslevel für die Wettbewerbsslots + * Im höchsten Level teilen sich alle einen Slot + * Wenn nur ein Node einer Gruppe senden will, so darf er das + * Wenn es mehr als einer ist, so kommt es zur Kollision im Contentionslot -> verdopplte die Slots und halbiere die Stationsanzahl pro Slot + * Rekursion! + +## Fallstudie Ethernet +### Topologien +* Bustoplogie := Alle Geräte sind an einem Kabel angebunden und sind in einer Kollisionsdomäne +* Sterntopologie := einfachere automatische Verwaltung und Wartung bei fehlerhaften Adaptern + +#### Unzuverlässiger, verbindungsloser Dienst +* Verbindungslos: + * Kein Handshake +* Unzuverlässig: + * Keine ACKs oder NACKs + * Datagrammstream kann Lücken haben, welche gefüllt werden müssen, falls benötigt + +#### Physisches Layer +* Typischerweise Manchestercodierung + +#### Ethernet verwendet CSMA/CD +* Keine Slots +* Carrier Sense: Niemand überträgt, wenn er merkt, dass ein anderer Adapter gerade sendet +* Collision Detection: Übertragender Adapter bricht ab, wenn er Kollisionen bemerkt +* Random Access: Warten einer zufälligen Zeit vor erneuter Übertragung + +##### Ethernet - CSMA-CD Algorithmus +1. Adapter erhält Datagramm von der Netzwerkschicht und erstellt Frame +2. Falls Kanal frei, so sendet der Adapter den Frame, falls dem nicht so ist, warte bis Kanal frei +3. Wenn erfolgreich übertragen, dann ist der Adapter mit dem Frame fertig +4. Falls eine andere Übertragung zeitgleich stattgefunden hat, so stoppe und sende ein Störsignal +5. Nach dem Abbrechen geht es in den Exponential Backoff: Nach n-ter Kollision wähle ein K aus {0,1,2,…,2^(m-1)} mit m = min{10,n}: Adapter wartet nun K * 512 Bitzeiten und kehrt zu 2 zurück + +* Jam Signal: Stellt mit 48 Bits sicher, dass alle anderen die Kollision mitbekommen haben +* Bitzeit: 0.1 µs bei 10 Mbps Ethernet +* Exponentiall Backoff: + * wähle zuerst K aus {0,1}, dann ab der zweiten Kollision aus {0,1,2,3} und nach 10 Versuchen aus {0,1,2,3,…,1023} + +#### Effizienz +efficiency = $\frac{1}{ (1+5 * (t_{prop}/t_{trans}))}$ + +#### Hubs +* essentielle physical-layer-repeater +* Eingehende Bits werden an alle Ausgänge mit selber Rate und ohne Puffern verteilt +* Kein CSMA-CD am Hub, Aufgabe der Adapter\ +-> Hub stellt nur elektronische Verbindung her -> eine Kollisionsdomäne + +#### Switch +* nicht nur eine einfache elektrische Verbindung für sternförmige Topologie +* Wie tauscht man Pakete zwischen Kollisionsdomänen aus? + * Switches enthalten Puffer, welche direkt ankommende Pakete zwischenspeichern, bevor sie diese weiterleiten + +#### Geschwindigkeiten der Ethernetversionen +1. Switched Ethernet - mehrere Stationen über ein Kabel +2. Fast Ethernet - wie Switched nur mit 10ns Bitzeit +3. Gigabit Ethernet - jedes Kabel hat genau zwei Maschinen angehängt + * Mit Switch: + * Keine geteilten Kollisionsdomönen, benötigen kein CSMA-CD + * Fullduplexoperation auf jedem Link + * Mit Hub: + * Kollisionen, Halbduples, CSMA-CD + * Maximale Kabellänge 25 Meter + +## Zusammenfassung Kapitel 5 +* MAC Protokolle sehr wichtig, wenn man sich ein Medium mit vielen Anderen teilen will +* Hauptkategorien: Collision, Collision Free und limited contention +* Maßzahlen zur Beurteilung: Durchsatz, Verzögerung und Fairness +* Wichtige Fallstudie: Ethernet - Lehre: Halte es einfach! + +--- +# Kapitel 6 Internetworking +## LAN Verbindungen +* Klassisches Ethernet - Ein Kabel eine Kollisionsdomäne +* Funktioniert für einige Geräte, kollabiert ab gewisser Größe, CSMA-CD kann ebenfalls nicht mehr mithalten + +### Gründe für mehrere LANs +* Beschränkte Anzahl an Nutzern in einem einzelnen Netz +* Geographische Verteilung - würde zu ungeheuren Round Trip Zeiten führen +* Zuverlässigkeit - Defekte Sender würden ständig zwischenfunken +* Sicherheit - Promiscous Operation - Begrenzung möglichen Schadens + +### Möglichkeiten des Überwindens der Begrenzungen +* Application Layer <-> Application Gateway +* Transport Layer <-> Transport Gateway +* Network Layer <-> Router +* Data Link Layer <-> Bridge, Switch +* Physical Layer <-> Repeater, Hub + +## Physical Layer Verbindungen +### Repeater +* Physical Layer Gerät, verbindet zwei Kabel und verstärkt die ankommenden Signale und leitet dieses weiter +* Versteht den Inhalt der Pakete nicht und interessiert sich nicht dafür + +### Hub +* Physical Layer Gerät, verbindet mehrere Kabel elektrisch +* Alle verbundenen Kabel formen eine Kollisionsdomäne +* Versteht den Inhalt der Pakete nicht und interessiert sich nicht dafür + +-> Lösungen nicht zufriedenstellend: Lösen die wirklich interessanten Probleme nicht + +## Data Link Layer +### Switch +* Verbindet mehrere Terminals, ohne eine Kollisionsdomäne zu erzeugen +* Speichert Link-Layer-Frames und leitet diese weiter +* Wenn ein Paket auf ein Segment geleitet werden muss, wird CSMA-CD zum Zugriff verwendet +* Inspiziert Adressen ankommender Pakete und leitet diese weiter (benötigt Puffer und Wissen, wo welches Terminal steht) + +Weiterleitung: Wie weiß man, wo was hingeleitet werden muss? -> Routingproblem + +#### Pfaderkennung - Selbstlernen +* Jeder Switch hat eine Switchtabelle +* Eintrag: (MAC-Adresse, Interface, Zeitstempel) +* Beim Empfang eines Frames lernt der Switch den Ort des Senders kennen (Rückwärtslernen) + +#### Weiterleiten +* Falls Ziel bekannt so prüfe, ob + * es in das selbe Segment gehört aus dem es kommt -> verwerfen + * sonst leite es passend weiter +* andernfalls flute das Netzwerk damit + +### Bridges +* Switches sind beschränkt, da sie nur einfache Terminals verbinden +* Jedes mit einer Bridge verbundene Netzwerk ist eine eigene Kollisionsdomäne, und auch verschiedene LAN-Typen können miteinander verbunden werden + +#### Rückwärtslernen in Bridges - Bootstrapping +* Algorithmus + * Flute, falls nicht bekannt wohin gesendet werden muss, oder + * verwerfe, wenn bekannt, dass es nicht nötig ist, oder + * leite spezifisch weiter, wenn das Ziel bekannt ist + +Probleme: Durch Fluten können Paketloops entstehen +##### Lösung 1: Einschränken des Flutens +* Verhindern des unendlichen loopens indem gespeichert wird, was schon weitergeleitet wurde +* Dies benötigt Zustände und Einzigartigkeit und Pakete müssen unterscheidbar sein +* Großer Overhead + * Zustände sind problematisch, da das Durchsuchen Zeit kostet + +##### Lösung 2: Spanning Trees +* Wandle das Netzwerk ein einen zyklenfreien Graph und berechne darauf den Spannbaum + > Definition Spannbaum:\ + > Gegeben sei ein Graph G=(V,E), ein Spannbaum T = (V,E-T) ist ein Subgrap von V, wobei E-T ein Teil von E ist, welcher ein Spannbaum, der verbunden und azyklisch ist. + +### Higher-Layer Verbindungen +#### Router +* Bisher haben alle Geräte Adressen entweder ignoriert, oder arbeiteten mit MAC-Layer Adressen +* Für Verbindungen außerhalb eines LANs sind solche Adressen nicht ausreichend + * Hauptproblem: flache Adressstruktur, nicht skalierbar +* Benötigen ausgefeiltere Adressstruktur + +#### Gateways +* Wenn selbst Router nicht ausreichend, dann sind Higher-Layer-Verbindungen notwendig + * Arbeit auf dem Transportlevel und oberhalb, zum Beispiel für Transcodierung + +### Weitere Probleme mit LAN/LAN Verbindungen +* LAN meist lokal eingesetzt, aber logische Distanz sollte auch berücksichtigt werden +* Idee: Platziere in das physische LAN ein virtuelles LAN (VLAN) +* Konfigurationstabellen bezüglich VLAN Zugehörigkeit benötigt + +## Zusammenfassung Kapitel 6 +* einzelne LANs sind nicht ausreihend um Kommunikationswege für größere Installationen bereitzustellen +* Verbindung einzelner LANs nötig + * Physisches Layer - Repeater und Hub + * Data-Link-Layer - Bridges und Switches + * Netzwerklayer - Routing + * Higher-Layer - Gateways +* Probleme: + * redundante Bridges ermöglichen Trafficfluten, benötigen Spannbaumalgorithmen + * Einfache Adressen nicht skalierbar -> benötigen Router + +--- +# Kapitel 7: Netzwerklayer +## Bauen großer Netzwerke +* Internetworkingmechanismen helfen Paketen an ihr Ziel zu gelangen + * Hubs: Broadcast + * Switch: Sende an direkt verbundenes Netzwerk + * Bridges: Fluten (verursacht Probleme) +* Fluten ist keine gute Idee für große Netzwerke -> Spannbäume sind aber schonmal gut + +## Netzwerklayerfunktionen +* Weiterleiten: Bewege Pakete vom Routereingang auf den entsprechenden Ausgang +* Routing: Berechnen der Route, die die Pakete von Quelle bis zum Ziel gegangen sind + +### Weiterleitung +* Wie bekomme ich Pakete von einem Netzwerk ins Andere? -> Verwende Switches/Bridges/Router +* Tatsächliche Routingtabellen enthalten IP-Adressen, Flags, Netzmasken, etc. + +### Durchsuchen der Routingtabelle +* Suche nach übereinstimmender Hostadresse (Flag H gesetzt) +* Suche dann nach passender Netzwerkadresse +* Drittens, Suche nach einem Defaulteintrag + * Führe netstat -rn auf der Maschine aus und finde die Einträge der Routingtabelle + * Erlaubt es uns einen einzelnen Eintra für eine Liste an Einträgen zu haben, welche alle den selben next-hop Wert haben +* Frage: Wie kommt man nun auf die in der Routingtabelle gespeicherten Informationen? + +## Zusammenspiel zwischen Routing und Weiterleitung +### Verbindungsaufbau +* Dritte wichtige Komponente in manchen Netzwerkarchitekturen + * ATM, Frame Relay, X.25 +* Bevor Datagramme fließen, werden zwei Hosts und Router eine virtuelle Verbindung aufbauen +* Netzwerk und Transportlayer Verbindungsdienste: + * Netzwerk: Zwischen zwei Hosts + * Transport: Zwischen zwei Prozessen +* Im Internet gibt es keinen Verbindungsaufbau auf dem Netzwerklayer + +### Netzwerkservicemodell +Frage: Welches Servicemodell für die Übertragung von Datagrammen vom Sender an den Empfänger verwenden? +* Dienste für individuelle Datagramme: + * Garantierte Zustellung mit weniger als 40msec Verzögerung +* Dienste für einen Datagrammstrom: + * Zustellung in Sendereihenfolge + * Garantierte Mindestbandbreite + * Begrenzungen bei den Abständen von Paketen + +### Virtuelle Schaltkreisbasierte vs. Datagrammorientierte Netzwerke +### Verbindungslose und Verbindungsbasierende Dienste auf dem Netzwerklayer +* Datagrammnetzwerke = verbindungsloser Netzwerklayerdienst +* VC Netzwerke = verbindungsbasierter Netzwerklayerdienst + +### Virtuelle Schaltkreise +* Rufaufbau bevor überhaupt etwas übertragen werden kann + Rufabbau danach +* Jedes Paket überträgt einen VC-Identifier +* Jeder Router auf dem Weg behält einen Zustand für jede Verbindung vor und es können Link und Routerressourcen an einzelne Verbindungen zugeteilt werden + +### Implementierung virtueller Schaltkreise +* Besteht aus einem Pfad von der Quelle zum Ziel, sowie +* VC-Nummern, für jeden Link auf dem Pfad +* und Einträgen in Weiterleitungstabellen in Routern auf dem Weg +* Pakete welche zum VC gehören tragen eine VC-Nummer +* VC-Nummern müssen auf jedem Link geändert werden (neue kommen von Weiterleitungstabellen) + +### Weiterleitungstabellen +* Aufbau: Incoming Interface, Incoming VC, Outgoing Interface, Outgoing VC + +### VC Signalprotokolle +* Verwendet zum Aufbau und zur Terminierung von VCs, heutzutage nicht mehr verwendet + +### Datagrammnetzwerke +* Kein Verbindungsaufbau auf dem Netzwerklayer +* Router halten keine Zustände für Ende-zu-Ende Verbindungen +* Pakete werden anhand ihrer Zielhostadresse weitergeleitet (-> verschiedene Pfade für selbes Ziel) + +### Longest Prefix Matching +* Wähle diejenige Adresse aus der Tabelle, welche die größte Anzahl führender Adressbits mit der gegebenen gemein hat + +### Datagramm vs. VC-Netzwerk +* Internet + * Datenaustausch zwischen Computern + * "intelligente" Endsysteme, können z.B. Fehlerkontrolle und Fehlerkorrektur implementieren + * Viele verschiedene Linktypen, d.h einheitlicher Dienst nahezu ausgeschlossen +* ATM + * Geht aus der Telefonie hervor + * Konzept menschlicher Kommunikation: + * Striktes Timing, Zuverlässigeit benötigt + * "Dumme" Endsysteme, d.h. Komplexität liegt innerhalb des Netzwerkes + +## Wie ist ein Router eigentlich aufgebaut? +* Zwei Hauptfunktionalitäten: + * Ausführen von Routingalgorithmen und Protokollen + * Weiterleiten von Datagrammen von eingehenden auf ausgehende Links + +### Eingangsportfunktionen +Dezentralisiertes Switching: +* Gegebenes Datagrammziel, finde passenden Ausgangsport durch Benutzung von Weiterleitungstabellen +* Queuing, falls Pakete schnelller ankommen als man sie weiterleiten kann + +### Switching Fabric +1. Switching mittels Speicher + * Herkömmliche Rechner mit Switching unter direkter CPU-Kontrolle + * Kopieren der Pakete in den Systemspeicher + * Geschwindigekeit limitiert durch die Speicherbandbreite +2. Switching mittels BUS + * Übertragung von Datagrammen intern über einen Bus + * Switchinggeschwindikeit limitiert durch die Busbandbreite + * typ. 1Gbps Bus, ausreichend für Heim und Businessrouter +3. Switching mittels Verbindungsnetzwerk (Crossbar) + * Überwinden der Bandbreitenbeschränkungen von Busen + * Design: Fragmentierung von Datagrammen in Zellen fester Größe, wobei nun die Zellen durch das Fabric geswitcht werden + * Bis zu 1.28 Tbps Switchinggeschwindigkeit + +### Ausgangsports +* Pufferung nötig, sobald Pakete vom Fabric schneller ankommen, als die Ausgangsrate ist +* Schedulingdisziplin wählt aus den zu übertragenden Datagrammen + +### Ausgangsportwarteschlangen +* Probleme: Verzögerung und Verluste durch Pufferüberläufe möglich + +### Eingangsportwarteschlangen +* Fabric langsamer als Kombination von Eingangsports -> Schlangenbildung +* Head-of-the-Line (HOL) blocking: Datagramme am Anfang der Warteschlange hindert andere in der Warteschlange daran weiter zu kommen +* Probleme: Warteschlangenverzögerung und Verluste durch Pufferüberläufe + +## IP - Datagrammformat und Paketverarbeitung +### IP Paketformat +* Version: Versionsnummer des eingesetzten IP +* IHL: IP Header Length in 32 Bit Worten +* Typ des Dienstes: Infos zur Priorisierung +* Totale Länge: Die gesamtlänge in Bytes inklusive Header +* Identifier: Wenn Fragmentierung auftritt, bekommt jedes zugehörige Paket den selben Identifier +* Flags: + * DF: don't fragment + * MF: more fragments, alle außer das letzte Paket haben dies gesetzt +* Fragment Offset: Position des Fragments im ursprünglichen Paket +* TTL: Zähler für die Hopanzahl, wird an jedem Router dekrementiert, sobald gleich 0 -> verwerfen +* Protokoll: Spezifiziert verwendetes Protokoll +* Headerchecksum: Erlaubt Verifizierung der Inhalte im IP Header +* Quell und Zieladressen: identifizieren der Quelle und des Ziels +* Optionen: bis 40 Byte, zur Erweiterung verwendet + +### IP Fragmentierung und Reassemblierung +* Netzwerklinks haben eine MTU (größter Linklevelframe) -> verschiedene Linktypen, verschiedene MTUs +* Große IP Datagramme werden innerhalb des Netzes unterteilt + * Aus einem Datagramm werden mehrere, die erst beim Zielsystem wieder zusammengesetzt werden + * IP Header Identifizieren und Ordnen die neuen Pakete + +### IP Adressierung +#### Scheitern von einfachen Adressierungsmethoden +* Bei MAC/LLC: Jedes Gerät mit globaler einzigartiger Adresse -> Probleme: Jede Bridge mit extra Eintrag für jedes Gerät -> massiver Speicher- und CPU-Overhead + +#### Adressierung und hierarchisches Routing +* Benötigen eine Adressstruktur welche hierarchische Routingstrukturen respektiert und ausdrückt + +#### Nähe +* Achtung: + * Proximity: Beschreibt physische Nähe + * Closeness: Beschreibt strukturelle und logische Nähe mit kurzer Distanz + +#### internetnamen und Adressen +#### Klassen von IP-Adressen +* Class A: sehr große Organisationen, bis 16 Millionen Hosts +* Class B: große Organisationen, bis 65 Tausend Hosts +* Class C: kleine Organisationen, bis 255 Hosts +* Class D: Multicast, keine Netzwerk/Host Hierarchie +* Class E: reserviert +* Loopback: 127.xxx.xxx.xxx ist zum Testen reserviert, hierauf versendete Pakete werden als eingehende behandelt +* Broadcast: alles 1en +* Adresshierarchie: + * Jede Adresse mit Hostteil und Netzwerkteil + * Class A,B,C unterstützen nur zwei Level der Hierarchie + * Aber weitere Strukturierung des Hostteils in Subnetze möglich + +### IP-Adressierung +* IP Adresse: 32 Bit Identifier für Hosts oder Routinginterfaces +* Interface: Verbindung zwischen Host und dem physischen Link + * IP Adressen werden an das jeweilige Interface vergeben + +#### Subnets +* IP Adresse: + * Subnetteil + * Hostteil +* Was ist ein Subnet? + * Geräteinterfaces mit selbem Subnetteil in der IP Adresse können untereinander ohne Router kommunizieren +* Um die Subnetze herauszufinden entferne jedes Interface von dessen Host oder Router. Somit erschaffte Inseln sind isolierte Netze, also Subnetze + +#### IP Adressen +* Classfull-Adressierung: + * Ineffiziente Nutzung von Adressräumen + * Bsp: Class B Netz allokiert Adressen für 65k Hosts, selbst wenn nur 2k Adressen benötigt +* CIDR - Classless Inter Domain Routing: + * Netzwerkportion von Adressen beliebiger Länge + * Adressformat a.b.c.d/x, wobei x die Anzahl an Bits in der Netzwerkportion der Adresse darstellt + +#### CIDR: Classless Inter Domain Routing +* Überwinden der Klassengrenzen durch Supernetting +* ISPs können nun Class C Blocks zu einem großen Block zusammenfassen +* "Longest match routing" auf maskierten Adressen +* Beispiel: Alle in Europa vergebenen Adressen teilen sich einen gemeinsamen Prefix -> Nur ein Eintrag für alle Verbindungen nach Europa in den meisten amerikanischen Routern + +#### Wie bekommt man eigentlich eine IP-Adresse? +* Hart eincodiert in einer Konfigdatei +* DHCP: Dynamic Host Configuration Protocol: beziehe die Adresse dynamisch von einem Server + +#### Wie kommt das Netzwerk eigentlich an seinen Subnetpart von IP-Adressen? +* Der Provider stellt eine allokierte Portion des Addressraums des ISPs bereit + +### IP Adressierung: Allokation von Adressen +Woher bekommt ein ISP einen Adressblock?\ +-> ICANN: Internet Corporation for Assigned Names and Numbers +* Allokiert Adressen +* Verwaltet DNS +* Weist Domainnamen zu und löst Konflikte + +#### NAT - Network Address Translation +* Motivation: Knappheit an IP-Adressen +* Idee: + * Lokale Netzwerke haben nur eine der Außenwelt bekannte IP-Adresse, somit hat nicht jedes Gerät eine vom ISP bereitgestellte Adresse +* Vorteile: + * Möglichkeit intern Adressen zu vergeben ohne die Außenwelt informieren zu müssen + * Wechsel des ISPs möglich, ohne intern Adressen zu verändern + * Geräte im Netzwerk nicht von außen ansprechbar (Sicherheitsfaktor) +* 16 Bit Portnummernfeld -> 60 000 simultane Verbindung mit nur einer einzigen LAN-Side Adresse +* NAT ist allerdings kontrovers diskutiert: + * Router sollten nur bis Layer 3 verarbeiten + * Verletzt das Ende-zu-Ende Prinzip + * Adressmangel sollte durch IPv6 gelöst werden + +#### Schließen der letzten Lücke: ARP +* Was passiert, wenn ein Paket bei seinem Zielnetzwerk ankommt? + * Wie wandelt man eine IP-Adresse in eine MAC-Adresse, welche dem zugehörigen Gerät gehört? +* Einfachste Lösung: Schreie! + * Broadcast auf das LAN, mit der Frage, welcher Node IP X.X.X.X hat + * -> Antwort des Nodes mit der MAC-Adresse -> Zustellung möglich +* ARP - Adress Resolution Protocol + +##### ARP Protokoll im gleichen LAN +* A möchte B ein Datagramm senden, aber Bs MAC ist nicht in As ARP Tabelle +* A broadcastet ein ARP-Anfrage-Paket, welches Bs IP-Adresse enthält + * Ziel-MAC = FF-FF-FF-FF-FF-FF + * Alle Maschinen im LAN erhalten die Anfrage +* B erhält das ARP-Paket, und antwortet A mit seiner MAC +* A speichert das IP to MAC Adresspaar in seiner ARP Tabelle bis die Information veraltet ist +* ARP ist eine Plug-and-Play Technologie (Nodes erstellen ihre Tabellen selbstständig) + +##### Routing in ein anderes LAN +* A erstellt Datagramm mit Quelle A und Ziel B +* A verwendet ARP um Rs MAC-Adresse für die IP hier 111.111.111.110 zu erhalten +* A erstellt Link-Layer-Frame mit Rs Macadresse als Ziel, Inhalt: A zu B Datagramm +* As Adapter sendet den Frame, Rs Adapter erhält diesen +* R entfernt das IP-Datagramm vom Ethernetframe und sendet es ans Ziel B +* R verwendet ARP um Bs Adresse zu erhalten +* R erstellt einen Frame, welcher das A zu B Datagramm enthält, und sendet diesen zu B + +## ICMP und IPv6 +### ICMP: Internet Control Message Protocol +* Verwendet von Hosts und Routern um auf Netzwerkebene Informationen auszutauschen + * Fehlermeldungen oder Echo-Anfragen +* In Netzwerkebenen oberhalb von IP werden ICMP Nachrichten als IP Datagramme versendet +* ICMP Nachrichten: Typ, Code + erste 8 Bytes des den Fehler auslösenden IP-Datagramms + +#### Traceroute und ICMP +* Quelle sendet Serie von UDP Nachrichten ans Ziel, jeweils immer mit TTL+1 +* Wenn das n-te Datagramm am n-ten Router ankommt, so verwirft er dieses, sendet aber eine ICMP Nachricht (Typ 11, Code 0) an die Quelle, welche Namen und IP des Routers enthält +* Zurück an der Quelle wird die RoundTripTime errechnet, traceroute macht dies drei mal +* Stoppkriterien: + * UDP Segment erreicht das Ziel + * Ziel gibt ein "host unreachable" zurück (Typ 3, Code 3) + +## IPv6 +* Motivation: + * 32 Bit Adressraum bald ausgeschöpft + * Headerformat hilft bei schneller Verarbeitung und Weiterleitung + * Header nun als Hillfmittel für QoS +* IPv6 Datagrammformat + * Header mit 40 Byte Größe (also 20 Byte mehr als bei IPv4) + * Fragmentierung ist nicht mehr erlaubt + +### IPv6 Header +* Priority: Signalisiert die Priotität der Datagramme im Fluss +* Flow Label: Identifiziert Datagramme im selben Fluss +* Next Header: Identifiziert das Layer der höheren Schicht für Daten + +### Weitere Veränderungen zu IPv4 +* Checksummen -> komplett entfernt +* Optionen -> Erlaubt, aber außerhalb des Headers +* ICMPv6 -> Zusätzliche Nachrichtentypen + Multicastgruppenmanagementfunktionen + +### Übergang von IPv4 zu IPv6 +* Nicht alle Router können gleichzeitig aktualisiert werden -> Frage: Wie kann das Netzwerk mit einer Mischung aus beiden Versionen zurechtkommen? +* Lösung: Tunneln: + * IPv6 wird als Nutzlast in IPv4 Datagrammen mitgeschickt + * Rückschläge -> Zusätzlicher IPv4 Header + * Verarbeitungsoverhead an den Tunnelendpunkten + * Keine Priorisierung möglich + +## Routing Algorithmen +### Überblick über Routingalgorithmen +* Ein Router führt einen Routingalgorithmus aus, um zu entscheiden, an welchem Ausgang ein eingehendes Paket weiter übertragen werden sollte. + * Verbindungsorientiert: nur beim Verbindungsaufbau + * Verbindungslos: entweder für jedes Paket oder periodisch ausgeführt +* Oftmals unter Verwendung von Metriken + * Zuweisung eines Kostenfaktors an jeden Link, bspw. Anzahl an Hops, Kosten in € eines Links,… +* Zwei grundlegende Typen existieren: + * Nichtadaptive Routingalgorithmen: Nehmen keine Rücksicht auf aktuellen Netzwerkzustand (z.B. Fluten) + * Adaptive Routingalgorithmen: Berücksichtigen aktuellen Netzwerkzustand (z.B. Distanzvekotrrouting, Link State Routing) + +### Fluten +* Strategie: jedes eingehende Paket wird auf jede ausgehende Linie geschickt, außer auf die Herkunftslinie +* Reduzierung der Nummer an Duplikaten: + * Hopzähler im Paketheader, sodass das Paket nach gewisser Anzahl an Hops verworfen wird + * Füge im ersten Router Sequenznummern in jedes Paket ein, welches vom Host empfangen wird. Jeder Router beinhaltet eine Tabelle, welche Sequenznummern er vom first-hop Router bekommen hat, daraufhin verwirft er alle Pakete, welche er bereits gesehen hat. + +#### Mögliche Anwendungsfelder fürs Fluten +* Militärische Anwendungen: + * Ziel soll immer erreicht werden können +* Updaten von verteilten Datenbanken +* Netzwerke mit häufigen Topologiewechseln + +### Zufallsrouting +* Jedes ankommende Paket wird auf einen zufälligen Ausgang geschickt, außer auf den Quellausgang -> es bahnt sich seinen Weg sozusagen durch den Router + +### Adaptive Routingalgorithmen +* Probleme nichtadaptiver Algorithmen: + * Keine Anpassungsmöglichkeit auf stark schwankendes Verkehrsaufkommen + * Kein ausreichend guter Umgang mit berstendem Verkehr +* Drei Grundtypen + * Zentralisiertes adaptives Routing + * Isoliertes adaptives Routing - benötigt keinen Informationsaustausch zwischen Routern + * Verteiltes adaptives Routing - Router tauschen periodisch Infos aus und aktualisieren Weiterleitungstabellen + +#### Zentralisiertes adaptives Routing +* Strategie: + * Anpassen an die vorherrschende Verkehrslast + * Ein Routingkontrollcenter muss ins Netzwerk eingebaut sein, welches periodisch den Linkstatus der Router erhält und kürzeste Routen berechnet und diese an die Router sendet +* Probleme: + * Ausfall des Controllers sorgt für nichtadaptives Routing + * Skaliert nicht + +#### Isoliertes adaptives Routing +* Idee: + * Routingentscheidungen werden nur anhand der Informationen des lokalen Routers getroffen, wie bei Hotpotato oder Rückwärtslernen +* Hot Potato Routing + * Wenn ein Paket ankommt, so leite es auf schnellste Art und Weise an den Ausgang mit der kleinsten Ausgangswarteschlange, ganz egal wohin dieser Ausgang dann führt + +##### Rückwärtslernen +* Idee: + * Paketheader enthalten wichtige Infos, wie Quelle, Ziel, Hopzähler -> Netzwerkknoten lernen etwas über die Netzwerktopologie während sie Pakete behandeln +* Algorithmus: + * Routing ursprünglich zufällig + * Pakete mit Hopzähler 1 stammt von direkt verbundenem Knoten, usw… + * Bei Ankunft eines Pakets vergleicht der IMP die Hopzahl für eine gegebene Quelladresse und aktualisiert diese falls nötig + * Wichtig: Periodisches Vergessen der Routen ist wichtig, um sich weiterhin anpassen zu können + +#### Verteiltes adaptives Routing +* Ziel: Finde einen guten Pfad durch das Netzwerk, welcher einen von der Quelle zum Ziel führt +* Graphabstraktion für Routingalgorithmen + * Graphknoten sind Router + * Graphkanten sind physische Links + * Linkkosten: Verzögerung, € Kosten oder das Staulevel + * Pfadkosten: Summe der Linkkosten auf einem Weg + +#### Klassifikation von Algorithmen für dezentralisiertes adaptives Routing +Globale vs. dezentralisierte Information? +* Dezentralisiert + * Router kennen physisch verbundene Nachbarn und Linkkosten zu diesen + * Iterativer Prozess zum Berechnen und Austausch von Informationen mit Nachbarn + * Distanzvektoralgorithmen: + * RIP - Routing Information Protocol + * BGP - Border Gateway Protocol +* Global + * Alle Router haben vollständige Topologie- und Linkkosteninformationen +* Link State Algorithmen + * Dijkstra + * OSPF - Open Shortes Paths First + +Statisch oder dynamisch? +* Statisch + * Router wechseln langsam über die Zeit hinweg +* Dynamisch + * Router wechseln häufiger + * Periodisches Updaten als Antwort auf Linkkostenwechsel + + +### Distanzvektorrouting Algorithmen +* Iterativ + * Läuft bis keine Knoten mehr Informationen austauschen + * Selbstterminierend -> kein Stoppsignal +* Asynchron + * Knoten müssen Informationen nicht getaktet austauschen +* Verteilt + * Jeder Knoten kommuniziert nur mit seinem direkten Nachbarn +* Distanztabellendatenstruktur + * Jeder Knoten hat seine eigene + * Spalte für jedes mögliche Ziel + * Zeile für jeden direkt angeschlossenen Nachbarknoten + * Beispiel: in Knoten X, für Ziel Y über Nachbar Z: + +> D^X(Y,Z) = Distanz von X nach Y mit Z als nächsten Hop + +#### Distanzvektorrouting - Übersicht +* Iterativ, asynchron: + * Jede lokale Änderung wird verursacht durch: + * lokale Änderung der Linkkosten + * Nachricht vom Nachbarn also dessen Änderung des kleinsten Knotenpfads +* Verteilt: + * Jeder Knoten benachrichtigt die Nachbarn nur dann wenn sich dessen Pfad mit den kleinsten Kosten geändert hat + +#### Distanzvektoralgorithmus - Quelltext +``` +//Initialisierung: +//für alle adjazenten Knoten v: +D^X(*,v) = infinity +D^X(v,v) = c(X,v) +//für alle Ziele y +sende min-w D^X(y,w) an jeden Nachbarn +loop +wait (bis eine Veränderung der Linkkosten auffallen oder man benachrichtigt wird) +if(c(V,X) verändert) + // verändere die Kosten zu allen Zielen durch den Nachbarn v durch d + // d kann auch negativ sein + für alle Ziele y: D^X(y,V) = D^X(y,V)+d +else if(Empfang eines Updates von V w.r.t Ziel Y) + // der kürzeste Pfad von Y zu einem Y hat sich verändert + // V hat einen neuen Wert für sein min-w D^V(Y,w) + // rufe diesen neuen Wert newval ab + für dieses einzelne Ziel y: D^X(y,V) = c(X,V)+newval +if (neues min-w D^X(Y,w) für irgendein Ziel Y, so senden wir den neuen Wert an alle Nachbarn) +forever +``` + +#### Distanzvektor: Reaktion auf Veränderung der Linkkosten +* Der Knoten erkennt die Veränderung von lokalen Linkkosten +* Die Distanztabelle wird geupdated +* Wenn Kosten im kleinsten Kostenpfad verändert werden, so werden die Nachbarn benachrichtigt +* Gute Nachrichten verbreiten sich schnell, schlechte Nachrichten verbreiten sich nur langsam + +#### Poisoned Reverse +* Wenn Z durch Y routet um zu X zu gelangen: + * Z sagt Y, dass seine eigene Distanz zu X unendlich ist (somit routet Y nicht über X nach Z) + * Löst dies das gesamte Problems des Zählens bis in die Unendlichkeit? + +### Link State Routing +* Linkstaterouting verwendet typischerweise Dijkstras Algorithmus + * Netzwerktopologie und Linkkosten sind allen Knoten bekannt: + * erzielt durch den Link-State-Broadcast + * Alle Knoten mit selber Information +* Ziel: Berechnung des kleinsten Kostenpfades von einem Knoten S zu allen andern Knoten V: + * Kann verwendet werden um eine Routingtabelle für dieses s zu erstellen + +#### Dijkstrasalgorithmus zur Berechnung kürzester Pfade +* Grundlegende Idee: + * Menge N mit Quellknoten S, füge nach und nach die zu dem Zeitpunkt bekannten mit kürzesten Pfaden erreichbaren Knoten ein + * Initial werden alle Pfade zu anderen Knoten als S auf unendlich gesetzt + * In jedem Schritt: + * Wähle Knoten V, welcher nicht in N ist, und von S aus nur mit Pfaden über bereits entdeckte Knoten erreicht werden kann + * Füge V in N ein + * Aktualisiere die geschätzten Kosten für alle direkten Nachbarn w von v, falls ein Pfad über v billiger wäre als die bisherige Schätzung + * Wenn eine Schätzung für einen Knoten w angepasst wird, so speichere auch den Vorgängerknoten V, welcher zu dieser Schätzung führt +* Somit speichert der Algorithmus für jeden Knoten v: + * Einen Schätzwert für den kürzesten Pfad + * Den Vorgängerknoten p(v) vom bis dahin als kürzesten Pfad angenommenen Pfad von s zu v + * Eine Listen von Knoten N für welche die kürzesten Pfade definitiv bekannt sind +* Aktualisierungsverfahren für die Schätzwerte + * Angenommen der Knoten v ist neu in die Liste hinzugefügt worden und wir aktualisieren den Schätzwert für den Knoten w: + * d(v) ist der Schätzwert für den kürzesten Pfad von v, d(w) ist der Schätzwert für w + * c(v,w) sind die Kosten der Kante von v zu w + +```cpp +if( d(v) + c(v,w) < d(w)){ + d(w) = d(v) + c(v,w); + p(w) = v; +} +``` + +* Intuition hinter dieser Prozedur + * Nimm an, dass d(w) und d(v) endlich sind + * Es existiert also ein Pfad (s,v1,v2,…,v) von s zu v mit gewicht d(v) + * Folglich existiert ein Pfad (s,v1,v2,…,v,w) von s zu w mit dem Gewicht d(v) + c(v,w) + * Also gibt es einen weiteren Pfad mit Gewicht d(w) + * somit kann der kürzeste Pfad zu w nicht mehr Gewicht haben, also entweder d(w) oder d(v)+c(v,w). + +#### Weiterführende Diskussion zu Dijkstras Algorithmus +* Algorithmenkomplexität für |V| Knoten: + * Jedes mal Überprüfung aller Knoten die nicht in N sind + * Benötigt O(V²) Vergleiche, dies ist optimal in dicht besiedelten Graphen + * Für dünnbesiedelte Graphen gibt es schnellere Varianten +* Variable Linkkosten -> Oszillation möglich + +#### Link State Routing mit Dijkstras Algorithmus +* Jeder Router misst diie Kosten zwischen sich selbst und benachbarten Routern +* Der Router baut ein Paket, welches all diese Daten enthält +* Verteilung dieser Pakete durch Fluten mit Sequenznummern und einem Altersfeld, sodass bereits gesehene Pakete oder veraltete verworfen werden können +* Sobald ein Router alle Linkstatepakete erhalten hat, kann er die gesamte Topologie rekonstruieren und einen kürzesten Pfad zwischen sich und allen anderen Knoten berechnen + +#### Vergleich zwischen Link-State und Distanzvektoralgorithmen +* Nachrichtenkomplexität: + * LS: mit N Knoten und E Links werden O(n-e) Nachrichten versandt + * DV: Austausch nur zwischen Nachbarn +* Konvergenzgeschwindigkeit + * LS: O(n²) Algorithmus benötigt O(N-E) Nachrichten (teils mit Oszillation) + * DV: Konvergenzzeit variiert + * Routingschleifen, Count to Infinity Problem, Oszillation +* Robustheit: (im Falle eines Routerausfalls) + * LS: + * Ein Knoten kann falsche Linkkosten ausgeben + * Jeder Knoten berechnet nur seine eigene Tabelle + * DV: + * DV Knoten kann falsche Gewichte ausgeben + * Jede Tabelle wird nun noch von anderen Routern verwendet -> Fehler breiten sich über das ganze Netzwerk aus + +### Hierarchisches Routing +Warum benötigen wir hierarchisches Routing? +* Skalierbarkeit -> 50+ Millionen Ziele in Routingtabellen ist sinnlos +* Autonomität -> Internet = Netz von Netzen, aber ein Admin möchte eventuell ja den Traffic im eigenen Netzwerk kontrollieren + +#### Autonome Systeme +* Aggregation von Routern in Regionen -> Autonome Systeme AS +* Router im selben AS verwenden das selbe Routingprotokoll + * Intra-AS Routingprotokoll + +> Gateway Router:\ +> * Spezielle Router innerhalb des AS, führen das Intra-AS Routingprotokoll mit allen anderen Routern im AS aus +> * Zusätzlich verantwortlich für das Routing an exteren Ziele -> Inter-AS Routingprotokolle mit anderen Gatewayroutern + +#### Routing im Internet +* Das globale Internet besteht aus miteinander verbundenen AS + * Stub AS: kleine Unternehmen (ein Link zum Internet) + * Multihomed AS: große Unternehmen (mehrere Links, ohne Transitverkehr) + * Transit AS: Netzbetreiber +* Zwei Level Routing: + * Intra-AS: Administrator verantwortlich für die Auswahl + * RIP: Distanzvektor + * OSPF: Link State + * IGRP: Distanzvektor + * Inter-AS: Einheitlicher Standard + * BGP: Pfadvektor + +#### Verschiedenes Intra-AS und Inter-AS Routing, aber warum? +* Policy: + * Inter AS: Admin möchte Kontrolle über sein Netz haben + * Intra AS: ein einziger Admin, also keine Policyentscheidungen nötig +* Skalierbarkeit: + * Hierarchisches Routing spart Tabellenplatz und sorgt für weniger Updateverkehr +* Performance: + * Inter-AS: Policy wichtiger als Performance + * Intra-AS: Performance als oberstes Gut + +#### Verbundene autonome Systeme +* Forwardingtabelle sowohl durch intra- als auch inter-AS Routingalgorithmen konfiguriert + * Intra-AS setzt Einträge für interne Ziele + * Inter-As und Intra-AS setzt Einträge für externe Ziele + +#### Inter-AS Aufgaben +* Problem + * AS1 erhält Datagramm für ein Ziel außerhalb von AS1, Weiterleitung durch Gateway Router, aber welchen? +* AS1 muss lernen welche Ziele über AS2 und AS3 erreichbar sind und diese Info an alle Router in AS1 weitergeben +* -> Job des Inter-AS Routing + +##### Beispiel: Setzen der Weiterleitungstabelle in Router 1d +* Angenommen AS1 lernt vom Inter-AS Protokoll, dass das Subnetz x durch AS3 (Gateway 1c) erreichbar ist, aber nicht von AS2 +* Verteilung der Info an alle internen Router +* Router 1d bestimmt über die Intra-AS Routinginformation, dass sein Interface l auf dem Pfad mit den geringsten Kosten zu 1c ist +* Der Router setzt nun einen Eintrag in die Weiterleitungstabelle (x,l) + +##### Beispiel: Wählen aus mehreren ASen +* Angenommen AS1, lernt durch das inter-AS Protokoll, dass es Subnetz x über AS2 und AS3 erreichen kann +* Um die Weiterleitungstabelle zu Konfigurieren muss Router 1d herausfinden, zu welchem Gateway es die Pakete für Subnetz x weiterleiten sollte -> Ebenfalls Job des Inter-AS Protokolls +* Hot-Potato-Routing: Sende das Paket an den nächsten von zwei Routern, werde das Paket also so schnell wie möglich wieder los + +### Routing im Internet +#### Intra-AS Routing (IGP) +* Typische Routingprotokolle: RIP, OSPF, IGRP + +#### RIP - Routing Information Protokoll +* Distanzvektoralgorithmus mit #Hops als Metrik + +#### RIP - Advertisements +* Distanzvektoren: + * Austausch zwischen Nachbarn alle 30s via Responsenachrichten + * Auch Advertisements genannt +* Jedes Advertisement + * Liste an bis zu 25 Zielnetzwerken im AS + +#### RIP - Linkausfall und Linkrecovery +Falls nach 180s kein Advertisement empfangen wurde, so deklariere den Nachbarn als tot +* Routen werden invalid -> Nachbarn werden informiert und verbreiten die Informationen +* Verwenden poisoned reverse um ping-pong-loops zu verhindern (undendliche Distanz = 16 Hops) + +#### RIP - Tabellenverarbeitung +* RIP Routingtabellen werden durch einen Prozess (route-d) auf Anwendungsebene gemanagt +* Advertisements werden periodisch in UDP Paketen verschickt + +### OSPF - Open Shortest Path First +* Open = Öffentlich verfügbar +* Beruht auf dem Link-State-Algorithmus + * LS Paketfluten + * Topologiekarte an jedem Knoten verfügbar + * Routenberechnung mit Dijkstra +* OSPF Advertisements annocieren nun keine Wege sondern Linkzustände mit je einem Eintrag pro Nachbarknoten + * Fluten der Advertisements, welche direkt in IP Pakete eingebettet sind, in das gesamte Netzwerk + +#### Weiterführende Funktionen +* Sicherheit: alle Nachrichten authentifiziert +* Mehrere Pfade mit gleichen Kosten erlaubt +* Für jeden Link gibt es mehrere Kostenmetriken für verschiedene Types of Service (TOS) +* Integrierter Support für Uni und Multicast + > Unicast: Ein Sender, ein Empfänger + > + > Multicast: Ein Sender, eine Gruppe von Empfänger + > + > Broadcast: Ein Sender, alle Teilnehmer eines Netzes + +#### Hierarchisches OSPF +* Zwei Level Hierarchie: local Area, backbone + * Link State Advertisements nur im eigenen Gebiet + * Jeder Knoten mit detaillierter Gebietstopologie, kennt aber nur die Richtung zu Netzwerken in anderen Gebieten +* Area Border Router: Fassen Distanzen zu Netzen im eigenen Gebiet zusammen, senden Adverisements an andere Area-Border-Router +* Backbone Router: führen OSPF uneingeschränkt auf Backbones aus +* Boundary Router: verbinden zu anderen ASs + +#### BGP - Border Gateway Protokoll +* De facto Standard +* BGP stellt jedem autonomen System die Möglichkeit bereit: + * Subnetzerreichbarkeitsinfos vom Nachbar AS zu erhalten + * Erreichbarkeitsinformationen im gesaten AS zu verteilen + * Gute Routen zu Subnetzen herauszufinden + * Erlaubt es Subnetzen deren Existenz zu verkünden + +#### BGP - Grundlagen +* Routerpaare tauschen Routinginformationen über semipermanente TCP Verbindungen aus: BGP Sitzungen (sind keine physischen Links) +* Wenn AS2 einen Prefix an AS1 verkündet, so ist dies ein Versprechen, alle an diesen Prefix adressierten Datagramme dorthin weiterzuleiten + +#### Verteilung von Erreichbarkeitsinformationen +* Dank eBGP Sitzung zwischen 3a und 1c sendet AS3 eine Prefixerreichbarkeitsinformation an AS1 +* 1c kann dann iBGP verwenden um diese neue Prefixerreichbarkeitsinformation an alle Router in AS1 verschicken +* 1b kann diese neue Erreichbarkeitsinformation an AS2 über die 1b zu 2a eBGP Sitzung weiter verteilen +* Wenn ein Router etwas über einen eneuen Prefix lernt, so erstellt er einen Eintrag für diesen Prefix in seiner eigenen Weiterleitungstabelle + +#### Pfadattribute und BGP Routen +* Wenn ein Prefix verkündet wird, so enthält diese Verkündigung BGP Attribute: + * Prefix + Attribute = Route +* Zwei wichtige Attribute + * AS-Pfad: Erhält die AS,durch die welche die Verkündigung für den Prefix hindurchgegangen ist + * NEXT-HOP: Indiziert den spezifischen internen AS Router, welcher sozusagen spezifiuiert, in welches AS man als nächsten Hop gehen sollte +* Wenn der Gatewayrouter eine Routenankündigung erhält, so verwendet er eine import policy zum Annehmen oder Ablehnen der Route + +#### BGP Routenwahl +* Falls mehr als eine Route zum Prefix führt muss eine gewählt werden, bspw. durch Policyentscheidungen, kürzeste AS Pfade oder Hot-Potato-Routing, … + +#### BGP Nachrichten +* BGP Nachrichten werden in TCP Nachrichten übertragen + * OPEN: Öffnet TCP Verbindung zum Peer und authentifiziert den Sender + * UPDATE: Kündigt neuen Pfad an oder verwirft den Alten + * KEEPALIVE: Hält die Verbindung am Leben wenn keine Update-Nachrichten verschickt werden müssen, ebenfalls das ACK für die OPEN Anfrage + * NOTIFICATION: Zeigt Fehler in vorheriger Nachricht an; wird auch zum Terminieren der Verbindung verwendet + +## Zusammenfassung Kapitel 7 +* Routing in großen Netzwerken benötigt nicht nur adäquate Routingalgorithmen für generelle Graphen, sondern auch eine angemessene, hierarchische Struktur für Netzwerke +* Die Netzwerkstruktur muss sich in der Adressierungsstruktur zeigen, da flache Adressen in einem vermeidbaren Overhead resultieren würden +* Verschiedene Metriken und Ziele müssen erreicht werden, insbesondere im Interdomainrouting, bei welchem Optimalität nur ein einzelner Aspekt ist + +--- +# Kapitel 8: Transport Layer +## Transportlayerdienste und Protokolle +* Stellen logische Kommunikation zwischen Anwendungsprozessen von verschiedenen Hosts bereit + * Sendeseite: Segmentiert Anwendungsnachrichten und leitet diese Segmente an die Netzwerkschicht + * Empfangsseite: Reassembliert Segmente in Nachrichten und leitet diese an die Anwendungsschicht weiter +* Als Transportprotokolle werden im Internet hauptsächlich TCP und UDP verwendet + +## Transport vs. Netzwerklayer +* Netzwerklayer: logische Kommunikation zwischen zwei Hosts +* Transportlayer: logische Kommunikation zwischen zwei Prozessen + +## Transportlayerprotokolle im Internet +* Zuverlässige, in Order Zustellung: TCP + * Stau- & Flusskontrolle + * Verbindungsaufbau +* Unzuverlässige, ungeordente Zustellung: UDP + * Einfache Erweiterung des best Effort IP Ansatzes +* Nicht vorhanden sind: Verzögerungs- und Bandbreitengarantien + +## Adressierung und Multiplexing +* Stelle mehrere SAPs bereit um mehrere Anwendungen zu Multiplexen +* Bspw: Portnummern + * Dynamisch alloziert, aber teils vordefiniert für bekannte Dienste, Webserver Port 80, Port 25 für Mail + +## Multiplexing und Demultiplexing +* Multiplexing auf Sendeseite: + * Sammeln von Daten an mehreren Sockets, verpacken der Daten mit Header zum Demultiplexing +* Demultiplexing auf Empfangsseite: + * Zustellen empfangener Segmente an den korrekten Socket + +### Wie funktioniert Demultiplexing? +* Hosts verwenden IP-Adressen und Portnummern um Segmente an korrekte Sockets zuzustellen + +### Verbindungsloses Demultiplexing +* Erstelle Sockets mit Portnummern + * DatagramSocket mySocket1 = new DatagramSocket(9111); + * DatagramSocket mySocket1 = new DatagramSocket(9222); +* UDP Sockets werden übber Zweiertupel aus Ziel IP und Ziel Port identifiziert + +### Verbindungsorierntiertes Demultiplexing +* TCP Sockets werden durch ein Vierertupel aus Quell-IP, Quellport, ZielIP und Zielport identifiziert +* Der Emfpänger verwendet alle vier Werte um das Segment an den passenden Socket weiterzuleiten +* Pro Server gleichzeitig mehrere Sockets, eindeutig bestimmt durch das 4er Tupel +* Webserver haben verschiedene Sockets für jeden verbundenen Client + * Nichtpersistentes HTML hat verschiedene Sockets für jede Anfrage + +### Multithreaded-Webserver +* Behandelt jede Anfrage als einen neuen Thread, anstelle eines neuen Prozesses, dh. ein Prozess handelt mehrere simultane Verbindungen -> höhere Crashwahrscheinlichkeit + +### Verbindungskontrolle +* Bei verbindungsorientierten Diensten gibt es drei Phasen der Verbindung: + * Connect + * Data + * Disconnect +* Für jede Phase gibt es spezielle Dienstprimitive, wobei wir je nach Layer noch einen layerspezifischen Prefix an die Primitive hinzufügen + * Transportlayer: T-Connect, T-Data, T-Disconnect + +#### Aufbau der Transportverbindung +* bestätigendes Serviceprimitiv: T-Connect +* Primitive: + * T-Connect.Request(Zieladr., Quelladr) + * T-Connect.Indication(Zieladr., Quelladr.) + * T-Connect.Response(Antwortadresse) + * T-Connect.Confirmation(Antwortadresse) + +#### Datentransferdienst +* Datentransferdienst: T-Data (bestätigungslos) +* Primitive: + * T-Data.req(userdata) + * T-Data.ind(userdata) + +#### Verbindungsabbau +* bestätigungsloser Abbaudienst: T-Disconnect +* Verwendung: + * Abrupter Abbau einer Verbindung (möglw. Verlust von TSDUs) + * Ablehnen einer Verbindungsanfrage +* Primitive: + * T-Disconnect.req(userdata) + * T-Disconnect.ind(reason, userdata) +* Parameter: + * Grund des Abbaus: z.B. unbekannt, Veranlasst durch anderen Nutzer, Fehlen von Ressourcen, Auftreten von Fehler, Unerreichbarkeit + +#### Probleme während des Verbindungsaufbaus +* Verlust der CR (Connection Request) oder CC (Connection Confirm) TPDU +* Duplikate von TPDUs + +##### Drei Wege Handshake +* Problematisch ist vor allem der Verlust der CC TPDU +* Lösung: Drei Wege Handshake während des Verbindungsaufbaus + * Verbindung wird Aufgabaut, sobald beide Verbindungsaufbau TPDUs bestätigt wurden + * Benötigt zusätzliches ACK (Acknowledgement) oder DT (Data) +* Neues Problem: Schützt noch nicht vor verspäteten Duplikaten + * Problem: Wenn sowohl die Verbindungsanfrage CR, als auch die Verbindungsbestätigung CC dupliziert und verspätet sind, so hat der Empfänger wieder keine Möglichkeit herauszufinden ob dies eine neue oder alte Kopie ist +* Lösung: Der Sender muss eine Frage beantworten, welche der Empfänger fragt + * Packe hierzu eine Sequenznummer in die CR, ACK, CC, DATA TPDUs + * Muss durch die Gegenseite kopiert werden, und erlaubt den Verbindungsaufbau nur dann, wenn die korrekte Nummer bereit gestellt wird. Verwende Sequenznummern deshalb möglichst nicht schnell hintereinander erneut +* Neue Lösung funktioniert für Duplikate der CR und der CR + ACK + +##### Verbindungsablehnung +* Ablehnung einer eingehenden CR mit einer DR oder Error TPDU + * Gründe: + * Ablehnung durch Transportdienstbenutzer + * Nichterfüllbarkeit der Dienstanforderungen + +##### Verbindungsabbbau +* Normaler Abbau + * Kann den Verlust von nicht bestätigten Daten nach sich ziehen, TCP verhindert dies, indem alle gesendeten PDUs vor Beenden der Verbindung bestätigt werden müssen + * Varianten: + * implizit: Abbau der Netzwerklayerverbindung + * explizit: Verbindungsfreigabe mit Disconnect-TPDUs +* Sobald ein Verbindungskontext aufgebaut ist, sollte es einfach sein, eine Verbindung wieder abzubauen + * Ziel: Abbau der Verbindung erst dann, wenn beide Teilnehmer zugestimmt haben, nichts mehr sagen zu wollen und alles erhalten zu haben -> Praktisch ist dies unmöglich: Denn woher weiß man, dass der Andere weiß, dass man weiß, dass der Andere weiß …, dass alles volständig übertragen wurde? -> Problem der zwei Armeen + +##### Verbindungsabbau in der Realität +* Problem der zwei Armeen ist dem des Verbindungsbbaus äquivalent +* Wenn eine Verbindung abgebaut wird, kann man aber größere Risiken in Kauf nehmen +* Typischerweise gelößt mit 3-Wege-Handshake: Sende DR, setze einen Timer, warte auf den DR des Teilnehmers und bestätige diesen +* Auch die drei Problemfälle von verlorenem ACK, Verlorene zweite DR + erneute Übertragung der ersten DR sowie verlorene zweite DR + verlorenes ACK werden gelöst. + +--- +### Flusskontrolle +#### Motivation: Kontrolle von Überlastsituationen +Typischweise sind ein Sender, Empfänger und das Netzwerk dazwischen in der Kommunikation involviert, um Überlastsituationen zu verhindern, muss die Menge an Daten den vorhandenen Kapazitäten der Systeme angepasst werden + +#### Flaschenhälse auf der Empfängerseite +* Annahme: Das Netzwerk selbst ist kein Flaschenhals, es kann alle Pakete ausliefern +* Gründe für Flaschenhälse auf der Empfangsseite: verschiedene Performancecharakteristika oder mehrere Sender auf einen Empfänger +* Konsequenzen: Empfänger ist überfordert mit ankommenden Paketen, Puffer laufen über und Daten gehen verloren + +#### Flusskontrolle +* Aufgabe: Schutz des Empfängers vor zu vielen ankommenden Paketen von der Sendeseite +* Bereitgestellt auf der: + * Linklayerebene: um Überlastung von "forwarding Segmenten" zu verhindern + * Höhere Layer: um Überlastung von Verbindungen zu verhindern +* Flusskontrolle auf dem Transportlayer ist komplizierter + * Viele Verbindungen, benötigt dynamische Allokation von Pufferspeicher + * Transportlayer PDUs mit schwankender Größe + * Puffermöglichkeiten des Netzes fügen weitere Komplexität hinzu + +#### Flusskontrolle - Pufferallokation +* Flusskontrolle abhängig von der Puffermöglichkeit +* Um ausstehdene Pakete zu unterstützen müssen diese entweder sofort und in korrekter Reihenfolge beim Empfänger ankommen, oder es muss genügend Puffer vorhanden sein +* Wie erreicht man Puffersicherheit? + * Empfänger verlangsamt den Sender + * Anforderung von Pufferspeicher durch den Sender + * Mitteilung des Empfängers an den Sender, dass nur noch so viel Puffer verfügbar ist (bei Sliding Window einfach das Sendefenster anpassen) + +#### Flusskontrolle durch Continue und Stop +* Einfachste Lösung: Sende Stopnachrichten wenn der Empfänger nicht schritthalten kann und Continue, sobald wieder Ressourcen vorhanden sind +* Beispiel: XON/XOFF: funktioniert aber nur bei Fullduplexverbindungen + +#### Implizite Flusskontrolle +* Idee: Halte ACKs oder NACKs zurück, um den Sender zu verlangsamen, somit werden Fehlerkontrollmechanismen nun zur Flusskontrolle missbraucht werden +* Nachteil: Senderseitig keine Unterscheidung mehr möglich, ob Pakete verloren gingen, oder er verlangsamt werden soll, was in unnötigen Wiederholungsübertragungen resultiert + +#### Kreditbasierte Flusskontrolle +* Der Empfänger gewährt dem Sender expliziten Kredit, sodass dieser meherere Pakete senden kann +* Ist der Kredit aufgebraucht, so muss der Sender warten, bis er wieder neuen zugeteilt bekommt +* Hierbei benötigen wir Fehlerkontrolle um auf verlorene Kreditnachrichten resultieren zu können +* Alternativ: absoluter Kredit oder Kreditfenster + +#### Flusskontrolle - Permits und Acknowledgements +* Permits = Empfänger hat Pufferspeicher, sende also weiter +* Acknowledgements = Empfänger hat Anzahl X an Paketen empfangen +* Kombinierbar mit dynamisch wachsendem Pufferplatz beim Emfänger (Beispiel TCP) + +--- +### Staukontrolle +#### Warum benötigt man Staukontrolle? +Jedes Netzwerk kann nur eine gewisse Anzahl an Traffic pro Zeit transportieren, wenn nun mehr Traffic von den Quellen ausgeht, als das Netzwerk als nominelle Kapazität hat, so kommt es zu Staukollapsen und verlorenen Paketen + +#### Gründe für Stau +1. Zwei Sender, zwei Empfänger, ein Router mit unendlich viel Pufferspeicher, keine erneuten Übertragungen + * Große Verzögerung bei Stau +2. Ein Router mit endlich viel Pufferspeicher, Sender überträgt Pakete nur erneut, wenn sie tatsächlich verloren gehen + * Immer λ-in = λ-out (goodput) + * Kosten des Staus: + * Mehrarbeit wegen der erneuten Übertragung für einen goodput + * Unbenötigte erneute Übertragungen +3. Vier Sender, Multihoppfade, Timeout/Erneute Übertragungen + * Wenn ein Paket verworfen wird oder verloren geht, so war jede Übertragungskapazität für dieses Paket verloren und verschwendet. + +#### Zusammenfassung +* Staukontrolle ist essentiell, um Schneeballeffekte zu vermeiden + * Sobald ein Netzwerk einmal überladen ist, wird es Pakete verlieren + * Nach Erkennung von Paketverlusten durch ein zuverlässiges Transportprotokoll, werden Pakete erneut übertragen, was die Last abermals erhöht + * -> Teufelskreislauf + +#### Adaptiere die Senderate an die Netzwerkkapazität +* Die Senderate jeder Quelle muss an die aktuelle Kapazität des Netzwerks angepasst werden +* Staukontrolle ist ein globales Problem, da dies abhängig von allen Routern, Weiterleitungsdisziplinen, Lastinjektionenund so weiter ist. +* Flusskontrolle wiederum ist ein lokales Problem + * Die Quelle darf das Ziel nicht überlasten, also sind nur Ziel und Quelle involviert + +#### Wünschenswerte Eigenschaften von Staukontrolle +* Sollte dazu führen, dass möglichst viele Pakete mit kurzer Verzögerung zugestellt werden +* Alle Teilnehmer sollten einen gerechten Anteil der verfügbaren Kapzität erhalten, aber wie bewertet man Fairness und was sollte alles beachtet werden? + +#### Designoptionen für Staukontrollmechanismen +* Open Loop: Designe das System von Beginn an so, dass es korrekt funktioniert und man keine Korrekturen zur Laufzeit vornehmen muss +* Closed Loop: Verwende Feedback, um zu erlauben, dass sich der Sender an die Situation anpasst +* Explizited Feedback: Die Stelle, an welcher der Stau auftritt informiert den Sender +* Implizites Feedback: der Sender extrahiert aus dem Netzwerkverhalten Informationen darüber, wie er sich verhalten sollte + +#### Mögliche Aktionen +* Erhöhen der Kapzität -> teuer, kurzfristig nicht umsetzbar +* Reservierungen und Zugriffskontrolle - erlaube also keinen zusätzlichen Verkehr wenn das Netzwerk stark ausgelastet ist -> nur für schaltkreisbasierende Netzwerke verfügbar +* Reduzierung der Last in kleiner Granularität -> Bringe einzelne Quellen dazu ihre Last zu reduzieren, sodass nichts terminiert werden muss (benötigt Feedback vom Netz: closed loop) + +#### Mögliche Aktionen - Taxonomie +* Router vs. Hostzentriert + * Wo werden die Informationen erhoben, Entscheidungen getroffen und Aktionen veranlasst? +* Fenster vs. Ratenbasiert + * Wie wird die erlaubte, ins Netz zu gebende Last definiert, durch + * die Rate, also X Bytes die Sekunde, oder + * durch ein Staufenster, als Menge von Sequenznummern von Bytes, welche versendet werden müssen, bevor weitere Permits benötigt werden + +#### Routeraktionen - Verwerfen von Paketen +* Pufferplatz eines Routers ist voll und ein neues Paket kommt an, welches verwirft man, das neu ankommende oder eines aus der Warteschlange? + * Für Medieninhalte sind neue wichtiger als alte Pakete + +#### Verwerfen von Paketen - Implizites Feedback +* Das sendende Protokoll kann Verluste erkennen, in kabelgebundenen Netzwerken ist annehmbar, dass Paketverluste nur durch Stau entstehen -> Verlust von Paketen als klarer Hinweis auf Stau +* Bei Open Loop Systemen sollte es nie vorkommen, dass ein Paket an einer vollen Warteschlange ankommt + +#### Vermeiden von vollen Warteschlangen - Proaktive Aktionen +* Wenn ein in einem Netzwerk Pakete an einer vollen Warteschlange ankommen, so steht es bereits relativ schlecht um das Netz -> Eingreifen bereits vor dieser Situation +* Reagiere sobald die Queue einen gewissen Staufaktor erreicht hat -> Der Router ist dann in einem Warnzustand + +#### Choke Pakete +* Sobald ein Stau der Router einen Stau erkannt hat -> Sende Chokepakete +* Chokepakete sagen dem Ziel, dass es seine Senderate verringern soll +* Problem hierbei: Wie sinnvoll ist es, in ein sowieso schon volles Netzwerk noch weitere Pakete zu injezieren? Und wie lange dauert es eigentlich bis die Quelle vom Stau erfährt (BW\*Delay)? + +#### Warnungsbits +Sobald ein Router feststellt, dass er von Stau betroffen ist, setzt er ein Warnbit in allen Paketen die er verschickt -> Da das Ziel das Warnungsbit in sein ACK Paket aufnimmt, erfährt die Quelle vom Stau und kann ihre Sendeleistung minimieren + +#### Random Early Detection +* nutze verworfene Pakete als implizites Feedback, bereits bevor die Warteschlange voll ist, wirf also vorzeitig Pakete weg um Feedback zu geben +* Mit steigender Staubelastung am Router kann die Entwurfswahrscheinlichkeit erhöht werden + +#### Was passiert aber, wenn Feedback empfangen wurde? +* Ratenbasierte Protokolle: + * Reduzieren der Rate ist einfach, aber wann erhöht man wieder? +* Fensterbasierte Protokolle: Schrumpfe das Staufenster + * Um welchen Faktor? Wie lässt man das Fenster überhaupt wachsen? + +--- +### Transportprotokolle im Internet +#### UDP - User Datagram Protocol +* Kein Schnickschnack, minimalistisches Internettransportprotokoll +* Best Effort Dienst -> UDP Segmente können verloren gehen, nicht reihenfolgegetreu zugestelllt werden +* Verbindungslos -> Kein Handshaking und unabhängige Behandlung der Pakete +* UDP wird oftmals für das Streamen von Multimediainhalten verwendet -> Tolerant gegenüber Verlusten und Ratenempfindlich (weiterhin für DNS und SNMP) +* Verlässliche Dienste unter UDP mit Zuverlässigkeit auf dem Applikationslayer + +##### UDP Checksummen +* Ziel: erkenne im Übertragenen Segment +* Senderseite: + * Behandle Segmentinhalte als Sequenz von 16-Bit Integern + * Checksumme: Addition der Segmentinhalte (1-Komplement) + * Platziere den Checksummenwert in das Checksummenfeld +* Empfängerseite: + * Berechne Checksumme des empfangengen Segments + * Prüfe ob der berechnete Wert gleich dem im Cheksummenfeld ist + * Falls nein -> Fehler erkannt + * Falls ja -> kein Fehler erkannt, dass keiner passiert ist, ist aber dadurch nicht gesagt + +#### TCP - Transmission Control Protocol +* Punkt-zu-Punkt: Ein Sender, ein Empfänger +* Zuverlässiger, reihenfolgegetreuer Bytestrom -> keine Nachrichtengrenzen +* Pipelined: Staukontrolle und Flusskontrolle bestimmen die Fenstergröße +* Sende und Empfangspuffer +* Vollduplex Daten: Bidirektionaler Datenfluss +* Verbindungsorientiert: Handshaking initialisiert den Sender- und Empfängerzustand bevor Daten ausgetauscht werden +* Fluss und Staukontrolle: Kein Überfordernd des Empfängers oder des Netzwerkes + +##### TCP - Sequenznummern und ACKs +* Sequenznummern: Bytestromnummer des ersten Bytes aus den Daten des Segments +* ACKs: Sequenznummer des nächsten von der anderen Seite erwarteten Bytes +* Die Frage wie man Pakete, welche nicht in Reihenfolge angekommen sind, behandeln soll, überlässt TCP dem Implementierer + +##### TCP Round Trip Time und Timeouts +* Zuverlässsiger Datenverkehr benötigt eine Behandlung von Timeouts +* Frage: Wie setzt man einen TCP Timeoutwert? + * Länger als die schwankende RTT, nicht zu kurz -> Unnötige Neuübertragungen, nicht zu lange -> langsame Reaktion auf Segmentverlust +* Frage: Wie kann man die RTT abschätzen? + * SampleRTT: gemessene Zeit von der Übertragung eines Segments bis zum Erhalt der ACK Nachricht + * Besser: Mittelung über mehrere SampleRTTs + > EstimatedRTT = (1-a) · EstimatedRTT + a · SampleRTT +* Exponentiell gewichteter Durchschnitt, typisch für a: 0,125 +* Setzen des Timeouts auf EstimatedRTT + Sicherheitsbereich +* Erste Einschätzung, wie groß die Abweichung des SampleRTT zum EstimatedRTT ist: + * DevRTT = (1-ß) · DevRTT + ß · |SampleRTT - EstimatedRTT| + * mit ß = 0,25 +* Setzen das Timeoutintervall auf: EstimatedRTT + 4 · DevRTT + +##### TCP Verbindungsaufbau +* TCP Verbindungen können aktiv oder passiv hergestellt werden: + * Active: Anfragen einer TCP Verbindung mit speziellem, über IP und Portnummer, spezifizierten Transportdienstnutzer + * Passiv: eine Anwendung informiert TCP, dass sie bereit ist eine eingehende Verbindung zu akzeptieren. + * Es kann ein Socket spezifiziert werden, auf welchem die Verbindung erwartet wird, oder + * jede Verbindung wird angenommen (unspecified passive open) + * Egal wie die Verbindung zustandekommt, wird allerdings ein neuer Socket erstellt + +##### Verbindungsidentifikation bei TCP +* TCP Verbindungen laufen zwischen Initiator und Responder, bzw. den Anwendungsprozessen welche auf den Systemen laufen +* Eine TCP Verbindung wird über ein Vierertupel identifiziert + >(Quellport, Quell IP, Zielport, Ziel IP) + +##### TCP Verbindungsmanagement +* Drei Wege Handshake + * Client sendet ein TCP SYN (SYN = 1, ACK = 0) an den Server -> spezifiziert initiale, nie benutzte Sequenznummer + * Server erhält das SYN Paket und antwortet mit einem SYNACK (SYN = 1, ACK = 1) -> Server alloziert Puffer und spezifikation der initialen Sequenznummer des Servers + * Der Client erhält das SYNACK und antwortet hierauf mit einem ACK (SYN = 0, ACK = 1), hier können nun erstmals Daten enthalten sein +* Terminieren einer Verbindung + * Client sendet ein TCP FIN + * Server empfängt das FIN, antwortet mit einem ACK und sendet ebenfalls ein FIN + * Client erhält ein FIN Segment, antwortet darauf mit ACK und geht in timed Wait Zustand, antwortet auf alle FINs mit ACKs + * Server erhält ein ACK, die Verbindung ist geschlossen + +##### TCP Verbindung in drei Phasen +1. Verbindungsaufbau + * 3-Wege Handshake + * Aushandlung der Fenstergröße und der Sequenznummern +2. Datentransfer + * Piggybacking von Acknowledgements +3. Verbindungsabbau + * bestätigt + * verhindert den Verlust von bereits gesendeten Daten + +##### Zuverlässiger Datentransfer in TCP +* TCP erschafft einen zuverlässigen Datendienst oberhalb des unzuverlässigen IP Dienstes +* Eigenschaften: + * Pipelining von Paketen + * Kumulative ACKs + * Verwendung eines einzigen Neuübertragungstimers + * Auslösung von Neuübertragungen durch: + * Timeoutevents + * Duplizierte ACKs + +##### TCP Senderevents +* Daten von der Anwendung empfangen: + * Erstelle Segment mit einer Sequenznummer # + * Sequenznummer = Bytestromnummer des ersten Datenbytes im Segment + * Starte den Timer, falls bisher nicht geschehen +* Timeout: + * Übertrage das, den Timeout auslösende Paket erneut und starte den Timer von vorne +* Empfang eines ACKs + * Falls es zuvor unbestätigte Segmente gab, so aktualisiere was als bestätigt bekannt ist und starte den Timer erneut, sollte es noch ausstehende Segmente geben + +##### TCP Sender (vereinfacht) +* SendBase-1: letztes kumulativ bestätigte Byte (SendBase ist das nächste erwartete Byte) +* Beispiel: + * SendBase = 72, y = 73, der Empfänger will also 73+; y > SendBase, so, dass die neuen Daten bestätigt werden + +```cpp +NextSeqSum = InitialSeqSum +SendBase = InitialSeqSum +loop(forever){ + switch(event) + event: data received from application above, create TCP Segment with sequence number NextSeqSum + if(timer not running){ + start timer + } + pass Segment to IP + NextSeqSum = NextSeqSum + length(data) + + event: timer timout + retransmit not yet acked segment with smallest sequence number + start timer + + event: ACK received, with ACK field value of y + if(y > sendBase){ + SendBase = y + if(there are currently not-yet-acknowledged segments){ + start timer + } + } +} +``` + +##### TCP ACK Generierung +* Ereignis beim Empfänger: + * Ankunft eines Segments in Reihenfolge mit erwarteter Sequenznummer. Alle Daten bis zu dieser Sequenznummer sind bereits bestätigt + * Verspätetes ACK, warte bis zu 500ms auf das nächste Paket. Falls kein Segment eintrifft, so sende die Bestätigung + * Ankunft eines Pakets in richtiger Reihenfolge mit erwarteter Sequenznummer, für ein anderes Paket steht das ACK allerdings noch aus + * Sende sofort eine einzelne kumulierte Bestätigung für beide Pakete + * Ankunft eines out-of-order Seqments mit einer höheren als erwarteten Sequenznummer. Also erkennung einer Lücke + * Sende sofort eine duplizierte Bestätigung, welche die Sequenznummer des nächsten erwarteten Bytes anzeigt + * Ankunft eines Segments, welches eine Lücke teilweise oder vollständig füllt + * Sende sofort eine Bestätigung, unter der Bedingung, dass das Segment am niedrigeren Ende der Lücke startet + +##### Schnelle Neuübertragung +* Die Timeoutperiode ist oft relativ lang -> große Verzögerung, bis ein verlorenes Paket erneut gesendet wird +* Erkenne verlorene Segmente über die ACK Duplikate + * Sender senden oftmals viele Pakete hintereinander, wenn Segmente verloren gehen, so wird es voraussichtlich viele ACKduplikate geben +* Wenn der Sender 3 ACKs für die selben Daten erhält, so nimmt er an, dass das Segment nach den besätigten Daten verloren ging -> Schnelle Neuübertragung noch bevor der Timer ausläuft + +##### Algorithmus +```cpp +event: ACK recevied, with ACK Field value of y +if(y > SendBase){ + SendBase = y; + if(there are currently not-yet-acked segments){ + start timer + } +} +else { + increment count of duplicate ACKs received for y + if(count of duplicate y ACKs = 3){ + resend segment with sequence number y + } +} +``` + +### TCP Fluss- und Staukontrolle +#### Sende- und Empfangspuffer bei TCP +* Sender: Puffer um Fehlerkontrolle bereit zu stellen +* Empfänger: Zwischenspeichern von noch nicht abgerufenen, oder nicht reihenfolgegetreu angekommenen Paketen + * Bemerkung: Alte TCP Versionen verwendeten GoBackN und verwarfen diese Pakete + +#### TCP Flusskontrolle: Angebotenes Fenster +* Der Empfänger kann seine Empfangpufferkapazitäten verkünden + * Verwendeter Pufferspeicher = (NextByteExpected-1)-LastByteRead + * Maximal verfügbarer Puffer = MaxRcvdBuffer + * Angebotener Pufferplatz = MaxRcvdBuffer - ((NextByteExpected-1)-LastByteRead) +* Erinnerung: Das angebotene Fenster beschränkt die Menge an Daten welche der Sender in das Netzwerk schickt (Sender stellt sicher, dass LastByteSend-LastByteAcked <= Advertised Window ist) + +#### Nagles Algorithmus - Selbsttaktung und Fenster +* TCP Selbsttaktung: Ankunft eines ACKs ist ein Zeichen dafür, dass neue Daten auf das Netzwerk geschickt werden können +* Es wäre allerdings sinnlos, für kleine Größen, wie ein Byte, direkt nach dem ACK weiterzusenden (silly window syndrome) +* Nagles Algorithmus beschreibt wie viele Daten TCP Senden darf + * Wenn eine Anwendung zu versendende Daten produziert + * falls sowohl angebotene Daten und das angebotene Fenster >= MSS -> Sende ein volles Segment + * andernfalls + * falls unbestätigte Daten auf dem Weg sind, so puffere neue Daten bis das MSS voll ist, + * andernfalls schicke die Daten sofort + +#### Staukontrolle bei TCP +* Implizites Feedback durch verworfene Pakete + * Annahme: Stau als Hauptgrund für verworfene Pakete +* Fensterbasierte Staukontrolle + * TCP führt Buch über die Anzahl an Bytes die es noch in das Netzwerk injezieren darf, diese Fenstergröße kann wachsen oder schrumpfen + * Der Sender beschränkt die Übertragung zusätzlich: + * LastByteSend-LastByteAcked <= CongWin + +##### TCP ACK/Selbsttaktung +Durch die ACKs kann der Sender darüber Aufschluss erhalten, wann die Pakete das Netzwerk verlassen -> Folglich dienen ACKs nicht nur als Bestätigung, sondern auch als Erlaubnis wieder die selbe Anzahl an Daten in das Netzwerk zu senden + +##### Gute und schlechte Nachrichten +* Gute Nachricht: Ankunft eines ACKs + * Dh. wir haben das Netzwerk bisher nicht überlastet, versuchen folglich das Staufenster noch ein bisschen zu vergrößern +* Schlechte Nachrichten: Kein ACK, ein Timeout tritt auf + * Das Paket wurde verworfen, das Netzwerk ist überlastet, versuchen also das Staufenster zu verkleinern + +##### Verkleinern des Staufensters +* Überlastete Fenster sind äußerst unpraktisch, greifen deshalb drastisch ein, und halbieren das Staufenster, sobald ein Timeout eintritt +* Falls ein Paket durch Übertragungsfehler und nicht durch Überlastung verloren geht, so wird dies durch TCP missinterpretiert und es reagiert über + * Tritt in Kabelnetzwerken selten auf, führt aber zu Problemen bei Drahtlosnetzwerken + +##### Vergrößern des Staufensters +Der Sender kann sich hier nicht sicher sein, ob tatsächlich noch Kapzitäten vorhanden sind, deshalb versuche, wenn alle Pakete, der in der letzten RTT gesendeten Pakete, angekommen sind, ein Paket mehr zu senden + +##### Additives Erhöhen +* Wartet nicht auf eine volle RTT um zusätzliche Last hinzuzufügen, sondern verwendet dazu bereits einzelne ACKs +```cpp +Increment = MSS · (MSS / Congestion Window) +Congestion Window += Increment + +Mit MSS als maximale Segmentgröße +``` + +##### AIMD - Sägezahnmuster der angebotenen TCP Last +* TCP verwendet AIMD, also additive increase, multiplicative decrease Taktik +* Es wird also kontinuierich auf zusätzliche Bandbreite geprüft und durch die Erhöhung der Bandbreitengrenze wird das Netzwerk regelmäßig die multiplikative Verringerung ausführen -> Sägezahnmuster + +##### Schnelle initialisierung - Slow Start (historischer Name) +* Problem: Es dauert ewig, bis wir mit einem neuen Netzwerk überhaupt mittels additive increase an die Bandbreitengrenze kommen +* Idee Vergrößerung des Staufensters mittels Verdopplung nach jeder RTT oder Hinzufügen eines Pakets je ACK + +##### Verlassen des Slowstarts +Sobald die Bandbreitengrenze erreicht ist, werden Paketverluste und Timeouts auftreten, TCP wechselt ab diesem Zeitpunkt wieder in den normalen Modus + +##### Problematik der Paketbursts +* Ein Sender sendet sein volles Fenster, alle Pakete kommen an, ACKs gehen verloren und es kommt zu Timeouts die das Staufenster halbieren +* Ein Paket wird erneut übertragen, und es kommt ein kumulatives ACK für alle Pakete an, der Sender allerdings sendet nun in seinem halbierten Sendefenster nochmals die selben Daten -> ACK Taktung fehlt + +###### Lösung: Auch hier Slow Start verwenden +* Verhindern solcher Paketbursts durch lineare Erhöhung des Staufensters + * Setzen das Staufenster auf 1 und starten Slow Start +* Weiterhin haben wir nun grundlegende Informationen über die Netzwerkkapazität + * Müssen auf den ersten Paketverlust warten, hier ist das halbierte Fenster eine gute Annahme + * Wir können nun den Verlust von Paketen verhindern, wenn wir das vorherige Staufenster als Stauschwellenwert ansehen + +#### Zusammenfassung TCP Staukontrolle +* Wenn das Sendefenster < Schwellenwert, dann ist der Sender in der Slow Start Phase und das Fenster wächst exponentiell +* Wenn das Staufenster > Schwellenwert, dann ist der Sender in der Stauvermeidungsphase und das Fenster wächst linear +* Wenn ein dreifach dupliziertes ACK auftritt, so wird der Schwellenwert auf Staufenster/2 und das Staufenster auf den Schwellenwert gesetzt +* Wenn ein Timeout auftritt, so wird der Schwellenwert auf Staufenster/2 und das Staufenster auf 1 MSS gesetzt +* Erweiterungen: Fast Retransmit, fast recovery + * Ergreifen korrigierende Aktionen ohne auf ein Timeout warten zu müssen + * Nötig für Netze mit großen Bandbreitenverzögerungen +* Verschiedene TCP Versionen: TCP Tahoe, TCP Reno, TCP Vegas +* Größte Quelle für Komplikationen: Die Dummheit des Netzwerks + +#### TCP Performance +##### TCP Durchsatz +Der Durchschnittliche Durchsatz von TCP ist 0,75 · W/RTT + +##### TCP Fairness +* Fairnessziel: Wenn K TCP Sitzugen des selben Flaschenhalses mit Bandbreite R durchschreiten müssen, so sollten alle eine durchschnittliche von R/K haben. +* TCP ist fair, da: + * Eine additive Erhöhung eine Steigung von 1 ergibt, sobald sich der Durchsatz erhöht + * Multiplikative Verringerung den Durchsatz proportional verringert + +#### Fairness +###### Fairness und UDP +UDP wird für Multimediaanwendungen verwendet, da sie durch die Staukontrolle nicht gedrosselt werden wollen, wir senden also mit konstanter Rate und kümmern uns nicht um Verluste + +###### Fariness und parallele TCP-Verbindungen +* Programme können mehrere TCP-Verbindungen zu einem Host aufbauen +* Beispiel: Linkrate R unterstützt 9 Verbindungen + * Eine neue Anwendung fragt nach einer TCP Verbindung und erhält Rate R/10 + * Eine neue Anwendung fragt nach neun TCP Verbindungen und erhält Rate R/2 + +###### Verzögerungsmodellierung +* Wie lange dauert es, bis ein Objekt nach der Anfrage bei einem Webserver empfangen wird? + * Ohne Stau nur abhängig vom Verbindungsaufbau, der Datenübertragungsverzögerung und Slow Start +* Bemerkungen: + * Link L zwischen Client und Server mit Rate R, S = MSS, O = Objektgröße in Bits, keine Neuübertragungen + * Fenstergröße: + * Zuerst feste Größe, W Segmente + * Dann dynamische Fenster und Slowstart + +###### Festes Staufenster +1. WS/R > RTT + S/R: ACK für das erste Segment im Fenster kommt an, bevor einganzes Fenster an Daten verschickt wurde, erlaubt kontinuierliches Dauersenden + ``` + delay = 2RTT + O/R + ``` +2. WS/R < RTT + S/R: Warte auf das ACK nachdem ein Sendefenster an Daten geschickt wurde + ``` + delay = 2RTT + O/R + (K-1)[S/R + RTT - WS/R] + ``` + +###### TCP Verzögerungsmodellierung: Slow Start +* Die Verzögerung für ein Objekt ist die folgende: + ``` + Latenz = 2RTT + O/R + P[RTT+S/R]-((2^p)-1) · (S/R) + ``` +* Wobei P die Anzahl an Zeiten ist, in denen TCP beim Server in Bereitschaft ist: + ``` + P = min{Q, K-1} + ``` +* wobei Q die Anzahl an Zeiten ist, in denen der Server in Bereitschaft ist, unter der Bedingung, dass die Objekte von unendlicher Größe wären +* und K die Anzahl an Fenstern ist, welche das Objekt belegt +* Mit den Verzögerungskomponenten: + * 2RTT für Verbindungsaufbau und Anfrage + * O/R um das Objekt zu Übertragen + * Zeit die der Server durch Slowstart ruht + +### Fallstudie HTTP Modellierung +* Eine Webseite besteht aus folgenden Teilen + * 1 Basis HTML Seite von O Bits + * M Bildern zu je O Bits +* Nichtpersistentes HTTP (eine Verbindung pro Objekt) + * M+1 TCP Verbindungen in einer Reihe + * Antwortzeit: + * (M+1) · O/R + (M+1) · 2RTT + Idlezeiten +* Persistentes HTTP (eine Verbindung für alle Objekte) + * 2RTT für die Anfrage und den Empfang der Basis HTML Datei + * 1 RTT zum Anfordern der Bilder und deren Erhalt + * Antwortzeit + * (M+1) · O/R + 3RTT + Idlezeiten +* Nichtpersistentes HTML mit X parallelen Verbindungen + * 1 TCP Verbindung für die Basisdatei + * M/X parallele Verbindungen für die Bilder + * Antwortzeit + * (M+1) · O/R + (M/X +1) · 2RTT + Idlezeiten + +#### HTTP Antwortzeiten +* Für kleine Bandbreiten wird die Verbindungs- und Antwortzeit durch die Übertragungszeit dominiert + * Persistente Verbindungen zeigen nur geringfügige Verbesserungen gegenüber parallelen Verbindungen +* Bei größeren RTTs wird die Antwortzeit vom TCP - Aufbau und Slowstartverzögerungen dominiert + * Persistente Verbindungen sind nun deutlich im Vorteil, insbesondere in Netzen mit großem Bandwithdelayprodukt + +## Zusammenfassung Kapitel 8 +* Prinzipien hinter Transportlayerdiensten + * Adressierung, Mulitplexing, Demultiplexing + * Verbindungskontrolle + * Flusskontrolle + * Staukontrolle +* Instantiierung und Implementierung im Internet + * UDP + * TCP +* Drei wichtige Protokollfunktionen sind bei TCP direkt in einem Sliding Window Protokoll implementiert: + * Fehlerkontrolle: Durch Sequenznummern, ACKs und Neuübertragungen + * Flusskontrolle: Durch Inspizieren von ACKs und Permits + * Staukontrolle: Durch das Verlangsamen des Senders, wenn Pakete oder ACKs verloren gehen + +# Kapitel 9: Internet Application Layer +## Erstellen einer Netzwerkanwendung +* Schreibe Programme, die: + * auf verschiedenen Endsystemen laufen + * über ein Netzwerk kommunizieren +* Keine Software wird explizit für das Kernnetzwerk geschrieben + * Kernnetzgeräte arbeiten nicht auf der Anwendungsschicht + * Dieses Design erlaubt extrem schnelle Anwendungsentwicklung + +## Prinzipien von Netzwerkanwendungen: Architekturen +* Client-Server +* Peer-to-Peer +* Hybride aus Client-Server und Peer-to-Peer + +### Client-Server Architektur +* Server + * ständig eingeschaltet und mit permanenter IP-Adresse + * Serverfarmen zur Skalierung +* Clients + * Kommunizieren zeitweise mit dem Server + * Können dynamische IP-Adressen haben + * Kommunizieren nie direkt miteinander + +### Peer-to-Peer Architketur +* Ohne ständig eingeschalteten Server +* Beliebige Endsysteme kommunizieren direkt miteinander, sind dabei zeitweise verbunden und haben wechselnde IP Adressen + +### Hybride Client-Server und P2P +* Ursprüngliches Napster-Filesharing + * Filetransfer über P2P, mit zentralisierter Dateisuche +* Instant Messaging + * Chatten zwischen den Anwendern verwendet P2P + * Anwesenheitserkennung und Lokalisierung ist zentralisiert + +## Prozesskommunikation +* Prozesse: Programm welches auf einem Host ausgeführt wird + * Zwei Prozesse welche auf einem Host laufen, verwenden Interprozesskommunikation um zu kommunizieren + * Prozesse auf unterschiedlichen Hosts verwenden Nachrichtenaustausch + * Clientprozess: Initiiert die Verbindung + * Serverprozess: Wartet darauf kontaktiert zu werden + * Bemerkung: Anwendungen, welche die P2P Architektur verwenden, haben Client und Server Prozesse + +### Sockets +* Prozesse Senden und Empfangen Nachrichten an oder von ihrem Socket +* Application Programming Interface + * Wahl des Transportprotokolls + * Möglichkeit einige Parameter zu definieren + +### Adressierung von Prozessen +* Prozesse die Nachrichten empfangen sollen, müssen einen Bezeichner haben +* Jeder Host hat eine einzigartige 32-Bit IP-Adresse sowie eine Portnummer, beides zusammen ist durch den Bezeichner dann beschrieben + +## Durch das Anwendungsprotokoll festgelegte Eigenschaften +* Arten von ausgetauschten Nachrichten +* Syntax der Nachrichtenarten und Semantik der einzelnen Felder +* Regeln darüber, wann Prozesse, wie welche Nachrichten senden und darauf reagieren +* Offene vs. proprietäre Protokolle + * Public-Domain Protokolle + * offen für jeden Zugänglich, erlauben Interoperabilität + * Beispiel: HTTP, FTP, SMTP + * Proprietäre Protokolle + * Definiert durch einen Vertreiber, meist keine öffentlichen Spezifikationen + * Beispiel: KaZaA, Skype + +### Welche Transportdienste werden von den Anwendungen benötigt? +* Datenverlust + * Audio verkraftet einiges an Verlust + * Datenaustausch oder Telnet benötigen einen 100% zuverlässigen Datenaustausch +* Zeitliches Verhalten + * Internettelefonie oder Games brauchen kurze Latenzen +* Bandbreite + * Multimediaanwendungen benötigen teils eine minimale Bandbreite um funktionieren zu können + * Elastische Anwendungen hingegen, kommen mit so viel Bandbreite zurecht, wie sie eben zugesprochen bekommen + +## Internettransportprotokolldienste +* TCP + * Verbindungsorientiert -> Verbindungsaufbau zwischen Client und Server benötigt + * zuverlässiger Transport + * Flusskontrolle -> Der Sender überlastet den Empfänger nicht + * Staukontrolle -> Verlangsame den Sender, wenn das Netzwerk nahe der Belastungsgrenze ist + * Nicht vorhanden -> Timing, Garantien über die Bandbreite +* UDP + * Unzuverlässiger Datentransfer + * Nicht bereitgestellt + * Verbindungsaufbau + * Zuverlässigkeit + * Fluss- und Staukontrolle + * Timing oder Bandbreitengarantien + +## Web & HTTP +* Eine Website beseht aus Objekten +* Objekte können ein Bild, eine HTML Datei, ein Java Applet sein +* Eine Webseite besteht aus einer grundlegenden HTML Datei, welche verschiedene Referenzen auf Objekte enthält +* Jedes Objekt ist durch eine URL adressierbar + +### HTTP Übersicht +HTTP - Hyper Text Transfer Protocol +* Das Anwendungsnachrichtenprotokoll des Webs +* Client-Server Modell +* Wichtige Entwicklungsstufen: + * HTTP 1.0 (schließt die Verbindung nach jeder Anfrage) + * HTTP 1.1 (hält die Verbindung auch weiterhin Aufrecht) +* HTTP verwendet TCP + * Clients bauen eine TCP Verbindung zum Server an Port 80 auf + * Server akzeptieren diese Anfragen und HTTP Nachrichten werden zwischen dem Browser und dem Webserver ausgetauscht + * Die TCP Verbindung wird geschlossen +* HTTP selbst ist zustandslos, d.h. der Server hält keine Informationen über frühere Besuche auf der Website + +### HTTP Verbindungen +* Nichtpersistentes HTTP: + * höchstens ein Objekt wird über die TCP Verbindung verschickt + * HTTP/1.0 ist nichtpersistent +* Persistentes HTTP + * Mehrere Objekte können über eine TCP Verbindung zwischen Client und Server ausgetauscht werden + * HTTP/1.1 verwendet standardmäßig Persistenz + +### Antwortzeitmodellierung +> RTT\ +> Benötigte Zeit um ein kleines Paket so zu senden, dass es vom Client zum Server und zurück geschickt wird. + +* Antwortzeit + * eine RTT um die TCP Verbindung aufzubauen + * eine RTT für die HTTP Anfrage und die ersten paar Bytes der Antwort +* Totalzeit + * 2 RTT + Dateiübertragungszeit + +### Persistentes HTTP +* Probleme nicht persistenten HTTPs + * Benötigt 2RTT pro Objekt + * Allokierung von Hostressourcen für jede TCP Verbindung + * Browser können immerhin oftmals mehrere TCP Verbindungen aufbauen, um referenzierte Objekte zu Empfangen +* Persistentes HTTP + * Der Server lässt die Verbindung auch nach der Antwort noch am Leben + * Nachfolgende HTTP Nachrichten werden also über den selben, bereits allokierten Kanal gesendet +* Persistenz ohne Pipeling + * Der Client stellt nur dann eine Anfrage, wenn die vorherige Antwort empfangen wurde + * Eine RTT für jedes referenzierte Objekt +* Persistenz mit Pipelining + * Standard in HTTP/1.1 + * Der Client sendet eine Anfrage, sobald er ein referenziertes Objekt entdeckt + * Nur eine RTT für alle referenzierten Objekte + +### HTTP Anfragenachrichten +Insgesamt nur zwei Arten von Nachrichten: request und response + +![screenshot013.png](/core/preview?fileId=295415&x=1024&y=1024&a=true#mimetype=image%2Fpng&hasPreview=true&fileId=295415) + +### Hochladen von Einfaben +* POST Methode + * Webseiten beinhalten oft Formulareingaben, die Eingabe wird dann im Entity Body an den Server geschickt +* URL Methode + * Verwendet die GET Methode + * Die Eingaben werden im URL Feld der Requestline hochgeladen + +### Methodentypen +* HTTP 1.0 + * GET + * POST + * HEAD (Anweisung, das angefragte Element in der Antwort außen vor zu lassen) +* HTTP 1.1 + * GET, POST, HEAD + * PUT (Läd die Datei im Entity Body an den in der URL spezifizierten Pfad) + * DELETE (Löscht die in der URL spezifizierte Datei) + +### HTTP Statuscodes +* 200 OK - Anfrage okay, das angefragte Objekt folgt +* 301 Moved Permanently - das angefragte Objekt wurde verschoben, der neue Pfad folgt +* 400 Bad Request - Anfrage wurde nicht verstanden +* 404 Not Found - angefrodertes Objekt konnte auf dem Server nicht gefunden werden +* 505 HTTP Version not supported + +### HTTP Webcaching und Cookies +#### Nutzer-Server-Zustand: Cookies +* Vier Komponenten + * Cookieheaderzeile in der Antwort + * Cookieheaderzeile in der Anfrage + * Die Cookiedatei wird auf dem Rechner des Hosts gespeichert und vom Browser verwaltet + * Speichern der Cookieinformationen in einer Backenddatenbank der Webseite +* Welchen Nutzen haben Cookies? + * Autorisierung + * Warenkörbe und Empfehlungen + * Nutzersitungszustand + +> Cookies erlauben es den Webseite viel über einen Nutzer herauszufinden, +man gibt beispielsweise unfreiwillig Namen und Emailadressen weiter, +welche zum Beispiel für Werbeagenturen gefundenes Fressen sind. + +#### Webcaches (Proxyserver) +Ziel: Bedienen der Clientanfrage ohne den urpsrünglichen Webserver dabei zu involvieren +* Der Nutzer stellt den Browser so ein, dass dieser über einen Cache auf das Netz zugreift +* Alle Anfragen des Browsers gehen zuerst an den Cache, hat er das angefragte Material, so wird er dieses an den Client schicken, oder andernfalls beim Webserver besorgen und dem Client dann weiterleiten + +##### Weitere Informationen über Webcaches +* Der Cache agiert sowohl als Client als auch als Server +* Gründe für Webcaches + * Reduzieren von Antwortzeiten für Clientanfragen + * Reduzieren von Verkehr auf dem Zugangslink des ISPs + * Ein Internet voller Caches erlaubt es armen Anbietern effektiv Inhalte zu übertragen + +##### Bedingtes GET +* Ziel: Sende das Objekt nicht, wenn eine aktuelle Version des Objekts bereits im Cache liegt +* Cache: Spezifiziere das letzte Änderungsdatum der Datei im Cache in der HTTP Anfrage +* Server: Die Antwort beinhaltet das Objekt nur dann, wenn die Kopie im Cache veraltet ist + +### Webserverarchitekturen +#### Grundlegende Webserveraufgaben +* Zum Empfang von Anfragen bereitmachen +* Annehmen von Verbindungen und Anfragen +* Lesen und Verarbeiten von Anfragen +* Antworten auf Anfragen +* Bereitmachen und Annehmen von Anfragen + +#### Webserverarchitekturen +* Prozessmodell +* Threadmodell +* In-Kernel Modell +* Eventbasiertes Modell + +##### 1. Prozessmodell +* Einem Prozess werden alle benötigten Schritte zugewiesen, welche benötigt werden, um eine Anfrage zu bearbeiten +* Wenn die Bearbeitung abgeschlossen ist, so ist der Prozess wieder in der Lage neue Verbindungen zu akzeptieren +* Typischerweise werden mehrere Prozesse benötigt +* Ein Prozess blockiert, beispielsweise read(), dann entscheidet das OS, welcher Prozess als nächstes ausgeführt werden darf +* Die Parallelität wird durch die Anzahl an Prozessen limitiert +* Beispiel: Apache auf UNIX +* Vorteile + * Synchronisation dem Prozessmodell inhärent + * Absicherung zwischen Prozessen +* Nachteile + * Langsam + * Schwere Ausführbarkeit von Operationen, welche auf globalen Informationen beruhen + +##### 2. Threadmodell +Verwende Threads anstelle von Prozessen +* Motivation: + * Threaderstellung und Threadlöschung ist billiger + * Austausch von Daten zwischen Threads ist einfacher als bei Prozessen, aber Synchronisation wird nun für geteilte Daten benötigt +* Beispiele: + * JAWS, IIS, Apache unter Windows +* Vorteile: + * Schneller als Prozesse + * Teilen standardmäßig aktiv +* Nachteile: + * Benötigt OS Unterstützung + * Kann per Prozess Limitierungen überlasten + * Beschränkte Kontrolle über Schedulingentscheidungen + +##### 3. In-Kernel Modell +* Eine Möglichkeit: ganzer Server im Kernel +* Meist: nur statische Dateien werden vom Kernel bedient, andere Anfragen gehen an den regulären User-Space-Server +* Dedizierter Kernelthread für HTTP Anfragen +* Vorteile: + * Vermeidet das Kopieren von und in den Userspace + * Sehr schnell, solange es eng in den Kernel integriert ist +* Nachteile: + * Bugs können das OS, also die ganze Maschine crashen + * Schwer zu debuggen und zu Erweitern + * Inhärent OS-spezifisch +* Beispiele: + * khttpd + * TUX + * AFPA (Advanced Fast Path Architecture) + +##### 4. Eventbasiertes Modell +Verwenden eines einzelnen Webserverprozesses um mehrere Anfragen zu behandeln +* Beispiele: Zeus, Flash, Boa, Mathopd, ScatterWeb EWS +* Ein einzelnes HTTP Servermodell mit einer Liste an HTTP Verbindungen: list[index]; +* myHttpConnection[index].status = {response, begin, end, dynamic} +* myHttpConnection[index].PosInPage = readpointer; +* Vorteile + * Sehr schnell, kein Kontextwechsel + * Inhärentes Teilen ohne Locks + * Komplette Kontrolle über die Schedulingentscheidungen + * Kein komplexer OS-Support benötigt +* Nachteile + * Per-Prozess Begrenzungen + * Nicht jedes OS mit voll asynchroner E/A, so können beim Lesen immernoch Blockierungen entstehen + * Flash verwendet immerhin Hilfsprozesse um dies zu verhindern + +#### Performancevergleich +###### Webservercluster +* Zwei Wege um die Kapazität zu erhöhen: + * eine größere Maschine + * Cluster an billigen Standardmaschinen, beispielsweise PCs +* Zur Zeit dominiert v.a. die zweite Variante aufgrund: + * der Skalierbarkeit + * der Hochverfügbarkeit + * der Kosten +* Es stellt sich eine wichtige Designfrage: Anfragenverteilung + * Traditionell: Round Robin + * Effizienter: Inhaltsbasiert + +#### FTP: Das Dateitransferprotokoll +* Übertrage Daten von und zum Server +* Client Server Modell +* Standard FTP Port: 21 + +##### Separate Kontroll- & Datenverbindung +* Der FTP Client kontaktiert den Server auf Port 21 und verwendet dazu das TCP Protokoll +* Der Client wird über eine Kontrollverbindung autorisiert +* Der Client kann nun auf dem entfernten Verzeichnis arbeiten, idem er Kommandos über die Kontrollleitung sendet +* Wenn ein Server ein Kommando zum Dateitransfer erhält, so öffnet er eine TCP Datenverbindung zum Client +* Nachdem eine Datei übertragen wurde, schließt der Server die Verbindung, im Falle von einer weiteren zu übertragenden Datei, eröffnet der Server eine zweite TCP Datenverbindung +* -> Out of Band Kontrolle +* FTP Server behalten den Zustand, also derzeitiges Verhältnis und frühere Authentifizierung + +##### FTP Kommandos und Antworten +* Beispielkommandos: + * gesendet als ASCII Text über die Kontrollleitung + * USER username + * PASS password + * LIST gibt den Inhalt des aktuellen Verzeichnis aus + * RETR filename holt die Datei + * STOR filename speichert die Datei auf dem entfernten Host +* Beispielrückgabecodes: + * Statuscode und Phrase (wie bei HTTP) + * 331 Username OK. password required + * 125 data connection already open: transfer starting + * 425 can't open data connection + * 452 Error writing File + +#### Electronic Mail: E-Mail +* Bestehend aus drei Hauptkomponenten + * Useragent + * Mailserver + * Einfaches Mailübertragungsprotokoll: SMTP +* Useragent + * Erlaubt das Schreiben, Lesen und Bearbeiten von Nachrichten + * Ein- und ausgehende Nachrichten werden auf einem Server gespeichert +* Mailserver + * Die Mailbox beinhaltet eingehende Nachrichten, die Nachrichtenschlange die ausgehenden Nachrichten + +##### SMTP +* Verwendet TCP um Nachrichten zuverlässig vom Client zum Server zu übertragen, verwendet Port 25 +* Direkte Übertragung: vom Sender zum Empfänger +* Dreiphasige Übertragung + * Handshaking + * Übertragung der Nachrichten + * Terminieren der Verbindung +* Kommando/Antwort Interaktion + * Kommandos: ASCII Text + * Antwort: Statuscode und Phrase +* Nachrichten müssen in 7 Bit ASCII kodiert sein +* SMTP verwendet persistente Verbindungen +* SMTP Server verwenden CRLF um das Ende einer Nachricht zu erkennen + * Führt zu Problemen, wenn man versucht ohne Bitstuffing einen einzelnen . zu versenden + +###### SMTP Vergleich mit HTTP + +* Beide verwenden ASCII Statuscodesund Kommando/Antwort Interaktion +* HTTP: + * PULL: Der Initiator fragt den Antwortenden nach den Inhalten welche er haben möchte + * Jedes Objekt in eigener Antwortnachricht +* SMTP: + * PUSH: Der Initiator sendet dies, welches er kommunizieren will an den Antwortenden + * Mehrere Objekte werden in einer mehrteiligen Nachricht gesendet + +##### Mailnachrichtenformat +* SMTP als Protokoll, um Nachrichten auszutauschen +* RFC 822 als Standard für das Textnachrichtenformat +* Headerzeilen, beispielsweise: + * To: + * From: + * Subject: +* Body: + * Die Nachricht, bestehend nur aus ASCII Zeichen + +###### Nachrichtenformat: Multimediaerweiterungen +* MIME: Multimedia Mail Extensions +* Zusätzliche Zeilen im Nachrichtenheader deklarieren den MIME Inhaltstyp + +##### Mailzugriffsprotokolle +* SMTP: Zustellen/Speichern auf dem Empfangsserver +* Mailzugriffsprotokoll: Anfordern vom Server + * POP: Post Office Protocol + * Autorisierung und Download + * IMAP: Internet Mail Access Protocol + * Mehr Features aber komplexer + * Manipulation der serverseitig gespeicherten Nachrichten + * HTTP: Yahoo Mail, Hotmail, etc. + +##### POP3 +* Autorisierungsphase + * Clientkommandos: + * user: Nutzernamen deklarieren + * pass: Passwort übermitteln + * Serverantworten + * +OK + * -ERR +* Transaktionsphase + * Client + * list: Listet die Nachrichtennummern auf + * retr: Ruft die Nachrichten durch ihre Nummern ab + * dele: Löscht die Nachricht + * quit: Logout + +##### POP3 und IMAP +* POP3 + * Das Beispiel nutzt den Download und Delete Modus + * Bob kann die Emails also nicht nochmals lesen, wenn er den Client wechselt + * Download und Keep: + * Ermöglicht es Kopien von Nachrichten auf mehreren Clients zu haben + * POP3 ist zustandlos über mehrere Sitzungen +* IMAP + * Behält alle Nachrichten am Server + * Erlaubt es Nachrichten geräteübergreifend in Ordnern zu organisieren + * IMAP hält den Nutzerzustand über Sitzungsgrenzen hinweg + +### DNS - Domain Name System +* Für Menschen gibt es viele verschiedene Bezeichner, für Internethosts und Router gibt es IP Adressen und Namen, doch wie kann man einen Namen auf eine IP-Adresse mappen? +* DNS + * verteilte Datenbank implementiert in der Hierarchie von vielen verschiedenen Nameservern + * Anwendungsschichtprotokoll für Hosts, Router und Nameserver zum Kommunizieren zur Namensauflösung +* DNS Dienste + * Hostname auf IP Adressen Übersetzung + * Host Aliasing + * Mailserver + * Lastverteilung mittels replizierter Webserver - Eine Menge von IP-Adressen für einen cannonical Namen +* Warum zentralisiert man DNS nicht? + * Single Point of Failure + * Verkehrsaufkommen, Instandhaltung und Wartung + * Eine zentrale Autorität über die weltweite Namensauflösung? + +-> Skaliert einfach viel zu schlecht + +#### Verteilte hierarchische Datenbank +* Client möchte die IP für www.amazon.com + * Rootserver wird nach dem .com Server gefragt + * .com DNS Server wird nach dem amazon.com DNSServer gefragt + * Der Client fragt den amazon.com DNS Server nach der IP für www.amazon.com + +#### DNS: Root Name Server +* Kontaktiert von einem lokalen Nameserver, welcher den Namen nicht auflösen kann +* Root Name Server + * Kontaktiert den autorativen Nameserver, falls das Namensmapping unbekannt ist, erhält das Mapping und leitet dies an den lokalen Nameserver zurück + +#### TLD, Authorative und lokale DNS Server +* TLD (Top Level Domain) Server + * Verantwortlich für .com, .org, .net, .edu und die Landesdomains +* Authorative DNS Server + * DNS Server einer Organisation, stellen den authorativen Hostnamen für das IP Mapping der Organisationsserver + * Verwaltung durch Organisation oder Dienstanbieter +* Lokale DNS Server + * Gehören nicht strikt zur Hierarchie + * Jeder ISP hat einen eigenen + * Wenn ein Host eine DNS Anfrage stellt, so wird die Frage zuerst zum lokalen DNS Server gesendet (fungiert also als ein Proxy) + +##### Iterative Anfragen +Der kontaktierte Server antwortet mit dem Namen des zu kontaktierenden Servers: "Ich kenne seinen Namen nicht, aber frage diesen Server und er wird dir helfen können" + +##### Rekursive Anfragen +* Legt dem kontaktierten Server die Namensauflösung auf +* Aufgrund der hohen Last nicht durch TLD oder Rootserver unterstützt + +#### DNS Caching und Updaten von Records +* Sobald ein Server ein Mapping kennenlernt, cacht er diese für eine bestimmte Zeit + * TLD Server sind typischerweise in lokalen Nameservern gecacht, sodass nicht jedes mal der Rootserver besucht werden muss +* Update-/Benachrichtigungsmechanismen + * Verwendet von DHCP Servern um DNS Einträge in den Servern aktuell zu halten + * Alternativ auch DDNS über HTTPS um DNS Einträge für Hosts mit oft wechselnden IP Adressen zu aktualisieren + +#### DNS Records +* DNS: Verteilte Datenbank, welche die Ressource Records (RR) speichert + > RR Format: (name, value, type, ttl) +* Typ A +* name = Hostname +* value = IP Adresse +* Typ NS + * name = die Domain + * value = IP des authorativen Nameservers für diese Domain +* Typ MX + * value ist der Name des Mailservers, welcher mit dem name assoziert ist +* Typ CNAME + * name ist der Aliasname für irgendeinen cannonical Namen + * www.ibm.com ist tatsächlich servereast.backup2.ibm.com + * value ist der cannonical Name + +#### DNS Protokoll, Nachrichten +* DNS Protokoll: Frage und Antwortnachrichten mit selbem Nachrichtenformat +* Nachrichtenheader + * Identfizierung - 16 Bit Nummer für die Frage, identisch für die Antwort + * Flags + * Frage oder Antwort + * Rekursion erwünscht + * Rekursion verfügbar + * Antwort ist authorativ + +##### Einfügen von Records ins DNS +* Registrieren den Namen bei einem Registrar + * Müssen dem Registrar die Namen und IP Adressen von unserem authorativen Nameserver bereitstellen + * Der Registrar fügt zwei RRs in den .com TLD Server: + * (networkutopia.com, dns1.networkutopia.com, NS) + * (dns1.networkutopia.com, 212.212.212.1, A) + * Setzen dann einen Typ A Record für www.networkutopia.comund einen Typ MX Record für networkutopia.com in den authorativen Server + +### P2P Filesharing +* Ausführung eines Filesharingclients auf dem eigenen Rechner, erhalten für jede Verbindung eine neue IP Adresse, suchen nach einer Datei, welche Alice von Bob kopieren will. Währenddessen können andere Leute schon bei Alice Dateien per HTTP kopieren +* Ein Peer ist sowohl ein Webclient als auch ein transienter Webserver +* Alle Peers sind Server -> Hoch Skalierbar + +#### Probleme mit einem zentralisierten Verzeichnis +* Ein Single Point of Failure +* Performanceflaschenhals +* Copyrightverletzungen +> Dateiübertragung ist dezentralisiert, die Lokalisierung findet allerdings zentral statt. + +#### Anfragefluten: Gnutella +* Grundlegende Eigenschaften + * komplett verteilt, also kein zentraler Server + * Viele Gnutella Clients implementieren das Public Domain Protocol +* Overlaynetzwerk: Graph + * Kante zwischen Peer X und Y, falls eine TCP Verbindung zwischen ihnen existiert + * Alle aktiven Kanten und Knoten formen das Overlaynetzwerk + * Eine Kante ist **kein** physischer Link + +##### Gnutella Protokoll +* Fragenachricht wird über existierende TCP Verbindungen geschickt +* Peers leiten die Anfragenachricht weiter, Anfragentreffer werden dann rückwärts über den Pfad geschickt + +##### Gnutella Peerjoining +* Ein neu hinzukommender Peer X muss andere Peers im Gnutellanetzwerk finden: verwende hierzu eine Liste an Peerkandidaten +* X versucht sequentiell Verbindungen mit Peers aufzubauen, bis X die Verbindung mit Y aufbaut +* X sendet eine Pingnachricht an Y, Y leitet diese weiter +* Alle Peers die dadurch eine Pingnachricht erhalten, senden eine Pongnachricht zurück +* X erhält nun viele Pongnachrichten. Hierauf kann X nun viele neue Verbindungen eingehen + +### Socketprogrammierung mit TCP +Ziel: Lernen wie man Client/Server Anwendungen programmieren kann, welche Sockets zur kommunikation verwenden. +* Eingeführt in BSD 4.1 UNIX +* Sockets werden explizit erstellt, benutzt und durch Anwendungen freigegeben +* Client/Server Paradigmen +* Zwei Artenvon Transportdiensten über die Socket API: + * Unzuverlässige Datagramme + * Zuverlässig & Bytestromorientiert +> Socket\ +> Ein lokal auf dem Host laufendes, von einer Anwendung erstelltes, OS-kontrolliertes Interface, durch welches ein Anwendungsprozess sowohl Nachrichten vom und zu anderen Anwendungsprozessen Senden, als auch Empfangen kann. + +#### Socketprogrammierung unter Verwendung von TCP +* Socket: Tür zwischen Anwendungsprozess und dem Ende zu Ende Transportprotokoll +* TCP Dienst: zuverlässsige Übertragung von Bytes von einem Prozess zu einem anderen Prozess +* Der Client muss den Server kontaktieren + * Der Serverprozess muss zuerst ausgeführt werden und einen Socket erstellt haben, welcher auf den Clientkontakt wartet +* Der Client kontaktiert den Server durch: + * Erstellen eines lokalen TCP Sockets + * Spezifizieren der IP-Adresse und der Portnummer des Serverprozess + * Wenn der Client den Socket erstellt, dann baut das Client TCP eine Verbindung zum Server-TCP auf, das Server TCP erstellt daraufhin auch einen neuen Socket, sodass nun kommuniziert werden kann. + * Dies erlaubt es dem Server mit mehreren Clients zu sprechen + * Die Quellportnummern unterscheiden die Clients + > Sichtweise der Anwendung\ + > TCP stellt eine zuverlässige und reihenfolgegetreue Übertragung von Bytes zwischen Client und Server sicher + +#### Stream Jargon +* Ein Stream ist eine Sequenz aus Zeichen, welche in oder aus einem Prozess fließen +* Ein Eingangsstream ist an eine Eingabequelle gebunden, beispielsweise eine Tastatur oder einen Socket +* Ein Ausgangsstream ist an eine Ausgabequelle gebunden, wie einen Monitor oder einen Socket + +### Socketprogrammierung mit UDP +Bei UDP: Keine Verbindung zwischen Client und Server +* Kein Handshaking +* Der Sender fügt die IP-Adresse und den Zielport des Ziels explizit an jedes Paket +* Der Server muss die IP-Adresse und den Port des Senders aus dem erhaltenen Paket extrahieren +* Bei UDP können Daten nicht reihenfolgegetreu ankommen, oder verloren gehen +> Sichtweise der Anwendung\ +> UDP stellt eine unzuverlässige Übertragung von Gruppen an Bytes zwischen Client und Server bereit + +### Bauen eines einfachen Webservers +* Behandelt eine HTTP Anfrage, akzeptiert diese und parst den Header +* Zieht die angeforderte Datei vom Serverdateisystem +* Erstellt eine HTTP Antwortnachricht: Headerzeilen + Datei +* Sendet die Antwort an den Client + +## Zusammenfassung Kapitel 9 +* Anwendungsarchitekturen + * Client/Server + * Peer2Peer + * Hybride +* Anforderungen an Anwendungsdienste + * Zuverlässigkeit, Bandbreite, Verzögerung +* Internettransportdienstmodelle + * Verbindungsorientiert, verlässlich: TCP + * Unzuverlässig, mit Datagrammen: UDP +* Spezifische Protokolle + * HTTP + * FTP + * SMTP, POP, IMAP + * DNS +* Socketprogrammierung +* **Das wichtigste: Anwendungsprotokolle** + * Typischerweise Anfrage/Antwort Nachrichtenaustausch + * Clients fragen Info oder Dienst an + * Server antworten mit Daten und Statuscode + * Nachrichtenformate + * Header: Felder welche Info über die Daten geben + * Daten: Informationen, welche kommuniziert werden + * Kontroll vs. Datennachrichten + * In-Band vs. Out-of-Band + * Zentralisiert vs. Dezentralisiert + * Zuverlässiger vs. unzuverlässiger Nachrichtenaustausch + * Komplexität am Rande des Netzwerks + +--- +# Kapitel 10: Netzwerk Sicherheit +## Einführung - Bedrohungen, Sicherheitsziele, Schutzmaßnahmen +### Was ist eine Bedrohung in einem Kommunikationsnetzwerk? +* Abstrakte Definition + * Eine Bedrohung in einem Kommunikationsnetzwerk ist jedes mögliche Ereignis oder eine Sequenz von Aktionen, welche zu einer Verletzung einer oder mehrerer Sicherheitsziele führen + * Die Realisierung einer Bedrohung wird Attacke genannt +* Beispiele: + * Hacker brechen in Computer ein, Emails werden verändert, Finanzdaten werden verändert, ein Hacker legt eine Webseite lahm +* Was sind Sicherheitsziele: + * Sicherheitsziele können definiert werden: + * Abhängig vom Anwendungsumfeld, oder einem generelleren, technischeren Weg + +#### Sicherheitsziele (Security Objectives) in Abnhängigkeit von der Anwendungsumgebung +* Banking + * Schutz gegen Betrüger oder versehentliche Veränderung an Transaktionen + * Eindeutiges und fälschungssicheres Identifizieren der Kunden + * Sichern der PINs gegen zufälllige Entdeckung und der Privatspäre der Kunden +* Elektronisches Handeln + * Schützen der Privatsphäre der Kunden und des Unternehmens + * Bereitstellen von rechtlich bindenden Signaturen für Transaktionen +* und viele weitere im Bereich der Regierung, öffentlicher Telekommunikationsanbieter, Geschäfte und privater Haushalte +* Ziel ist es in jedem Fall sich gegen Angriffe von Außen zu schützen + +#### Sicherheitsziele technisch definiert +* Vertraulichkeit: + * Verschickte oder gespeicherte Daten sollen nur einem bestimmten Nutzerkreis zugänglich sein + * Vertraulichkeit von Instanzen wird auch als Anonymität bezeichnet +* Datenintegrität + * Es sollte möglich sein, jede Veränderung von Daten zu erkennen, dies benötigt unter anderem, die Möglichkeit den Ersteller von Daten identifizieren zu können +* Verantwortlichkeit + * Es sollte möglich sein, eine Instanz zu identifizieren, welche für irgendein Kommunikationsereignis zuständig ist +* Verfügbarkeit + * Dienste sollten verfügbar sein und auch funktionieren +* Kontrollierter Zugriff + * Nur autorisierte Instanzen solle in der Lage sein auf bestimmte Dienste oder Daten zuzugreifen + +#### Bedrohungen technisch definiert +* Maskerade (Spoofing) + * Eine Instanz behauptet jemand Anderes zu sein +* Abhören (Sniffing) + * Jemand versucht Daten zu lesen, welche er nicht lesen darf und soll +* Autorisierungsverletzungen + * Eine Instanz verwendet Ressourcen die sie nicht verwenden darf +* Verlust oder Veränderung von übertragener Information + * Veränderung oder Zerstörung von Daten +* Fälschung von Daten + * Eine Instanz erzeugt Daten im Namen einer Anderen +* Abstreiten von Kommunikationsereignissen (Repudiation) + * Eine Instanz streitet seine Beteiligung an einem Kommunikationsereignis ab +* Sabotage + * Jede Art von Aktion welche darauf abzielt, die Verfügbarkeit oder korrekte Funktion von Diensten zu reduzieren + +#### Sicherheitsanalyse von gelayerten Protokollarchitekturen +* Dimension 1: Auf welchem Interface findet der Angriff statt? +* Dimension 2: Auf welchem Layer findet der Angriff statt? + +##### Angriff auf dem Nachrichtenlevel +* Passive Übergriffe: + * Spähen +* Aktive Angriffe: + * Verzögerung von PDUs + * Wiederholung von PDUs + * Löschen von PDUs + * Veränderung von PDUs + * Einfügen von PDUs +* Ein erfolgreicher Angriff benötigt: + * Seiteneffektsfreiheit auf andere Kommunikationen + * Steineneffektsfreiheit auf andere PDUs in der selben Datenübertragung +* Eine Sicherheitsanalyse einer Protokollarchitektur muss diese Angriffe bezüglich der Layer der Architektur analysieren + +##### Sicherheitsmechanismen gegen Bedrohungen +* Physische Sicherheit: + * Abschließen der Betriebsräume, Zutrittskontrolle + * Tamper Proofing von sensitivem Equipment + * Schutz vor Überwachung der Umgebung +* Personelle Sicherheit + * Sensitivität bei Mitarbeitern erzeugen + * Überprüfung der Angestellten + * Sicherheitstraining +* Administrative Sicherheit + * Kontrollieren neuer Software + * Prozeduren um Sicherheitsverstöße zu erkennen + * Ansehen und Reagieren auf Audittrails +* Ausstrahlungssicherheit + * Steuerung von Frequenzen und anderer elektromagnetischer Ausstrahlungen +* Mediensicherheit + * Kontrollieren der Erstellung, Reproduktion und Zerstörung von Informationen + * Scannen von Medien auf Schadsoftware +* Lifecyclekontrollen + * Vertrauenswürdiges Systemdesign der Implementierung, Evaluation und Unterstüzung + * Dokumentierung + * Einhalten von Programmierstandards +* Computersicherheit + * Schutz der Informationen, während diese auf Rechnern gespeichert oder verarbeitet werden + * Schutz der Rechner selbst +* Kommunikationssicherheit + * Schutz der Informationen beim Transport von einem zum anderen System + * Schutz der Kommunikationsinfrastruktur an sich + +## Grundlagen der Sicherheitstechnologie +### Terminologie +* Sicherheitsdienst: + * Abstrakter Dienst, welcher versucht, eine bestimmte Sicherheitseigenschaft zu gewährleisten + * Kann mittels kryptographischer Algorithmen oder auf konventionelle Weise realisiert werden +* Kryptographischer Algorithmus + * Eine mathematische Transformation von Eingangsdaten (Daten, Schlüsseln) zu Ausgangsdaten +* Kryptographisches Protokoll + * Eine Serie an Schritten und Nachrichtenaustauschen zwischen mehreren Instanzen, um ein spezifisches Sicherheitsziel zu erfüllen + +### Sicherheitsdienste - Übersicht +* Authentisierung + * Grundlegender Sicherheitsdienst, welcher sicherstellt, dass eine Instanz tatsächlich die Identität hat, welche sie vorgibt zu haben +* Integrität + * Kleiner Bruder der Authentisierung, da er sicherstellt, dass Daten, welche von einer gewissen Einheit erstellt worden sind, nicht ohne Erkennung verändert werden können +* Vertraulichkeit + * Stellt sicher, dass die geschützen Daten geheim bleiben +* Zugriffskontrolle + * Kontrolliert, dass jede Identität nur auf die Informationen und Dienste zugreift, zu welchen sie auch zugriffsberechtigt ist +* Nicht Ablehnung + * Schütz davor, dass andere Einheiten nach einer Kommunikation behaupten können, nie daran teilgenommen zu haben + +### Kryptologie - Definition und Terminologie +* Kryptologie: + * Wissenschaft, die sich mit Kommunikation in sicherer und geheimer Art befasst + * Kryptologie besteht aus + * Kryptographie (graphein = schreiben): Die Lehre der Prinzipien und Techniken, durch welche Informationen in Ciphertext verpackt und später durch legitimierte Nutzer, wieder durch einen geheimen Schlüssel entschlüsselt werden können + * Kryptoanalyse (analyein = etwas lösen): Die Wissenschaft und Kunst Informationen von Ciphern wiederherzustellen und dies ohne das Wissen über den Schlüssel zu schaffen +* Cipher: + * Methode eine Nachricht so zu transformieren, dass die Bedeutung nicht mehr erkannt werden kann + * Cipher sind nur eine Klasse kryptographischer Algorithmen + * Die Transformation hat typischerweise eine Nachricht und einen geheimen Schlüssel als Eingabe + +#### Kryptographische Algorithmen +* Für die Netzwerksicherheit sind vor allem das Verschlüsseln und Signieren von Daten von Bedeutung: + * Verschlüsseln von Daten: Transformiert Plaintext in Ciphertext um die Inhalte zu verschleiern + * Signieren von Daten: Berechnet einen Checkwert oder eine digitale Signatur zu einem gegebenen Plaintext oder Ciphertext, sodass dieser durch alle oder einige Instanzen mit Zugriff verifiziert werden kann +* Prinzipielle Kategorien von Kryptographiealgorithmen + * Symmetrische Kryptographie verwendet einen Schlüssel für Ver- und Entschlüsselung oder Signieren und Überprüfen + * Assymmetrische Kryptographie verwendet zwei Schlüssel für Ver- und Entschlüsselung + * Kryptographische Hashfunktionen verwenden keinen Schlüssel (ist kein separater Input, wird in die Daten gemischt oder angehängt) + +#### Wichtige Eigenschaften von Verschlüsselungsalgorithmen +* Fehlerausbreitung: Charakterisiert die Effekte von Bitfehlern während der Übertragung von Ciphertext zum rekonstruierten Klartext +* Synchronisation: Charakterisiert die Effekte von verlorenen Ciphertexten auf den rekonstruierten Klartext + +##### Symmetrische Verschlüsselung +* Der selbe Schlüssel wird zur Ver- und Entschlüsselung eingesetzt +* Beispiele: DES, 3DES, AES, IDEA, RC4,… + +##### Asymmetrische Kryptographie +* Idee: + * Verwende zwei verschiedene Schlüssel +K und -K für Ver- und Entschlüsselung + * Gegeben ein zufälliger Ciphertext c = E(+K,m) und +K, so sollte es unmöglich sein, m = D(-K,c) zu berechnen + * Der Schlüssel -K ist nur A selbst bekannt und wird As privater Schlüssel genannt + * Der Schlüssel +K ist As öffentlicher Schlüssel, den jeder kennen darf +* Anwendungen: + * Verschlüsselung + * Wenn B eine Nachricht mit As öffentlichem Schlüssel +K verschlüsselt, so kann sich B sicher sein, dass nur A diese Nachricht mit dem Schlüssel -K entschlüsseln kann + * Signieren + * Wenn A eine Nachricht mit seinem privaten Key -K verschlüsselt, so kann jeder diese Signatur mit As öffentlichem Schlüssel +K entschlüsseln +* Praktische Überlegungen + * Asymmetrische Verschlüsselungsverfahren sind um Größenordnungen langsamer als symmetrische Verschlüsselung, deshalb verwendet man die asymmetrische Verschlüsselung eher in Verbindung mit symmetrischer, nämlich indem man die Datenmengen symmetrisch verschlüsselt, und nur den Schlüssel auf asymmetrische Art verschlüsselt + +##### Erkennung verschlüsselter Nachrichten +* Motivation + * Fehlererkennungscodes erlauben es uns zu erkennen, ob Nachrichten während der Übertragung durch Bitflips o.ä. verändert wurden (Parität, CRC, …) + * -> Wunsch nach ähnlichem Wert, welcher besagt, ob eine Nachricht mutwillig verändert wurde +* Realisierung von MCVs: + * Kryptographische Hashfunktionen + * Entweder kombiniert mit asymmetrischer Kryptographie um einen signierten modification detection code (MDC) zu erhalten, oder Inklusion eines geteilten, geheimen, mit der Nachricht gemischten Schlüssel in der Nachricht + * Message Authentication Codes + * Häufige message authentication codes (MAC) werden aus einem symmetrischen Blockcipher konstruiert + +##### Kryptographisches Protokoll +* Definition: Ein kryptographisches Protokoll wird definiert als eine Serie von Schritten und Nachrichtenaustauschen zwischen mehreren Einheiten um ein spezielles Sicherheitsziel zu erreichen +* Anwendungen kryptographischer Protokolle + * Schlüsselaustausch + * Authentisierung + * Integrität: Erlaubt dem Empfänger zu verifizieren, von wem eine Nachricht kam und ob sie verändert wurde + * Einheitenauthentisierung: Erlaubt es Kommunikationspartnern die Identität ihrer Peers zu verifizieren + +## Einführung in die Sicherheitsdienste von Kommunikationsnetzwerken +### Sicherheit in Netzwerken: Was sollen wir wo tun? +* Dimension 1: Welcher Sicherheitsdienst auf welchem Knoten? +* Dimension 2: Welcher Sicherheitsdienst auf welcher Netzwerkebene? + +### Pragmatisches Modelll für sicheres und vernetztes Rechnen +* Anwendung: + * Ein Stück Software muss eine gewisse Aufgabe ausführen, beispielsweise Email, Webdienste, Speichern von Daten, … +* Endsystem: + * Irgendein Gerät, von PC bis Server oder Mainframe + * Endsysteme haben aus Sicherheitsgründen typischerweise eine Richtlinienautorität +* Subnetzwerk: + * Sammlung von Kommunikationsstellen unter der Kontrolle einer administrativen Organisation + * Aus Sicherheitsgründen haben Subnetz typischerweise eine Richtlinienautorität +* Inter-Netzwerk: + * Sammlung von untereinander verbundener Subnetzwerken + * Grundsätzlich haben in einem Inter-Netzwerk verbundene Subnetze eigene, also verschiedene Richtlinienautoritäten +* Vier Ebenen mit jeweils unterschiedichen Anforderungen an Sicherheitsprotokollelemente + * Anwendungsebene: Sicherheitsptrotokollelemente sind anwendungsabhängig + * Endsystemebene: Bereitstellung von Schutz auf einer Endsystem zu Endsystembasis + * Subnetzwerkebene: Bereitstellung von Schutz über ein Subnetzwerk oder Inter-Netzwerk welches als weniger sicher als andere Stellen des Netzwerks gilt + * Linkebene: Bereitstellung von Schutz in einem Subnetzwerk, beispielsweise über einen Link, welcher weniger vertrauenswürdig als andere Stellen des Subnetzwerks gilt + +### Beziehungen zwischen Layern und Anforderungsleveln +* Die Beziehungen zwischen Protokolllayern und den Protokollelementssicherheitsanforderungen lassen sich nicht 1zu1 abbilden: + * Sicherheitsmechanismen welche sowohl Anforderungen an Endsystemen oder Subnetzwerkebenen erfüllen, können entweder in der Transport, und/oder in der Netzwerkschicht realisiert werden + * Link-Level-Anforderungen können erfüllt werden, indem man Sicherheitsmechanismen entweder im Linklayer, und/oder auf der physischen Ebene integriert + +### Die IP Sicherheitsarchitektur IPSec +#### Sicherheitsprobleme des Internetprotokolls +* Wenn eine Instanz ein IP Paket erhält, so hat es keinen Nachweis über: + * Die Herkunft der Daten und deren Integrität + * Also, dass das Paket tatsächlich von der Einheit gesendet wurde, welche in der Quelladresse des Pakets referenziert wird + * dass das Paket noch den ursprünglichen Inhalt enthält + * dass die Empfangseinheit tatsächlich die Einheit ist, an welche der Sender das Paket schicken wollte + * Vertraulichkeit + * Dass die ursprünglichen Daten nicht von einem Dritten inspiziert und gelesen wurden, während das Paket auf dem Weg vom Sender zum Empfänger war + +#### Sicherheitsziele von IPSec +* Datenherkunftsauthentisierung/ Verbindungslose Datenintegrität: + * Es soll unmöglich sein, ein IP Datagramm mit einer maskierten Quell- oder Zieladresse zu versenden, ohne, dass dies der Emfpänger erkennen kann. + * Es soll unmöglich sein, ein IP Paket während der Übertragung so zu verändern, dass es dem Empfänger nicht auffallen kann + * Wiederholungsschutz: Es soll nicht möglich sein, ein gespeichertes Paket zu späterem Zeitpunkt zu versenden, ohne, dass dies der Empfänger mitbekommt +* Vertrauenswürdigkeit: + * Es soll nicht möglich sein, den Inhalt der IP Datagramme auszuspähen + * Es soll weiterhin eine begrenzte Traffic Flow Confidentiality geben +* Sicherheitsrichtlinie + * Sender, Empfänger und zwischenliegende Knoten sollen erkennen können, ob ein Paket ihrer Sicherheitsrichtlinie entspricht und dieses gegebenenfalls verwerfen + +#### IPSec: Sicherheitsassoziation +* Eine Sicherheitsassoziation (SA) it eine "Simplexverbindung" welche Sicherheitsdienste für den von ihr beförderten Verkehr anbietet + * Sicherheitsdienste werden einer SA durch die Verwendung von entweder AH (Authentication Header) oder ESP (Encapsulating Security Payload) bereitgestellt + * Für bidirektionale Kommunikation werden zwei SA benötigt + * Eine SA ist eindeutig bestimmt durch ein Tripel, welches aus eine Sicherheitsparamterindex (SPI), einer Ziel-IP-Adresse und einem Sicherheitsprotokollbezeichner (AH/ESP) besteht + * Eine SA kann zwischen folgenden Peers aufgebaut werden + * Host <-> Host + * Host <-> Gateway + * Gateway <-> Host + * Gateway <-> Gateway + * Es gibt zwei konzeptionelle Datenbanken, die mit SAs assoziiert werden + * Die Sicherheitsrichtliniendatenbank (SPD), spezifiziert welche Sicherheitsdienste wie für IP Pakete bereitgestellt werden + * Die Sicherheitsassoziationsdatenbank (SADB) + +#### IPSec Protokollmodi +* Eine SA ist immer von einem der folgenden Typen: + * Der Transportmodus kann nur zwischen Endpunkten der Kommunikation verwendet werden + * Host <-> Host + * Host <-> Gateway (falls Gateway hier Kommunikationsendpunkt) + * Der Tunnelmodus kann mit beliebigen Peers verwendet werden +* Unterschiede zwischen den Modi: + * Der Transportmodus fügt nur einen sicherheitsspezifischen Header hinzu (+ potentiellen Trailer) + * Der Tunnelmodus kapselt IP Pakete +* Die Kapselung von IP-Paketen ermöglicht es den Gateways , Daten im Auftrag von anderen Instanzen zu schützen + +#### IPSec: Verschachtelung von Sicherheitsassoziationen +Beispiel: Host A und Gateway RB führen Datenherkunftsauthentisierung aus und die Gateways RA und RB führen Subnetz-to-Subnetz Vertraulichkeit aus + +##### IPSec Authentication Header (AH) +* Im Tunnelmodus stellt der Payload nochmals ein ganzes IP Paket dar +* Wichtig: AH funktioniert nur in NAT freien Umgebungen + +##### IPSec Encapsulating Security Protocol (ESP) +* Dem ESP Header folgt direkt ein IP Header oder ein AH-Header +* Das next-header Feld vom vorhergehenden Header indiziert 50 für ESP + +#### IPSec: Etablierung von Sicherheitassoziationen +* Bevor ein Paket von IPSec geschützt wird, muss eine SA zwischen den beiden "kryptographischen Endpunkten", welche den Schutz bereitstellen, aufgebaut werden +* SA Etablierung kann auf folgende Arten geschehen + * Manuell, durch proprietäre Methoden des Systemmanagements (nur in Ausnahmefällen) + * Dynamisch, durch ein standardisiertes Authentisierungs- und Schlüsselmanagementprotokoll +* IPSec definiert eine standardisierte Methode für die Etablierung von SAs + * Internet Security Association and Key Management Protocol (ISAKMP) + * Definiert Protokollformate und Prozeduren für die Sicherheitsaushandlung + * Internet Key Exchange (IKE) + * Definiert IPSecs Standardauthentisierungs- und Schlüsselaustauschprotokoll + +## Internetfirewalls +* Eine Netzwerkfirewall kann gut mit einer mittelalterlichen Zugbrücke verglichen werden: + * Sie beschränkt, welche Menschen die Burg betreten, da es nur den einen kontrollierten Eingang gibt + * Sie hält Angreifer davon ab, zu den weiteren Schutzmaßnahmen vorzudringen + * Sie beschränkt, welche Leute die Burg am streng überwachten Übergang verlassen +* Typischerweise wird eine Firewall an einem Punkt installiert, dan dem ein geschützes Subnetz an ein weniger vertrauenswürdiges Netzwerk angeschlossen wird +* Grundsätzlich realisieren Firewalls also Zugriffskontrolle auf dem Subnetzlevel + +### Terminologie +* Firewall: + * Eine oder eine Menge an Komponenten, welche den Zugriff zwischen einem geschützten Netzwerk und dem Internet oder zwischen einer Menge an Netzwerken beschränkt +* Paketfiltern/Screening: + * Die Aktion, welche ein Gerät ausführt, um selektiv den Fluss an Daten in und aus einem Netzwerk zu kontrollieren + * Paketfiltern ist eine wichtige Technik um Zugriffskontrolle auf dem Subnetzwerklevel für paketorientierte Netzwerke zu implementieren +* Bastion Host: + * Ein Computer, welcher besonders gesichert werden muss, da er anfälliger für Angriffe ist, als andere Computer im Subnetz + * Ein Bastion Host in einer Firewall ist typischerweise der Hauptansprechpartner für Nutzerprozesse von Hosts innerhalb des Netzwerks zu Prozessen von externen Hosts +* Dual Homed Host + * Ein Computer mit > 2 Netzwerkinterfaces +* Proxy: + * Ein Programm, welches sich im Auftrag interner Clients mit externen Servern beschäftigt + * Proxies leiten genehmigte Clientanfragen an die Server, und die Antworten auch wieder an den Client weiter + * Wenn ein Proxy die Kommandos eines Anwendungsprotokollls versteht und interpretiert, dann ist es ein Application Level Proxy, andernfalls, falls er die PDUs nur zwischen Cient und Server weiterreicht, so ist es ein Circuit Level Proxy +* Network Address Translation (NAT): + * Eine Prozedur, durch welche ein Router die Daten in Paketen ändert um die Netzwerkadressen zu modifizieren + * Dies erlaubt es die interne Netzwerkstruktur zu verschleiern +* Perimeternetzwerk + * Ein Subnetz, welches zwischen einem externen und einem internen Netzwerk hinzugefügt wird, um eine weitere Sicherheitseben bereitzustellen + * Ein Synonym hierfür ist DMZ (De Militarized Zone) + +### Firewallarchitekturen +#### Einfache Paketfilterarchitektur +* Einfachste Architektur bestehend aus einem paketfilternden Router +* Realisierbar durch PC mit zwei Netzwerkinterfaces oder einem dedizierten Router + +#### Die Screened Host Architektur +* Der Paketfilter erlaubt zuverlässigen Verkehr zwischen dem screended Host und dem Internet und blockiert jeglichen Verkehr zwischen anderen internen Hosts und dem Internet +* Der screened Host stellt Proxydienste bereit + * Ungeachtet des teilweisen Schutz durch den Paketfilter, fungiert der screened Host als ein Bastion Host + +#### Die Screened Subnet Architektur +* Ein Perimeternetzwerk wird zwischen zwei Paketfiltern installiert +* Der innere Paketfilter dient zum zusätzlichen Schutz im Falle, dass der Bastion Host je kompromittiert wird (so kann ein übernommener Bastion Host keinen internen Verkehr mithören) +* Dieses Perimeternetzwerk ist ebenfalls ein guter Ort, um einen öffentlich erreichbaren Server zu hosten + +#### Firewalls: Paketfiltrierung +* Was kann man mit Paketfiltern alles erreichen? + * Theoretisch alles, da alle Informationen, welche in einer Kommunikation ausgetauscht werden als Pakete transportiert werden + * Praktisch allerdings, dient folgendes als Orientierungshilfe + * Operationen, welche detaillierte Kenntnisse über Protokolle höherer Schichten erfordern, oder die verlängerte Nachverfolgung von vergangenen Ereignissen benötigen, sind in Proxysystemen einfacher zu realisieren + * Operationen, die zwar einfach sind, aber sehr schnell ausgeführt werden müssen, sind in Paketfiltersystemen einfacher zu handhaben +* Grundlegendes Paketfiltern erlaubt es den Datentransfer anhand folgender Kriterien zu kontrollieren: + * Quell IP + * Ziel IP + * Transportprotokoll + * Quell- und Zielanwendungsport + * Potentielle, spezifische Kontrollflags * Das Netzwerkinterface, auf welchem das Paket ankam \ No newline at end of file