Datenstrukturen und Algorithmen
Algorithmen und Datenstrukturen vom dpunkt.verlag
Algorithmen und Datenstrukturen vom dpunkt.verlag
Kartei Details
Karten | 96 |
---|---|
Sprache | Deutsch |
Kategorie | Informatik |
Stufe | Universität |
Erstellt / Aktualisiert | 08.02.2015 / 12.10.2022 |
Weblink |
https://card2brain.ch/box/datenstrukturen_und_algorithmen
|
Einbinden |
<iframe src="https://card2brain.ch/box/datenstrukturen_und_algorithmen/embed" width="780" height="150" scrolling="no" frameborder="0"></iframe>
|
Wie binarisiert man einen geordneten Baum?
der linke Zeiger zeigt auf das erste Kind, der rechte auf den Nachbarknoten.
Was ist Traversierung?
Systematischer Durchlauf aller Knoten eins Baumes. Es gibt
- Inorder
- Preorder
- Postorder
- Levelorder (Breitensuche)
Was ist die Inorder-Traversierung?
Besuche den linken Unterbaum, besuche dann die Wurzel, besuche dann den rechten Unterbaum.
Was ist Preorder-Traversierung?
Besuche die Wurzel, dann den linken Unterbaum, besuche dann den rechten Unterbau
Was ist die Postorder-Traversierung?
Besuche den linken Unterbaum, besuche dann den rechten Unterbaum, besuche dann die Wurzel.
Was ist Reverse-Inorder-Traversierung?
Besuche den rechten Unterbaum, besuche dann die Wurzel, besuche dann den linken Unterbaum.
Was ist Levelorder-Traverisierung?
Beginnend bei der Baumwurzel werden die Ebenen von links nach rechts durchlaufen.
Wann tritt eine Verletzung der AVL-Eigenschaft ein?
1. Einfügen in linken Teilbaum des linken Kindes
→ Rotation mit linkem Kind
2. Einfügen in rechten Teilbaum des linken Kindes
→ Doppelrotation mit linkem Kind
3. Einfügen in rechten Teilbaum des rechten Kindes
→ Rotation mit rechtem Kind
4. Einfügen in linken Teilbaum des rechten Kindes
→ Doppelrotation mit rechtem Kind
1 und 3 sowie 2 und 4 sind symmetrische Problemfälle
Was ist ein Rot-Schwarz-Baum?
Ein Rot-Schwarz-Baum ist ein binärer Suchbaum, in dem jedem Knoten ein
Farbattribut zugeordnet ist, so dass gilt:
1. Jeder Knoten ist entweder rot oder schwarz
2. Jeder Blattknoten (Null-Knoten) ist per Definition schwarz
3. Die Kinder jedes roten Knotens sind schwarz
4. Für jeden Knoten k gilt: Jeder Pfad von k zu einem Blatt enthält die gleiche
Anzahl schwarze Knoten („Schwarztiefe“)
Was ist ein B-Baum?
Was ist ein Trie?
Ein Trie oder Präfixbaum ist eine Datenstruktur, die zum Suchen nach Zeichenfolgen erwendet wird. Es handelt sich dabei um einen speziellen Suchbaum zur gleichzeitigen Speicherung mehrerer Zeichenketten. Dabei beinhalten Tries eine Art der Datenkompression da gemeinsame Präfixe der Zeichenketten nur einmal gespeichert werden.
Was ist Heapsort?
Die Eingabe ist ein Array mit zu sortierenden Elementen. Als erstes wird die Eingabe in einen binären Max-Heap überführt. Aus der Heap-Eigenschaft folgt direkt, dass nun an der ersten Array-Position das größte Element steht. Dieses wird mit dem letzten Array-Element vertauscht und die Heap-Array-Größe um 1 verringert, ohne den Speicher freizugeben. Die neue Wurzel des Heaps kann die Heap-Eigenschaft verletzen. Die Heapify-Operation korrigiert gegebenenfalls den Heap, so dass nun das nächstgrößere bzw. gleich große Element an der ersten Array-Position steht. Die Vertausch-, Verkleiner- und Heapify-Schritte werden so lange wiederholt, bis die Heap-Größe 1 ist. Danach enthält das Eingabe-Array die Elemente in aufsteigend sortierter Reihenfolge.
Was ist der Aufwand bei HeapSort?
Aufwand besteht im Wesentlichen aus 2 Teilen:
Aufbau des Heaps
–Durchsickern von \(\frac{n}{2}\) Elemente entlang eines Pfades im Baum. Pfad ist im ungünstigsten Fall Höhe des Baums \(\log_2n\).
–Somit insgesamt: \(\frac{n}{2} \cdot \log_2n\)
Entfernen der Elemente zur eigentlichen Sortierung
–Entfernen aller \(n\) Elemente und wiederherstellen der Heap-Eigenschaft durch „durchsickern“ im Pfad
–Insgesamt: \(n \cdot \log_2n\)
Gesamtaufwand
\(\frac{3n}{2} \cdot \log_2n\), somit \(\mathcal{O}(n \cdot \log_2n)\)
Im durchschnittlichen Fall wie MergeSortund QuickSort Aber auch im schlechtesten Fall \(\mathcal{O}(n \cdot \log_2n)\)!
Welche Bäume erfüllen die Binärbaumeigenschaften?
HeapSort vs. QuickSort? (Vergleich)
- QuickSort und HeapSort haben ähnliche Laufzeitkomplexität (meist \(\mathcal{O}(n \ \log_2 n)\))
- QuickSort ist in der Praxis meist etwas schneller als HeapSort, im schlechtesten Fall jedoch \(\mathcal{O}(n^2)\)
- Dieser „schlechteste Fall“ tritt nur selten auf, doch kann er z.B. in laufzeitkritischen Systemen ein Argument für HeapSort sein
HeapSort vs. MergeSort? (Vergleich)
- HeapSort = in-place <-> MergeSort = out-of-place (normalerweise)
- HeapSort = instabil <-> MergeSort = stabil
- MergeSort kann leichter parallelisiert werden
- MergeSort eignet sich gut für externes Sortieren (ursprüngliche Motivation)
Knotenliste vs. Katenliste? (Vergleich)
Knotenlisten benötigen weniger Speicherplatz als Kantenlisten
- Kantenlisten: 2 + 2 · lE l
- Knotenlisten: 2 + lV l + lE l
… haben dafür aber eine höhere Zeitkomplexität
Was ist eine Adjazenzmatrix?
Adjazenz bedeutet berühren oder aneinander grenzen. Einträge werden für direkte Nachbarschaften verwendet. A ist eine Adjazenzmatrix für den Graph \(G=(V,E): (A_{ij})=\psi~genau~dann~wenn~(i,j) \in E\)
\(A=\begin{pmatrix} 0 & 0 & 12 & 60 & 0\\ 10 & 0 & 0 & 0 & 0\\ 0 & 20 & 0 & 32 & 0\\ 0 & 0 & 0 & 0 & 0\\ 7 & 0 & 0 & 0 & 0\\ \end{pmatrix}\)
Was ist eine Adjazenzliste?
Die Adjazenzliste (oder auch Nachbarschaftsliste) ist eine Möglichkeit, Graphen im Computer zu speichern. Sie wird in ihrer einfachsten Form durch eine einfach verkettete Liste aller Knoten des Graphen dargestellt, wobei jeder Knoten eine Liste aller seiner Nachbarn (in ungerichteten Graphen) bzw. Nachfolger (in gerichteten Graphen) besitzt.
Komplexitätstabelle von Graphenrepräsentationen?
\(\begin{matrix} \underline{Operation} & \underline{Kantenliste} & \underline{Knotenliste} & \underline{Adjazenzmatrix} & \underline{Adjazenzliste}\\ \textbf{Einfügen Kanten} & \mathcal{O}(1) & \mathcal{O}(n+m) & \mathcal{O}(1) & \mathcal{O}(1)/\mathcal{O}(n) \\ \textbf{Löschen von Kanten} & \mathcal{O}(m) & \mathcal{O}(n+m) & \mathcal{O}(1) & \mathcal{O}(n) \\ \textbf{Einfügen Knoten} & \mathcal{O}(1) & \mathcal{O}(1) & \mathcal{O}(n^2) & \mathcal{O}(1) \\ \textbf{Löschen Knoten} & \mathcal{O}(m) & \mathcal{O}(n+m) & \mathcal{O}(n^2) & \mathcal{O}(n+m) \\ \end{matrix} \)
Was ist ein Eulerscher Weg?
Ein Weg (u0,u1,...,uk) heißt Eulerscher Weg, wenn jede Kante des
Graphen genau einmal in seinem Pfad vorkommt.
Er heißt Eulerscher Kreis, wenn zusätzlich uk=u0 ist.
Wann hat ein Graph keinen Eulerkreis?
Wenn es Knoten mit ungeradem Ausgangsgrad gibt.
Algorithmus für die Breitensuche bei Graphen?
Realisierung für ungerichteteGraphen:
1.Bestimme den Knoten, an dem die Suche beginnen soll, und speichere ihn in einer Warteschlange (Queue)
2.Entnimm einen Knoten vom Beginn der Warteschlange und markiere ihn.
Falls das gesuchte Element gefunden wurde, brich die Suche ab und liefere „gefunden“ zurück.
Anderenfalls hänge alle bisher unmarkierten Nachfolger dieses Knotens, die sich noch nicht in der Warteschlange befinden, ans Ende der Warteschlange an.
3.Wenn die Warteschlange leer ist, dann wurde jeder Knoten bereits untersucht. Beende die Suche und liefere „nicht gefunden“ zurück.
4.Wiederhole Schritt 2.
Algorithmus zur Tiefensuche in Graphen?
1.Bestimme den Knoten, an dem die Suche beginnen soll
2.Speichere den kleinsten/größten (optional) alle noch nicht erschlossenen Nachfolger in einem Stack
3.Rufe rekursiv für jeden der Knoten im Stack die Tiefensuche auf
- Falls der Stack leer sein sollte, liefere „nicht gefunden“ zurück
- Falls es keine nicht erschlossenen Nachfolger mehr gibt, lösche den obersten Knoten aus dem Stackund rufe für den jetzt oberen Knoten im Stack die Tiefensuche auf
- Falls das gesuchte Element gefunden wurde, brich die Suche ab und liefere ein Ergebnis
Was ist topologische Sortierung?
Eine Sortierung, bei der Abhängigkeiten benutzt werden. Zuerst wird ein beliebiger Knoten ohne Vorgänger gewählt und entfernt (in ein Sortierfeld geschrieben). Dadurch ändern sich auch die Vorgängerzahlen ander Elemente (um -1) und es entstehen neue Elemente ohne Vorgänger, die entfernt werden können. Hat man alle Elemente entfernt, bildet das Sortierfeld die Topologische Sortierung.
Ungerichtete und zyklische Graphen sind nicht topologisch sortierbar!
Was ist der Dijkstra-Algorithmus?
Berechnet kürzesten Pfad von einem Startknoten zu allen anderen
Grundidee: folge immer derjenigen Kante, die den kürzesten
Streckenabschnitt vom Startknoten aus verspricht iterative Erweiterung einer Menge von „billig“erreichbaren Knoten
Greedy-Algorithmus
- ähnlich Breitensuche nur für nichtnegative Gewichte
- berechnet (iterativ verfeinernd) Distanzwerte D
- Prioritätswarteschlange zum Herauslesen des jeweils minimalen Elements
Was ist der A*-Algorithmus?
Kostenwerte für Knoten u:
g(u): Bisherige Kosten vom Startknoten bis u h(u): Geschätzte Kosten von u bis zum Ziel f(u): Kosten vom Start zum Ziel über u: f(u) = g(u) + h(u) Knoten werden in 3 Gruppen eingeteilt:
OPEN: Alle Knoten, zu denen ein Weg gefunden wurde (dieser ist nicht notwendigerweise optimal). Speichere f-Wert für jeden Knoten.
Im nächsten Schritt wird der Knoten mit dem kleinsten f-Wert entnommen.
CLOSED: Alle Knoten, zu denen der kürzeste Weg bekannt ist.
Alle anderen Knoten: noch gar nicht betrachtet
Was ist ein Nachtteil bei Dijkstra und A*?
Negative Kantengewichte sind nicht zugelassen. Lösung: Bellman-Ford-Algorithmus.
Was ist der Bellman-Ford-Algorithmus?
Der Bellmann-Ford-Algorithmus berechnet den kürzesten Weg in einem kantengewichteten Graphen, ausgehend von einem Startknoten. Anders als bei Dijkstra und A* sind auch negative Kantengewichte zulässig, jedoch keine negativen Zyklen!
Setze alle Knoten bis auf den Startknoten auf unendlich. Ausgehend vom Startknoten berechne den Weg zu den Nachfolgeknoten (alle erreichbaren). Wenn der errechnete Weg kleiner als der schon in Erfahrung gemachte Weg (am Anfang unendlich), dann aktualisiere.
Der Algorithmus erforderte mehrere Durchläufe.
Was ist der Algorithmus von Kruskal?
Der Algorithmus von Kruskal ist ein Greedy-Algorithmus der Graphentheorie zur Berechnung minimaler Spannbäume von ungerichteten Graphen. Der Graph muss dazu zusätzlich zusammenhängend, kantengewichtet und endlich sein.
1. Erstelle eine Liste mit allen Kantengewichten sortiert nach Gewicht.
2. Markiere die Kanten mit den niedrigen Gewichten zuerst und prüfe, ob es einen Zyklus gibt. Falls ja, dann streiche diese Kante.
3. Fahre mit der nächst höheren Kante fort.
Was ist der Algorithmus von Ford-Fulkerson?
Der Algorithmus von Ford-Fulkerson berechnet den maximalen Durchfluß in einem gerichteten und gewichteten Graphen bei gegebenem Start- und Endpunkt.
1. Wähle einen Pfad vom Start zum Ziel.
2. Entnimm diesem Pfad den minimalen Durchfluß und ändere alle Kantengewichte dahingehend (Kantengewicht - minimalen Durchfluß)
3. Zeichne die Rückrichtungen mit dem Kantengewicht des Minimalen Durchflußes. Dadurch entstehen neue Kanten.
4. Fahre fort bis keine Pfad mehr möglich.
Was ist der Brute-Force-Algorithmus?
Intuitive Idee:
• Muster von links nach rechts über Text schieben und
jeweils „übereinander liegende“ Zeichen vergleichen
• Muster eine Position nach rechts verschieben,
sobald Abweichung
• Abbruch, wenn kompletter Match
Notation von Reguläre Ausdrücke?
- ab: a gefolgt von b (Konkatenation)
- a|b: a oder b (Disjunktion)
- . : beliebiger Buchstabe (Wildcard)
- a* : beliebige Anzahl von a
- a+ : beliebige Anzahl größer 0 von a (mindestens einmal)
- a? : genau 0 oder 1 mal a
- [abc] : irgend ein Buchstabe der Aufzählung
- ^ und $ : Spezialzeichen für Zeilenbeginn und Zeilenende
- ( ) : Gruppierung