Algorithmen und Datenstrukturen Flashcards

1
Q

Was ist Komplexität? Wofür und warum wird Komplexität verwendet?

A

Die Komplexität eines Computerprogramms beschreibt, wie lange dieses Programm für die Durchführung braucht. Komplexität wird beispielsweise verwendet, um Algorithmen einen Wert zuzuteilen, der die Effizienz des Algorithmus’ bewertet. Diese Wertzuteilung macht man, da Computer unterschiedlich schnell sind, also verwendet man eine standardisierte Weise, um die Laufzeit zu bemessen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Was sind die Landau-Symbole? Benenne und beschreibe diese.

A

Big-O: ist der “schlimmste” Fall, also das Maximum, was an Komplexität erreicht werden kann - ab n0 gilt, dass die Funktion immer unter der Big-O Schwelle liegt

Ω: entspricht dem Minimum, ab n0 gilt, dass die Funktion über der Ω-Schwelle liegt

θ: ist die Mischform aus Big-O und Omega - ab n0 ist die Funktion nach oben und nach unten hin gedeckelt

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Was ist Rekursion? Nenne ein Beispiel, wo Rekursionen gut wären.

A

Eine Rekursion ist eine Funktion, die sich selbst wieder aufruft - dabei muss eine Abbruchbedingung enthalten sein, damit es nicht zu einem Infinite-Loop kommt –> ein Beispiel für eine Rekursion wäre die Fibonacci-Folge, wo sich die nächste Zahl immer aus der Summe der beiden Vorgänger berechnen lässt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Datenstruktur: Was ist ein Stack?

A

Ein Stack basiert auf dem LIFO-Prinzip - last-in first-out, was so viel bedeutet wie, dass zuletzt eingefügte Elemente auch zuerst wieder vom Stack genommen werden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Datenstruktur: Was ist ein Heap? Welche Varianten von Heap gibt es? Welche essentiellen Methoden werden zur Erhaltung der Heap-Eigenschaften verwendet?

A

Ein Heap basiert auf der Baum-Datenstruktur, wo Elemente abgespeichert werden - es gibt einen Min-Heap und einen Max-Heap. Beim Min-Heap ist die Wurzel des Baums das kleinste Element, wobei auch die Eltern eines Knoten immer kleiner gleich der Knoten selbst sind. Beim Max-Heap ist diese Reihenfolge umgekehrt, sodass die Wurzel des Max-Heaps immer die größte Zahl ist und die Elternknoten immer größer gleich der Kinder sind.

Methoden:
Min/Max-Heapify: stellt die Heap-Eigenschaften wieder her, indem größere / kleinere Schlüssel nach unten geschoben werden
ExtractMin/Max: nimmt kleinstes / größtes Element (Wurzel), platziert den letzten Knoten als neue Wurzel und führt dann Min/Max-Heapify aus
Decrease/IncreaseKey: Wenn der Elternknoten größer / kleiner ist, wird die Reihenfolge getauscht und das solange, bis die Heap-Eigenschaften wieder hergestellt sind
Einfügen: Neues Element ans Ende einfügen, dann Decrease/IncreaseKey ausführen

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Datenstruktur: Was sind Listen? Was unterscheidet diese Datenstruktur von Arrays?

A

Listen sind eine Datenstruktur, die wie Arrays verwendet werden, nur mit einer Logik dahinter: Arrays haben eine fixe und nicht veränderbare Größe und liegen direkt hintereinander im Speicher, was das Anpassen der Arraygröße aufwändiger macht - Listen können beliebig größer und kleiner gemacht werden von der Länge und die Elemente liegen deswegen auch verteilt im Speicher.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Datenstruktur: Was ist eine verkettete Liste? Was ist eine doppelt verkettete Liste?

A

Eine verkettete Liste ist eine normale Liste, die zwei Pointer enthält: einen Head, der als Einstiegspunkt dient und einen Tail, der das letzte Element repräsentiert. Die einzelnen Elemente in einer verketteten Liste zeigen immer auf das jeweils darauffolgende Element.

Eine doppelt-verkettete Liste hat zusätzlich zur verketteten Liste noch die Eigenschaft, dass jedes Element einen Verweis auf den Vorgänger als auch Nachgänger hat, was das Löschen von Elementen in der Liste vereinfacht.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Algorithmus: Beschreibe den Insertion Sort Algorithmus. Welche Komplexität weist dieser auf?

A

Der Insertion-Sort Algorithmus basiert auf derselben Logik, wie das Einsortieren von Spielkarten. Man nimmt eine Karte vom Stapel und legt diese ganz rechts in die Kartenhand hin, man geht dann so lange nach links, bis man die richtige Position für die Karte gefunden hat. Das Element ganz links ist immer sortiert.

Komplexität: Big-O (n²)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Was ist ein Divide-and-Conquer Algorithmus?

A

Bei einem Divide-and-Conquer Algorithmus wird zuerst die Aufgabe aufgeteilt (Divide), über diese wird dann geherrscht (Conquer) und am Ende kommt dann oft noch der Combine-Step dazu, wo die aufgeteilten Aufgaben wieder zusammengefügt werden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Algorithmus: Beschreibe den Merge Sort Algorithmus. Welche Komplexität weist dieser auf?

A

Der Merge-Sort Algorithmus gehört zu den Divide-and-Conquer Algorithmen
Divide: Teile Array in zwei gleich große Hälften (Index der Mitte wird dem Merge Sort übergeben)
Conquer: (Rekursion) führe Merge Sort auf beide Teilarrays aus
Combine: füge die Teilarrays wieder zusammen

DIe Abbruchbedingung für die Rekursion ist, wenn der linke Index größer gleich dem rechten Index ist, also wenn das Array nur mehr ein Element enthält.
Beim Mergen schaut man sich von den Teilarrays immer das Element an der linken Stelle an und vergleicht diese - ist das linkste Element von Array A kleiner als das linkste Element von Array B, so nimmt man das Element von Array A und erhöht den “Links-Pointer” um 1, dann macht man diesen Algorithmus weiter bis man alle Teilarrays durchgegangen ist und am Ende dann ein Sortiertes Array entsteht.

Komplexität: Big-O (n log n)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Algorithmus: Beschreibe den Quick Sort Algorithmus. Welche Komplexität weist dieser auf?

A

Der Quick-Sort Algorithmus gehört zu den Divide-and-Conquer Algorithmen.
Divide: Wähle Pivot und Teile Array anhand dessen in 2 - alles kleiner gleich Pivot ist im 1. Array, alles größer Pivot ist im 2. Array
Conquer: (Rekursion) führe Quick Sort auf beide Teilarrays aus
Combine: Nicht notwendig, da Teilarrays schon sortiert sind

Bei der Partitionierung geschieht folgendes: Das Pivot-Element startet immer an der rechten Stelle des Arrays, der pivot selbst ganz links bei left - 1. Wenn das Element, wo der Pivot derzeit ist, kleiner als das Pivot-Element ist, wird der pivot um 1 erhöht und die Elemente, wo die derzeitige Loop ist, ausgetauscht, bis man am Ende der Loop angelangt, wo man dann das Pivot-Element an die Stelle setzt, wo sich der Pivot gerade befindet.

Komplexität:
Best Case (Durchschnittsfall): Big-O (n log n)
Worst Case: Big-O (n²) - wenn die Liste schon sortiert ist

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Datenstruktur: Was ist ein Baum? Welche Elemente beinhaltet dieser?

A

Ein Baum ist eine Datenstruktur für hierarchische Daten, dieser kann unendlich viele Kinder haben und beinhaltet folgende Elemente:

Wurzelknoten
Jeder Knoten hat Kinder
Beziehung zwischen Knoten werden über Kanten dargestellt
Knoten mit denselben Elternknoten werden Geschwister genannt
Knoten ohne Kinder sind Blätter
Höhe eines Baums entspricht der Anzahl der Ebenen

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Mit welchem Algorithmus können Bäume traversiert werden? Beschreibe den Algorithmus kurz.

A

In-Order-Tree-Walk - bei diesem Algorithmus geht man rekursiv durch alle Kinder durch (zuerst links, beim Heraufgehen dann rechts), bis man einen Nullknoten erreicht (Abbruchbedingung)

Komplexität: Big-O (n)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Datenstruktur: Was ist ein Binärer Suchbaum?

A

Ein binärer Suchbaum ist ein Baum, wo die Knoten nur maximal zwei Kinder haben kann, ein linkes und ein rechtes Kind - wobei das linke Kind immer kleiner ist als der Schlüssel selbst und das rechte Kind größer gleich dem Knoten ist.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Wie funktioniert das Einfügen von Elementen in einem Binären Suchbaum?

A

Der Baum wird solange abgestiegen (mit Schlüssel-Checks für die Richtung), bis null gefunden wird (also ein leeres Kind), wo dann das neue Objekt (Key) erzeugt wird

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Wie funktioniert das Löschen von Knoten in einem Binären Suchbaum?

A

Es wird der Nachfolger des zu-löschenden Elements ermittelt - wenn der Knoten einen rechten Teilbaum hat, ist der Nachfolger das Minimum von diesem Teilbaum, ansonsten wird solange aus dem Baum aufgestiegen, bis man aus einem linken Teilbaum kommt.
Beim Minimum wird der Baum so lange abgestiegen, bis ein Element gefunden worden ist, das keinen linken Teilbaum hat.

Beim Löschen kann es zu vier verschiedenen Fällen kommen:
1) Knoten hat keine Kinder - dann wird der Knoten einfach gelöscht
2) Knoten hat nur ein Kind - dann wird das Kind nach oben geschoben und der Knoten gelöscht
3) Knoten hat zwei Kinder, der Nachfolger ist das rechte Kind - Nachfolger wird an Stelle des gelöschten Knotens gesetzt
4) Knoten hat zwei Kinder, aber Nachfolger ist irgendwo im Teilbaum - der zu löschende Knoten und der linke Teilbaum werden aufgeteilt, Nachfolger wird an Stelle des zu löschenden Knotens gesetzt, Knoten wird gelöscht und Teilbaum wieder angehängt

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Datenstruktur: Was ist ein AVL-Baum?

A

Ein binärer Suchbaum, der balanciert ist - der Höhenunterschied vom linken und rechten Teilbaum ist höchstens 1, ansonsten wird dieser rebalanciert an hand des Balancierungsfaktors

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Was ist der große Vorteil von AVL-Bäumen?

A

Die Höhe des Baums ist immer auf Höhe von log n beschränkt (schnelle Operationen)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Wie funktioniert das Einfügen von Elementen in einem AVL-Baum?

A

Das Einfügen funktioniert normal wie bei einem binären Suchbaum, nur, dass danach auf Rebalancierungen gecheckt werden muss

20
Q

Wie funktioniert das Rebalancieren in einem AVL-Baum?

A

Wenn der Höhenunterschied im Baum größer als 1 ist, muss der Baum rebalanciert werden - das bedeutet, dass der AVL-Baum “gedreht” werden muss, um seine Eigenschaften wiederherzustellen. Dabei gibt es verschiedene Fälle, die auftreten können:

1) Rechter Kind vom rechten Teilbaum ist zu tief: Es findet eine Linksrotation statt
2) Linkes Unterkind vom rechten Teilbaum ist zu tief: Rechts-Linksrotation
3) Rechtes Unterkind vom rechten Teilbaum ist zu tief: Rechts-Linksrotation

21
Q

Wie funktioniert das Löschen von Knoten in einem AVL-Baum?

A

Der Löschvorgang ist wie beim normalen binären Suchbaum, nur, dass eine Rebalancierung zur Wurzel gestartet werden muss beim…

Elternknoten, wenn gelöschter Knoten kein oder ein Kind hatte
Elternknoten des Nachfolgers, falls Knoten zwei Kinder hatte

22
Q

Datenstruktur: Was sind Hashtabellen? Wie funktionieren diese?

A

Hashtabellen werden genutzt, um große Eingabemengen auf kleine Zielmengen abzubilden - Elemente werden nach ihrem Hashwert in eine Tabelle eingefügt, wo der Zugriff auf diese in Theta (1) erfolgt, indem der Hashwert des gesuchten Elements erneut berechnet wird. Wichtig beim Abbilden der Werte sind vor allem Kollisionen (also wenn zwei Objekte den selben Hashwert haben) –> die Hashfunktion ist essentiell.

23
Q

Wie werden Daten in einer Hashtabelle intern gehandhabt? Wie funktioniert das Einfügen / Suchen / Löschen von Elementen?

A

In der Hashtabelle liegt ein Array von doppelt verketteten Liste (Bins), wo der Zugriff jeweils über den Hashwert erfolgt - um das Theta (1) Verhalten einer Hashtabelle zu gewährleisten, dürfen in den bins nicht zu viele Elemente liegen und der LoadThreshold nicht überschritten werden, ansonsten muss reorganisiert werden, was eine sehr kostbare Funktion ist.

24
Q

Datenstruktur: Was ist ein Graph? Woraus besteht dieser?

A

Ein Graph ist “eine Verknüpfung von Dingen” - dieser kann verschiedene Elemente (Knoten) enthalten, die miteinander verbunden sind (Kanten)

25
Q

Welche Arten von Graphen gibt es?

A

Ungerichtete Graphen
Gerichtete Graphen
Ungewichtete Graphen
Gewichtete Graphen

26
Q

In welchen Datenstrukturen werden Graphen gespeichert?

A

Entweder in Adjazenzmatrizen, oder Adjazenzlisten.

27
Q

Algorithmus: Wie funktioniert die Breitensuche?

A

Jeder Knoten wird einmal, keiner doppelt besucht - man startet bei einem beliebigen Knoten, von diesem Knoten aus besucht man alle Nachbarn, dann geht man zu einem der Nachbarn und schaut sich bei diesem alle unbesuchten Nachbarn an, bis jeder Knoten einmal besucht worden ist

28
Q

Algorithmus: Wie funktioniert die Tiefensuche?

A

Die Tiefensuche arbeitet mit Knotenfarben - zu Beginn werden alle Knoten weiß markiert, wenn ein Knoten besucht wird, wird dieser grau markiert und es werden rekursiv alle unbesuchten Nachbarn besucht - wenn man aus der Rekursion herauskommt und diese damit abgeschlossen hat, wird der derzeitige Knoten schwarz markiert

29
Q

Was sind Disjunkte Mengen?

A

Mengen, wo kein Element in mehreren Mengen vorkommt

30
Q

Datenstruktur: Wie funktioniert Union Find?

A

Es wird eine Liste für jede Menge geführt, wobei jede Liste einen Repräsentanten hat - wenn ein Repräsentant einer Menge gleich ist, handelt es sich um die gleiche Menge

31
Q

Welche Operationen beinhaltet Union Find?

A

MakeSet - erzeugt eine Menge für ein Element
Find - Findet den Repräsentanten eines Elements
Union - es werden zwei Mengen vereint (kürzere Menge an längere gehängt)

32
Q

Datenstruktur: Was sind Spannbäume?

A

Baum, der alle Knoten aus einem Graphen enthält, mit den Bedingungen:

Man kommt von einem Knoten immer zu allen anderen
Keine Schleifen
Ungerichteter (gewichteter) Graph

33
Q

Datenstruktur: Was sind minimale Spannbäume?

A

Minimale Spannbäume sind Spannbäume, mit dem geringsten Gesamtgewicht

34
Q

Was ist ein Greedy Algorithmus?

A

Ein Algorithmus, der ausgehend von einer Situation das Ergebnis erweitert um das “beste” Ergebnis

35
Q

Algorithmus: Wie funktioniert Kruskal’s Algorithmus zur Erstellung Minimaler Spannbäume?

A

Alle Kanten eines Graphen werden in aufsteigend sortierter Reihenfolge betrachtet - wenn eine Kante sicher ist, wird diese dem Spannbaum hinzugefügt

36
Q

Was ist eine Kante sicher zum Hinzufügen eines Spannbaumes? Welche Datenstruktur wird dafür verwendet?

A

Union Find wird verwendet, um zu ermitteln, ob eine Kante sicher ist. Wenn zwei Knoten nicht im selben Set sind, ist die Kante sicher und beide Sets werden zusammengeführt - ansonsten ist sie unsicher un wird nicht weiter betrachtet

37
Q

Algorithmus: Wie funktioniert der Algorithmus von Jarnik-Prim-Dijkstra? Wofür ist dieser da?

A

Prim’s Algorithmus wird verwendet, um minimale Spannbäume bei gerichteten, gewichteten Graphen zu erstellen - dabei kann bei einem beliebigen Knoten gestartet werden und man schaut sich immer die Kante mit dem geringsten Gewichtszuwachs ausgehend von den bereits besuchten Knoten an (Liste führen) - nur sichere Kanten werden hinzugefügt

38
Q

Algorithmus: Was ist der Algorithmus für Dijkstra? Wofür wird dieser verwendet? Was sind seine Voraussetzungen?

A

Voraussetzung: ein gerichteter, gewichteter Graph mit nicht-negativen Kantengewichten
Der Algorithmus von Dijkstra berechnet von einem Startpunkt den kürzesten Pfad zu allen Knoten im Graph (funktioniert auch mit Anfangs- und Endknoten)

Dabei wird die Distanz zu allen Knoten festgehalten (am Anfang mit unendlich versehen für maximale Distanz) und diese immer geupdated, wenn man einen Knoten besucht - nachdem ein alle Distanzen geupdated wurden, schaut man sich die kürzeste Distanz in der Tabelle an und schau von diesem Knoten ausgehend aus, was weitere kürzeste Distanzen sind

39
Q

Wie wird beim Algorithmus von Dijkstra der richtige Pfad zurückgegeben?

A

Während dem Algorithmus wird eine Liste von Vorgängern und Distanzen geführt, diese Liste wird am Ende vom Algorithmus “umgedreht”, damit man vom Start- zum Endknoten einen eindeutigen Pfad hat

40
Q

Welche Komplexität hat die Breitensuche?

A

Big-O (|V| + |E|)

41
Q

Welche Komplexität hat die Tiefensuche?

A

Big-O (|V| + |E|)

42
Q

Welche Komplexität hat Kruskal’s Algorithmus für minimale Spannbäume?

A

Big-O (|E| log |E|)

43
Q

Welche Komplexität hat Prim’s Algorithmus für minimale Spannbäume?

A

Big-O (|V| log |V| + |E| log |V|)

44
Q

Welche Komplexität hat der Algorithmus von Dijkstra?

A

Big-O (|E| log |V|)

45
Q

Welche Komplexität haben Operationen im binären Suchbaum?

A

Big-O (h)

46
Q

Welche Komplexität hat das Einfügen in eine Hashtabelle?

A

Big-O (1)