Algorithmen, Graphen, dynamische Programmierung und relationale Datenbanken
32 Karten zur Wiederholung auf Hochschulniveau: Sortieren, Graphalgorithmen, dynamische Programmierung, SQL, Indizes und Transaktionen. Grundkenntnisse in Programmierung, Datenstrukturen und SQL werden vorausgesetzt.
- Level
- basic
- Languages
- de → de
- Cards
- 32
- Markdown
- Algorithmen, Graphen, dynamische Programmierung und relationale Datenbanken (.md)
Flashcards (32)
| # | Front (Term / Question) | Back (Definition / Answer) | Example | Multiple-Choice Options |
|---|---|---|---|---|
| 1 | Warum eignen sich B+-Bäume für Datenbankindizes und Bereichsabfragen? | Ihr hoher Verzweigungsgrad hält die Höhe gering und reduziert Seitenzugriffe. Geordnete Schlüssel und verkettete Blätter erlauben Bereichsdurchläufe. Hash-Indizes zielen auf Gleichheitssuchen und bieten nicht von sich aus denselben geordneten Bereichszugriff. | ||
| 2 | Was ist eine topologische Ordnung, und wie bestimmt Kahns Algorithmus sie? | In einem DAG steht für jede Kante u→v der Knoten u vor v. Wiederholt wird ein Knoten mit Eingangsgrad null ausgegeben; seine ausgehenden Kanten werden entfernt und neue Knoten mit Eingangsgrad null eingereiht. Werden weniger als V Knoten ausgegeben, liegt ein Zyklus vor. | ||
| 3 | Wie lautet die Standardrekurrenz des 0/1-Rucksackproblems mit ganzzahliger Kapazität W? | D[i,w] ist der beste Wert mit den ersten i Objekten bei Kapazität w und positiven ganzzahligen Gewichten wᵢ. D[0,w]=0. Für wᵢ>w gilt D[i,w]=D[i−1,w], sonst max(D[i−1,w],vᵢ+D[i−1,w−wᵢ]). Die Laufzeit O(NW) ist pseudopolynomiell. | ||
| 4 | Wie unterscheidet sich ein Greedy-Algorithmus von dynamischer Programmierung? | Greedy legt sich auf eine lokale Wahl fest und braucht einen Beweis, dass solche Entscheidungen ein Optimum erhalten. Dynamische Programmierung vergleicht Alternativen mittels Rekurrenz und nutzt Teilergebnisse erneut. Ein globales Optimum erfordert ein korrektes Modell und eine korrekte Rekurrenz, nicht bloß die Bezeichnung „DP“. | ||
| 5 | Wie findet Breitensuche kürzeste Wege in einem ungewichteten Graphen? | BFS nutzt eine FIFO-Warteschlange und besucht Knoten nach ihrer Entfernung in Kanten. Markierung beim Einreihen verhindert wiederholte Besuche. Der zuerst gefundene Weg zu einem erreichbaren Knoten enthält möglichst wenige Kanten. | ||
| 6 | Warum ist dynamische Programmierung für viele Optimierungsprobleme nützlich? | Optimale Teilstruktur erlaubt, ein Optimum durch Optima von Teilproblemen auszudrücken. Überlappen diese, vermeidet das Speichern ihrer Lösungen wiederholte Arbeit. Zustände und Rekurrenz müssen das Ausgangsproblem korrekt modellieren. | ||
| 7 | Wie arbeitet gewöhnlicher Merge Sort für Arrays, und welche Kosten hat er? | Er sortiert zwei Hälften rekursiv und vereinigt sie in linearer Zeit. Die Standardvariante benötigt Θ(n log n) Zeit und O(n) Zusatzspeicher, sofern Vergleiche konstante Zeit benötigen. | ||
| 8 | Was ist ein Phantom Read, und wie wird er verhindert? | Eine wiederholte Prädikatsabfrage findet nach bestätigten Änderungen einer anderen Transaktion eine andere Menge passender Zeilen. SERIALIZABLE verhindert dies im Standardmodell; manche Implementierungen, darunter PostgreSQL REPEATABLE READ, verhindern es auch auf einer niedrigeren Stufe. | ||
| 9 | Wie behandelt Bellman–Ford negative Kanten und erkennt erreichbare negative Zyklen? | Alle Kanten werden bis zu V−1-mal relaxiert. Eine weitere Verbesserung von einem erreichbaren Knoten aus zeigt einen von der Quelle erreichbaren negativen Zyklus. Die Worst-Case-Zeit ist O(VE); von diesem Zyklus erreichbare Knoten haben keine endlichen minimalen Wegkosten. | ||
| 10 | Wie sichert PostgreSQL WAL bei normalem synchronem Commit die Dauerhaftigkeit? | Die relevanten Logeinträge werden dauerhaft gespeichert, bevor der Commit bestätigt und bevor geänderte Datenseiten geschrieben werden. Nach einem Absturz kann WAL fehlende Seitenänderungen wiederholen. Asynchroner Commit kann kürzlich bestätigte Transaktionen verlieren. | ||
| 11 | Was setzt binäre Suche voraus, und wann benötigt sie O(log n) Zeit? | Sie halbiert wiederholt das Suchintervall in Daten, die gemäß der Vergleichsordnung sortiert sind. Bei einem Array mit Indexzugriff in O(1) und Vergleichen in konstanter Zeit kostet die Suche unter n Elementen O(log n). | ||
| 12 | Wie erzeugen Kruskal und Prim einen minimalen Spannbaum? | Für einen zusammenhängenden ungerichteten gewichteten Graphen betrachtet Kruskal Kanten nach steigendem Gewicht und verwirft mit Union–Find Zyklen. Prim erweitert einen Baum jeweils um eine leichteste Kante vom Baum zu einem außerhalb liegenden Knoten. | ||
| 13 | Was ist ein nicht wiederholbares Lesen, und welche Standardstufe verhindert es? | Beim erneuten Lesen ist eine Zeile verändert oder verschwunden, nachdem eine andere Transaktion eine Änderung oder Löschung bestätigt hat. REPEATABLE READ und SERIALIZABLE verhindern diese Anomalie. | ||
| 14 | Welche Laufzeit im schlechtesten Fall und welchen Zusatzspeicher benötigt In-place-Heapsort? | Der Heapaufbau kostet O(n), die anschließenden Entnahmen zusammen O(n log n). Mit iterativem Absinken im Eingabearray benötigt Heapsort im schlechtesten Fall O(n log n) Zeit und O(1) Zusatzspeicher. | ||
| 15 | Wie sieht eine vereinfachte logische Reihenfolge einer SQL-SELECT-Abfrage aus? | Ohne CTEs, Fensterfunktionen und Mengenoperationen: FROM/JOIN → WHERE → GROUP BY und Aggregate → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFFSET. Dies ist ein logisches Modell, nicht unbedingt die physische Ausführungsreihenfolge des Optimierers. | ||
| 16 | Wie unterscheiden sich gruppierte und nicht gruppierte Rowstore-Indizes in SQL Server? | Ein gruppierter Index speichert Tabellenzeilen in Schlüsselreihenfolge; pro Tabelle gibt es höchstens einen. Ein nicht gruppierter Index hat eigene Schlüssel und Zeilenverweise und kann weitere Spalten enthalten. Begriffe und Speicherungsdetails unterscheiden sich zwischen Datenbanksystemen. | ||
| 17 | Wie arbeitet Insertion Sort, und wovon hängt die Laufzeit bei fast sortierten Daten ab? | Jedes Element wird in ein sortiertes Präfix eingefügt. Die übliche Variante mit benachbarten Verschiebungen oder Vertauschungen benötigt Θ(n+I), wobei I die Zahl der Inversionen ist. Bei I=O(n) ist sie linear; eine kleine Eingabe ändert den schlechtesten Fall Θ(n²) nicht. | ||
| 18 | Wie erkennt Tiefensuche einen Zyklus in einem gerichteten Graphen? | DFS geht mit Rekursion oder explizitem Stapel in die Tiefe. Eine Kante zu einem noch aktiven Knoten des aktuellen DFS-Pfads ist eine Rückkante und belegt einen gerichteten Zyklus. Ein bloß schon besuchter Zielknoten reicht nicht aus. | ||
| 19 | Warum kann Quicksort Θ(n²) Zeit benötigen, und wie hilft Zufallsauswahl? | Wiederholt stark ungleiche Partitionen, etwa durch stets kleinste Pivots bei verschiedenen Schlüsseln, erzeugen quadratischen Aufwand. Bei verschiedenen Schlüsseln oder geeigneter Behandlung gleicher Schlüssel liefern zufällige Pivots erwartete O(n log n) Zeit. Median-of-three ist eine Heuristik, keine Garantie für den schlechtesten Fall. | ||
| 20 | Was ist ein Dirty Read, und welche Standardisolationsstufe verhindert ihn zuerst? | Das Lesen noch nicht bestätigter Daten einer anderen Transaktion, unabhängig von einem späteren Rollback. READ COMMITTED und höhere Standardisolationsstufen verhindern Dirty Reads. | ||
| 21 | Wie unterscheiden sich Memoisierung und dynamische Programmierung von unten nach oben? | Memoisierung löst Teilprobleme bei Bedarf, meist rekursiv, und speichert Ergebnisse. Die Bottom-up-Methode berechnet Zustände in einer Reihenfolge, in der deren Abhängigkeiten bereits vorliegen, meist durch Füllen einer Tabelle. | ||
| 22 | Wie unterscheiden sich WHERE und HAVING in einer gruppierten Abfrage? | WHERE filtert Eingabezeilen vor der Gruppierung. HAVING filtert die entstandenen Gruppen und erlaubt Aggregatbedingungen wie COUNT(*)>1. | ||
| 23 | Wie unterscheiden sich INNER JOIN und LEFT JOIN? | INNER JOIN liefert Zeilenkombinationen, welche die Join-Bedingung erfüllen. LEFT JOIN erhält außerdem jede nicht passende linke Zeile mit NULL in den rechten Spalten. Mehrere rechte Treffer können mehrere Ausgabezeilen je linker Zeile erzeugen. | ||
| 24 | Was bedeuten die ACID-Eigenschaften von Transaktionen? | Atomarität: alle Wirkungen oder keine. Konsistenz: korrekte Transaktionen erhalten Constraints und Anwendungsinvarianten. Isolation: Nebenläufigkeit folgt der gewählten Isolationsstufe. Dauerhaftigkeit: bestätigte Wirkungen überstehen die durch konfigurierte Garantien abgedeckten Ausfälle. | ||
| 25 | Was bedeutet Stabilität bei einem Sortierverfahren? | Elemente mit gleichem Schlüssel behalten ihre ursprüngliche relative Reihenfolge. Merge Sort ist bei bevorzugter Übernahme von links im Gleichheitsfall stabil; gewöhnlicher In-place-Quicksort ist meist instabil. Stabilität hängt von der Implementierung ab. | ||
| 26 | Wie lautet die Rekurrenz für die Länge einer längsten gemeinsamen Teilsequenz (LCS)? | L[i,j] bezeichnet die LCS-Länge von Präfixen der Längen i,j. L[0,j]=L[i,0]=0. Bei gleichen letzten Zeichen gilt L[i,j]=1+L[i−1,j−1], sonst L[i,j]=max(L[i−1,j],L[i,j−1]). Die vollständige Tabelle kostet O(mn) Zeit und Speicher. | ||
| 27 | Wann ist Dijkstras Algorithmus korrekt, und welche übliche Heap-Laufzeit gilt? | Bei nichtnegativen Kantengewichten legt er jeweils den Knoten mit kleinster vorläufiger Distanz fest. Mit Adjazenzlisten und binärem Min-Heap benötigt er O((V+E) log V). Negative Kanten können die Begründung endgültiger Distanzen ungültig machen. | ||
| 28 | Was fordern erste, zweite und dritte Normalform? | 1NF: atomare Attributwerte. 2NF: 1NF und kein Nichtschlüsselattribut hängt von einem echten Teil irgendeines Kandidatenschlüssels ab. 3NF: 1NF und bei jeder nichttrivialen Abhängigkeit X→A ist X Superschlüssel oder A prim. Ein primes Attribut gehört zu mindestens einem Kandidatenschlüssel. | ||
| 29 | Wann können Counting Sort oder Radix Sort linear laufen? | Counting Sort kostet O(n+k) für n Schlüssel aus k möglichen Werten. Radix Sort mit d stabilen Zifferndurchläufen zur Basis b kostet O(d(n+b)). Linearität hängt von diesen Parametern ab; beide nutzen die Schlüsselstruktur über Vergleiche hinaus. | ||
| 30 | Wie unterscheiden sich Adjazenzmatrix und gewöhnliche Adjazenzlisten? | Bei V Knoten und E Kanten benötigt eine Matrix O(V²) Speicher und prüft eine Kante in O(1). Listen benötigen O(V+E); die Suche nach (u,v) in einer unsortierten Liste kostet O(deg(u)), wobei deg(u) ihre Länge bezeichnet. | ||
| 31 | Wie unterscheiden sich Primär- und Fremdschlüssel in PostgreSQL? | Ein Primärschlüssel identifiziert Zeilen durch eindeutige Nicht-NULL-Werte. Ein Fremdschlüssel verlangt passende referenzierte Schlüsselwerte gemäß seinen NULL-Regeln. Er kann auf einen geeigneten UNIQUE-Schlüssel oder Primärschlüssel derselben oder einer anderen Tabelle verweisen. | ||
| 32 | Welche zwei Phasen hat das Zwei-Phasen-Sperrprotokoll (2PL)? | Wachstum: Sperren erwerben, ohne welche freizugeben. Schrumpfung: Sperren freigeben, ohne neue zu erwerben. Mit geeigneten Sperren für konfliktierende Lese- und Schreibzugriffe garantiert 2PL konfliktserialisierbare Abläufe; Deadlocks bleiben möglich. |