• Shuffle
    Toggle On
    Toggle Off
  • Alphabetize
    Toggle On
    Toggle Off
  • Front First
    Toggle On
    Toggle Off
  • Both Sides
    Toggle On
    Toggle Off
  • Read
    Toggle On
    Toggle Off
Reading...
Front

Card Range To Study

through

image

Play button

image

Play button

image

Progress

1/78

Click to flip

Use LEFT and RIGHT arrow keys to navigate between flashcards;

Use UP and DOWN arrow keys to flip the card;

H to show hint;

A reads text to speech;

78 Cards in this Set

  • Front
  • Back

ArrayList - Aufwand


(size, at, push_back, insert, pop_back, erase)

O(1, 1, 1*, n, 1, n)

Singly - Aufwand


(size, at, pushback, insert, popback, erase,


front, push_front, pop_front)

O(n, n, n, n, n, n,


1, 1, 1)

ArrayList vs Linked List

ArrayList


+ hinten anhängen & entfernen


+ Speicher, da basierend auf Feld


Linked


+ Vorne anhängen & entfernen


- Kein kontinuierlicher Speicherblock sondern "Fragmente"

Doubly - Aufwand


(size, front/back, at, push_front/back, insert, pop_front/back, erase)

O(n ,1, n, 1, n, 1, n)

Doubly Linked List - Member



- Node Klasse mit Data, Prev & Next


- Head


- Tail

Singly Linked List - Member

- Node Klasse mit Data & Next


- Head

Iterator Interface Specs

- Traviersieren von Daten


- Iterator // CTor


- hasNext() // is done or not


- next() // return current & move to next


- remove() // Legacy

Binärbaum


(n-är-Baum)

Jeder Knoten höchstens zwei (n) Kinder

Voller Baum

Jeder Knoten entweder 0 (Blätter) oder 2 Kinder

Vollständiger Baum

Alle Blätter (Kinder) auf einer Ebene

Baum - Höhe

Länge des längsten Pfades von Wurzel zu Blatt

Baum - Niveau

"Ebene" des Baums (0 indiziert)

Baum - Member

- parent (optional)


- Data


- LeftChild


- RightChild



Baum - Preorder


A


/ \


B c

output -> Left -> Right | A - B -C

Baum - Inorder


A


/ \


B c

Left -> Output - Right |B - A - C

Baum - PosterOrder


A


/ \


B c

Left -> Right -> Output | B - C - A

Baum - LevelOrder


A


/ \


B c

Niveau n -> Niveau n+1 -> etc | A - B - C

UPN

PostOrder Traversal des Syntax-Trees <=> Stack


[O1, 02, Operator]


Eg.: 2 5 + = 2+5 = 7



Syntaxanalyse

1. Lexikalische Analyse <-> Zerlegen in Tokesn


2. Syntax Analyse <-> Basierend auf Grammatik

Backus - Naur Form

"< ... > ::= <...> o <...> | <...> | 1 | 2 | 3 | ... "

Endrekursion

Funktion wird "auf dem Weg hoch" berechnet.


Rekursiver Aufruf ist die Letzte Operation.


<=> Schleife (Iterativ)

Suchbaum

Wurzel


/ \


Alle Elemente kleiner Alle Element größer


* Inorder zählt sortierte Reihenfolge auf

AVL Kriterium

balance(T) := Höhe(TR) - Höhe(TL)


balance(T) in {-1, 0, 1} für jeden Knoten

AVL Baum

Baum der das AVL-Balance Kriterium an jedem Knoten erfüllt


balance(T) = Höhe(TR) - Höhe(TL) in {-1, 0, 1}

Suchbaum :: Einfügen

1. Erfolglose Suche - 'x' letzter besuchter Knoten


2. Erzeugen eines neuen Knotens und einfügen an x

Suchbaum :: Löschen

Y


/ \


X ...


1. Suche ; 2.


{ X ist Blatt -> Lösche X


{ X hat 1 Blatt -> Mache Y Parent des Blatts


{ X hat 2 Blätter -> ...

Suchbaum :: Löschen


(eines Knoten mit 2 Kinder)

Lösche X & sei L & R linker / rechter Teilbaum


Suche M - das Minimum in R


Ersetze X durch M (remember Parent)


Setzte L & R als linkes / Rechts Kind von M


Aktualisiere Parent

Einfache Links-Rotation


Einfache Rechts-Rotation

Doppel (Rechts-Links)-Rotation

Doppel (Links-Rechts)-Rotation

AVL-Baum :: Einfügen

1. BST einfügen


2. Rekursiver Aufstieg bis zur Wurzel & AVL-Kriterium checken


Verletzt => Rotation

2-3-4 Baum

2, 3, 4 Kinder pro Knoten


(entsprechend 1,2,3 Schlüssel)

2-3-4 Baum :: Split & Merge

Split eines Knotens <=> 4 Kinder -> durch "hochziehen" des mittleren Knotens in den Parent-Knoten und dort "einsortieren"

2-3-4 Baum :: Bottom-Up

Einfügen in


1. 2,3 Knoten -> nur einfügen


2. 4 Knoten -> Split (hochziehen des mittleren Eintrags) + rekursiver Aufstieg solange parent-Knoten dadurch zu 4 knoten wurden -> Einfügen in neuen Blattknoten

2-3-4 Baum :: Top-Down

Beim Suchen (im Abstieg) teile alle besuchten 4 Knoten -> Einfügen in Blattknoten

Rot-Schwarz-Baum - Intuition

Binäre Baum in dem jeder Knoten rot oder schwarz gefärbt wird -> Stabilitätskriterium


Es existiert eine bijektive Abbildung zwischen RS & 234 Bäumen

Rot-Schwarz Baum - Definition

1. Jeder Knoten ist rot oder schwarz


2. Wurzel ist schwarz


3. Alle Blätter sind schwarz (Dummies)


4. Beide Kinder eines roten Knotens sind schwarz


5. Jeder Pfad von einem Knoten zu allen erreichbaren Blättern enthält gleich viele schwarze Knoten

Rot-Schwarz Baum :: Einfügen 1-2

Einzufügender Knoten (n) ist rot "()"


(p parent, g grandparent, u uncle)


1. (n) ist wurzel -> umfärben zu n


2. p ist schwarz -> fertig


3-5. ...

Rot-Schwarz Baum :: Einfügen 3-5

Einzufügender Knoten (n) ist rot "()"


(p parent, g grandparent, u uncle)


Fall "rot-rot" - (p)&(n)


1. u ist schwarz -> Restrukturieren


2. (u) ist rot -> umfärben


+ Rekursion aufwärts

B Bäume

"Große 234 Bäume" zur effizienten Speicherung im externen Speicher.


Jeder Knoten hat zw. m+1 & 2m+1 Kinder


- Wurzel hat mindestens 2 Kinder oder ist ein Blatt


Alle Blätter liegen auf der gleichen Ebene

B Bäume :: Einfügen

1. Knoten mit < 2m Einträgen


-> in Liste einsortieren


2. Knoten mit == 2m Einträge


-> Einsortieren (2m+1 Einträge)


-> Mittleren Knoten in Elternknoten


-> Linke Hälfte bleibt


-> Rechte Hälfte in neuen Knoten &


an den neuen Zweig des mittleren Knoten hängen

Splay Tree

'Verschieben' von Einträgen beim Zugriff nach oben


(Rotationen)


=> Häufig gebrauchte Einträge landen weiter oben

Tries

* Text Retrieval


* Jede Kante "hängt" einen Buchstaben an das Wort an.


* Jeder Knoten ist das Wort, gebildet aus der Zeichenkette von der Wurzel zum Knoten

Heap (Min-Heap)


Analog für Max-Heap

Kinder eines Knoten sind größer


Jeder Teilbaums eines Min-Heap ist ein Min-Heap


=> Kleinster Eintrag in der Wurzel


-> Vollständiger Baum (bis auf letzte Ebene)


-> implementiert als Feld

Heap als Feld (1 Indiziert)

Geg ein Knoten via Index (k)


P = k//2


L = 2k


R = 2k+1

Heap als Feld (0 indiziert)

Geg ein Knoten via Index (k)


P = (i-1)//2


L = 2i+1


R = 2i+2

Heapify :: UpHeap


- Top Down

Vergleiche Knoten mit Parent, wenn Knoten die Heap-Eigenschaft verletzt, tausche beide.

Heap :: Einfügen

Hänge Eintrag ans Array-Ende, "Upheape" es bis das Heap-Kriterium wieder erfüllt ist

Heap :: Löschen des kleinsten Eintrages

Tausche Wurzel mit letztem Eintrag, Lösche letzten Eintrag.


Wenn Wurzel größer als das kleinere Kind, tausche.


-> Rekursiv bis Element in Heap 'passt'

Heapify :: DownHeap


- Bottom Up

Geg.: Ein Array.


Beginne beim letzten Inneren Knoten (Parent vom Letzen Knoten)


Teste Wurzel mit beiden Kindern, tausche wo nötig, decrement & continue

HeapSort

O(n log(n))


In Place


Nicht Stabil


Sortierreihenfolge via Min/Max-Heap

Hashing

Mittelwert von Space vs. Time


Hashfunktion berechnet Hash-Wert des Objekts


H: Obj -> [0, n], wird zum Indizieren der Tabelle verwendet

Hashfunktion

H: Obj -> [0, n]


1. Konsitent x = y -> H(x) = H(y)


2. Deterministisch


Möglichst:


- Effizient


- Gleichverteilen


Eg.: H(x) = x mod m (mit m in Prime)

Kollisionsbehandlung

Seperate Chaining


Open Addressing


- Lineares


- Quadratisches


- Double-Hashing

Hashing :: Füllgrad

a = n / m

Seperate Chaining

Array von Listen, Bei jeder Kollision wird in die Liste eingefügt


- Wird ineffizient bei großem Füllgrad, funktioniert jedoch noch

Lineares / Quadratisches Sondieren

Wenn Hashwert in einem schon belegten Feld resultiert wird eine lineare (Quadratische) Folge von Zahlen addiert bis ein freier Platz gefunden wird


(finden erfolgt Analog <-> Vorsicht beim Löschen)


- Für Füllgrad > 1 "kaputt"

Double Hashing

Zweite Hashfunktion zum Bestimmen (Modifizieren) der Sprungweite im linearen Sondieren


+ Sprungweite ist so für fast jeden Eintrag anders


- Zweite Hashfunktion darf nie 0 werden, sonst 'bricht' das lineare Sondieren (H(x) + i *0 = H(x))

(Un) Gerichtete Graphen


(un) directed graph

Kante A -> B ungleich Kante B -> A vs.


Kante A <-> B

Gewichtete vs Ungewichtet Graphen

Kanten haben verschiedene vs alle die gleiche "Länge" / Gewicht

Graph - Def

Menge von Knoten V &
Menge von Kanten {{i, j} or (i, j) | i,j in V & i != j}

Teilgraph

Teilmenge der Knoten & Kantenmenge

Grad (eines Knoten)

Anzahl der eingehenden Kanten


In digraphs:


Unterteilung in indegree & outdegree

Pfad

Folge von (durch Kanten verbundenen) Knoten, wenn alle Knoten verschieden sind.

Zyklus

Folge von (durch Kanten verbundenen) Knoten,

wenn Knoten wiederholt vorkommen.


Aka alles was kein Pfad ist

Azyklisch

Graph ohne Zyklen

DAG

directed acyclic graph


(Gerichteter Zyklenfreier Graph)

Ajazenzmatrix

n-te Zeile - ausgehende Kanten des n.ten Knotens


n-te Spalte - eingehende Kanten des n.ten Knotens

Kantenliste

edgelist = {Anzahl der Knoten, Anzahl der Kanten, Startknoten, Endknoten (*)}


(*) jeder Kante


Eg.: {6, 11, 1,2, 1,3, 1,4 ... }

Knotenliste

nodelist = {Anzahl Knoten, Anzahl Kanten, Valenz eines Knotens, Nachbarschaft eines Knotens (*) }


(*) Für jeden Knoten


{6, 11, 2, 2,3, 0, 3, 1,4,6, ... }

Knotentabelle

Zwei Listen


1. Ausgehende Kanten 1ring={2,3, 1,4,6, 1, 3,5 }


2. Indizes Speichert ab welchem (& bis zu welchem) Index die Elemente aus der 1ring-liste zum aktuellen Knoten gehören


E.g.: {0, 2, 2, 5, ... }

Heuristiken (Eigenschaften)

- Dürfen nicht unterschätzen


- Schnell berechenbar

Maximaler Fluss

Graph :: Quelle

Nur ausgehende, keine eingehenden Kanten

Graph :: Senke

Nur eingehende, keine ausgehenden Kanten

Maximaler Fluss (Def)

1. Kapazitätsberschränkung

- Fluss durch eine Kante <= Kapazität der Kante


2. Antisymmetrie


- Fluss von i nach j = Negativer Fluss von j nach i


f(u, v) = -f(v, u)


3. Flusserhaltung


- Der in einen Knoten gelangende Fluss = der den Knoten verlassende Fluss

Max Flow <-> Min Cut

Der Wert des maximalen Flusses in einem Graphen ist gleich den Kosten des minimalen Schnitts