1/60
Looks like no tags are added yet.
Name | Mastery | Learn | Test | Matching | Spaced |
|---|
No study sessions yet.
Welche Laufzeit hat Selectionsort/ Minsort, ist der Algorithmus in Place oder stabil?
In allen Cases O(nÂČ) , in place, nicht stabil.
Welche Laufzeit hat Insertionsort, ist der Algorithmus in Place oder stabil?
Die Laufzeit von Insertionsort betrĂ€gt im besten Fall O(n), im durchschnittlichen und schlechtesten Fall O(nÂČ). Der Algorithmus ist in-place und stabil.
Welche Laufzeit hat Quicksort, ist der Algorithmus in Place oder stabil?
Die Laufzeit von Quicksort betrĂ€gt im besten Fall O(n log n), im durchschnittlichen Fall O(n log n) und im schlechtesten Fall O(nÂČ). Durch randomieiserung des Pivot-Elements im Worst-Case : (n* logn). Der Algorithmus ist in-place (wenn Trick angewendet), aber nicht stabil.
Mergesort
Die Laufzeit von Mergesort betrÀgt im besten, durchschnittlichen und schlechtesten Fall O(n log n). Der Algorithmus ist nicht in-place, aber stabil.
Heapsort
Die Laufzeit von Heapsort betrÀgt im besten, durchschnittlichen und schlechtesten Fall O(n log n). Der Algorithmus ist in-place, aber nicht stabil.
Definition stabiler Sortieralgorithmen. Wie können nicht stabile Algorithmen stabil gemacht werden?
Ein stabiler Sortieralgorithmus bewahrt die relative Reihenfolge von gleichen Elementen im sortierten Ergebnis. Das bedeutet, dass bei gleichwertigen EintrĂ€gen deren ursprĂŒngliche Reihenfolge erhalten bleibt. Nicht stabile Algorithmen können stabil gemacht werden, indem man zusĂ€tzliche Information zu den Elementen hinzufĂŒgt, z. B. durch EinfĂŒgen eines Indexwertes, oder durch die Verwendung von stabilen Sortieralgorithmen wie Mergesort als Teil des Verfahrens â SchlĂŒssel
Definition in-place Sortieren
Ein in-place Sortieralgorithmus sortiert die Daten in der gleichen Speichernutzung, ohne zusĂ€tzlichen Speicherplatz fĂŒr die Sortierung zu benötigen.
Welcher Laufzeit entspricht (n-1) + (n-2) + (n-3) + âŠ+ 2+ 1
= (n-1)*n/ 2 = nÂČ/2-n/2 â O(nÂČ)
Wie funktioniert Quicksort?
Quicksort ist ein schneller Sortieralgorithmus, der die Auswahl eines Pivot-Elements verwendet, um die Liste in zwei Partitionen zu teilen. Elemente, die kleiner als das Pivot sind, werden links und gröĂere rechts angeordnet, gefolgt von rekursivem Anwenden des gleichen Verfahrens auf die Teilmengen.

Wie funktioniert Mergesort?
Mergesort ist ein stabiler Sortieralgorithmus, der die Liste in zwei HĂ€lften teilt und dann jede HĂ€lfte rekursiv sortiert, bevor die beiden sortierten HĂ€lften zusammengefĂŒhrt werden. Nachteil: viel Speicherplatz benötigt.

Wie funktioniert Heapsort?
Heapsort erstellt zunĂ€chst einen Min-Heap aus einer Liste mit der Laufzeit O(n), heapify_up/down (O(ldn). Zum sortieren der Liste wird dann je das Minimum aus der Wurzel extrahiert â konstant O(1) mit heapify_down (O(ldn).

Was sind dynamische Datenstrukturen?
dynamisch wachsend und schrumpfend, in Heap abgelegt
besitzen Zeiger: Werte, die auf Speicheradresse anderer Werte zeigen.
in Python realisiert durch Listen, Klassen und Dictionaries
Wie sieht eine Implementierung von dynamischen Datenstrukturen in Listen aus?
list= [42, [73, [[[[âŠ, None]]]]] â VerknĂŒpft. Jede Liste hat aber die LĂ€nge 2
Wie sieht eine Implementierung von dynamischen Datenstrukturen in Klassen aus?
class Node:
def __init__(self):
self.value= value
self.next= None
def update_next(self, new_next):
self.next= new_next
Wie sieht eine Implementierung von dynamischen Datenstrukturen in Dictionaries aus?
dict= {âvalue: 42, ânextâ: {âvalue: 73, ânext:None}}
second [ânextâ]= dict
Was sind Stacks, welchem Prinzip folgen sie?
Dynamische Datenstruktur, die auch als Kellerstruktur bezeichnet werden. Im Stack kann immer nur auf das neuste Element zugegriffen werden. Werte werden in bestimmter Reihenfolge gespeichert.
LIFO: last in first out
Welche Operationen können auf einen Stack angewendet werden?
s= empty_stack() â erstellt leeren Stack
push(s, value) â fĂŒgt Wert hinzu âoben raufâ
top(s, value) â gibt obersten Wert zurĂŒck
last= pop(s, value) â entfernt obersten Wert, kann zudem gespeichert werden (last)
Was ist eine Queue?
Die Warteschlange ist eine dynamische Datenstruktur. Sie speichert wie ein Stack Werte in der zugefĂŒgten Reihenfolge. Anders als im Stack gilt hier das FIFO Prinzip: First in first out.
Welche Operationen können auf eine Queue angewendet werden?
q= empty_queueâ konstruiert leere Queue
enqueue(s, value) â fĂŒgt Wert hinzu âoben raufâ
top(s, value) â gibt obersten Wert zurĂŒck
first= deque(s, value) â entfernt untersten Wert, kann zudem gespeichert werden (first)
Welche Elemente und Eigenschaften hat ein Baum?
Verzweigung: Knoten
Knoten ohne Kinder: BlÀtter
Verzweigungsgrad: Anzahl möglicher Kinder (BinÀrbaum: 2 oder 0)
Höhe: maximales Vorkommen innerer Knoten auf Pfad von Wurzel zu empty_Wert. (Aus 3 werten bestehender Baum â 2 gefĂŒllte Level: Höhe 2)
BlĂ€tter: 2^h mit h: Höhe. 2^0= 1Blatt â Wutzel auch Blatt, 2^1 = 2 BlĂ€tter, 2ÂČ = 4 BlĂ€tter, âŠ
Wie ist ein Suchbaum aufgebaut? Wie funktioniert das Nachschlagen und EinfĂŒgen von Werten?
FĂŒr jeden Knoten im Baum gilt: Wert im Knoten > alle Werte im linken Teilbaum und < als alle im rechten Teilbaum.
Nachschlagen: Pfad kann Weg angeben, ob nach links oder rechts âabgebogenâ werden muss. genauso kann ĂŒberprĂŒft werden, ob der gesuchte Wert kleiner (links) oder gröĂer (rechts) oder gleich der Wurzel ist. Wird ein empty-Wert erreicht, ist der gesuchte Wert nicht im Suchbaum enthalten. EinfĂŒgen funktioniert gleich. Bei gleichen Werten wird der Wert nicht eingefĂŒgt. Beim erreichen des Empty-Wertes, kann der Wert an dessen Position eingefĂŒgt werden.

Laufzeiten in einem Suchbaum. (Nachschlagen, Löschen)
Nachschlagen: Best-case, Average-Case O(ldn)/ O(Höhe) mit n der Elemente im Baum. Worst-Case: O(n) bei einseitigen BÀumen.
Löschen: 1. Nachschlagen des Wertes. Dann ersetzten durch Kind, falls dieses nur 0-1 Kinder hat. Ansonsten Suchen des linken höchsten Wertes oder rechten kleinsten Wert und ersetzten durch diesen.â O(h) mit Worst-Case O(n)
Welche Operationen können durch das Balancieren des Baums (AVL) verbessert werden?
find/ min/max (â O(h) bis O(n) zu O(logn)),
insert & delete (â O(h) bis O(n) zu O(logn)),
Wie ist die Balance eines Teilbaums auszurechnen? Wann werden diese provoziert?
balance(tree)= height(tree.right) - height(tree.left)
Provoziert durch hinzufĂŒgen oder Löschen von Werten.
Bei welchen Balancen werden welche Rotationen ausgeĂŒbt. Male die BĂ€ume fĂŒr eine L-, R-, LR-, RL-Rotation auf.

Welche Balance und Höhe hat der Baum nach einer Rotation?
Höhe des neuen Baumes: h-1, Balance 0,1 oder -1
Was ist eine priority queue PrioritÀtswarteschlange?
PrioritÀtswarteschlange: abstrakte Datenstruktur (ADT)
Queue + PrioritÀt (falls gleiche Werte: nacheinander in der Queue).
insert(x, p) â fĂŒge ein Element xxx mit PrioritĂ€t ppp ein
find-min / find-max â finde das Element mit höchster PrioritĂ€t
delete-min / delete-max â entferne das Element mit höchster PrioritĂ€t
Wie kann eine PrioritÀtswarteschlange (ADT) in einer Baumstruktur dargestellt werden?
In Heaps dargestellt. PrioritÀten werden als Knoten gespeichert. MinHeap hat kleinste Prio als Wurzel. Neben den PrioritÀten können dann Values abgespeichert werden.
Wie können bei der Listendarstellung eines Heaps auf die Kinderknoten und die Elternknoten zugegriffen werden mit der Nutzung vom Index des auszugehenden Wertes i?
Elternknoten: (i-1)//2
linker Kindknoten: i*2+1
rechter Kindknoten: i*2+2
minimum Index 0,
Was heiĂt amortisierte Laufzeit
Durch Speicherverschwendung erkaufte konstante Laufzeit.
amortisierte Kosten= Gesamtkosten der n Operationen/ n
Verdopplung von Speicher nachdem Speicher voll ist, lÀsst n konstante Operationen zu (O(1)), bis eine in O(n) kommt. dadurch so gut wie Konstant.

Was sind Arrays? besondere Eigenschaften
Datenstruktur mit fester LĂ€nge, keine heterogene Elemente, jedes Element ĂŒber Index erreichbar.
lesen& schreiben in konstanter Laufzeit., NICHT dynamisch!
Male auf, wie ein Array gespeichert ist.

Was passiert, wenn man einen Wert an einen Array zufĂŒgen will? Und Lösung fĂŒr Problem.
append fĂŒgt ans Ende hinzu, Speicherplatz hinter array ende kann schon belegt sein â neuen gröĂeren Speicherplatz reservieren und Array-Werte kopieren.
Problem: wenn mehrere Variablen auf Array verweisen, mĂŒssen alle Speicheradressen aktualisiert werden
LĂSUNG: ZusĂ€tzlicher Verweis zwischen Variablen und Listen. feste Adresse zeigt auf Zeiger, der die Speicheradresse des Arrays zeigt. Die feste Adresse nicht Ă€nderbar aber der Zeiger wird aktualisiert, falls die Speicheradresse geĂ€ndert wird. Variable â Zeiger â Speicherblock
sind absolute Laufzeiten oder die Steigung des Wachstums bei steigender Eingabe interessanter?
Steigung
Was sagen die Symbole aus: g(n) = O(f), Ω(f), o(f), Ï(f), Î(f)?
O: obere Schranke (†mit einem Faktor). g wÀchst höchstens so schnell wie f
Ω: untere Schranke (℠mit einem Faktor). g wÀchst mindestens so schnell wie f
o: echt kleiner. g wÀchst stets langsamer als f
Ï: echt gröĂer. g wĂ€chst stets schneller als f
Î: gleich groĂ (oben und unten gleichzeitig beschrĂ€nkt).
Was bedeuten die einzelnen Teile dieser Schreibweise?
O(f)={g: NâR+ ⣠âC > 0 ân0 ââ N ân â„ n0â: g(n) †Câ f(n)}.
NâR+
bedeutet: g ist eine Funktion von den natĂŒrlichen Zahlen zu den positiven reellen Zahlen.
âC>0 (âEs existiert ein C>0â): ein fester Faktor.
ân0 ââ N (âEs existiert ein n0 in den natĂŒrlichen Zahlenâ): ab einer bestimmten Startschwelle.
â: Existenzquantor: âes gibtâ
ân â„ n0â (âFĂŒr alle nâ„n0 â gilt ...â): Bedingung gilt ab dieser Schwelle fĂŒr alle gröĂeren n.
â: Allquantor: âfĂŒr alleâ
âg(n) †Câ f(n) das ist die eigentliche Ungleichung: g wĂ€chst höchstens so schnell wie f, bis auf den konstanten Faktor C.
Mit welchem C und n0 kann g â O(f) sein:
bringe die Laufzeiten in aufsteigende Reihenfolge:
O(1) < O(logn) < O(n) < O(n logn) < O(nÂČ) < O(nÂł) < O(2^n) < O(3^n) < O(n)! < O(n^n)
O(1) < O(logn) < O(n) < O(n logn) < O(nÂČ) < O(nÂł) < O(2^n) < O(3^n) < O(n!) < O(n^n)
Wie wird eine Laufzeit bewiesen?
Durch den Satz von lâ HĂŽspital:
lim fâ(n)/ gâ(n) = lim f(n)/g(n) darf angewendet werden, wenn 0/0 oder â/â vorliegt.
Zeige, dass g â o(f) gilt.
g(n) = ld(n)ÂČ, f(n) = n*ld(n)
g(n)/f(n) = ld(n)ÂČ/ n*ld(n) = ld(n)/n = ln(n)/ln(2)*n
Ableitung beider therme einzeln: 1/ln(2)*n
mit n â â: lim= 0 Damit ist die Aussage bewiesen
Male die verschiedenen Landau-Notationen auf in einem Diagramm, aus dem die AbhÀngigkeit hervorgeht

Zu welchem Symbol gehören die beiden Schreibweisen:
{g: NâR+ ⣠âC > 0 ân0 ââ N ân â„ n0â: g(n) â„ Câ f(n)}
{g: NâR+ ⣠âC > 0 ân0 ââ N ân â„ n0â: g(n) â„ Câ f(n)}
Ω
Ï
Was entspricht 1. limânââ g(n)/n(n)â <â
limânââ g(n)/f(n)â=0
limânââ g(n)/f(n)â=k
gâO(f), fâΩ(g)
gâo(f), fâÏ(g)
gâÎ(f), fâÎ(g)
Wie ist die ProportionalitĂ€t der Kanten zu den Knoten in einem gerichtetem Graph (EinbahnstraĂen) ausgegangen wird.
E â V1 x V2 mit V1: Ausgangsknoten, V2: Zielknoten, Kantenmenge â ist Teilmenge der Knotenpaar-Menge. Alle Kanten verbinden nur Knoten aus V miteinander. Jedes Element von VxV ist ein Paar von Knoten.
bei ungerichteten Graphen: Reihenfolge wichtig.
â aus VxV= {(u,v) | u â V, v â V} wird {{n,m} | n,m â V}
Male die Adjazenzmatrix von [FL, KI, NMS, HL, HH], Fl: 60 NMS, 70 KI; 1KI: 30 NMS, 80HL; NMS: 50HL, 60HH; HL: 70HH
0 1 2 3 4
0 0 70 60 â â
1 70 0 30 80 â
2 60 30 0 50 60
3 â 80 50 0 70
4 â â 60 70 0
Was sind Unterschiede in der Tiefen und der Breitensuche? â Datenstruktur, Besuchte Knoten, PfadlĂ€nge, Speicherbedarf, Anwendung
Eigenschaft | DFS | BFS |
|---|
Datenstruktur | Stack / Rekursion | Queue |
Besucht Knoten | âtiefâ in einen Zweig | âflachâ schichtweise |
PfadlĂ€nge | Nicht garantiert kĂŒrzester Pfad | Garantiert kĂŒrzester Pfad in ungewichteten Graphen |
Speicherbedarf | O(V) Rekursionstiefe (bei Baum) | O(V) max. Breite der Ebene |
Anwendung | Topologische Sortierung, ZyklenprĂŒfung, Pfadsuche | KĂŒrzeste Wege, Level-Bestimmung, Netzwerkflussvorbereitung |
Backtracking. Ausgelassen fĂŒr jetzt
Was ist dynamisches Programmieren?
Dynamisches Programmieren ist eine Optimierungstechnik, um Probleme zu lösen, die ĂŒberlappende Teilprobleme haben und eine optimale Teilstruktur besitzen.
Ăberlappende Teilprobleme: Das Problem kann in Teilprobleme zerlegt werden, die mehrfach auftreten.
Optimale Teilstruktur: Die optimale Lösung des Gesamtproblems kann aus den optimalen Lösungen der Teilprobleme aufgebaut werden.
DP vermeidet Rekursionen mit doppelter Arbeit, indem Teillösungen gespeichert werden.
Welche Operationen können bei der Editierdistanz von zwei Wörtern genutzt werden?
Delete (i)
Insert (i, a)
Replace (i,a)
as ist die Editiersequenz? Wie kann diese aussehen?
Die Abfolge von Operationen, die aus einem Wort das andere macht. DEL(1); REP(2,S)
Was ist die Editierdistanz?
Die Anzahl an Operationen, die mindestens ausgefĂŒhrt werden mĂŒssen.
Warum normalisiert man die Operatoren? Bei welchen 4 Editier-Operationen ist die Reihenfolge entscheidend? ( j < i )
Normalisierung, um die Operatoren seriell ĂŒber beide Wörter nutzen zu können.
DEL(i); DEL(j) wird zu DEL(j); DEL(i) REP(i,a);
DEL(j) wird zu DEL(j); REP(i â 1,a)
DEL(i); INS(j,a) wird zu INS(j,a); DEL(i + 1)
INS(i,a); INS(j,a) wird zu INS(j,a); INS(i + 1,a)
Wie ist die Laufzeit der Ermittlung der (kleinsten) Editierdistanz naiv also ohne Memorization
Laufzeitanalyse naiv
Jeder Aufruf mit (m,n)) erzeugt bis zu 3 rekursive Aufrufe (Insert, Delete, Replace).
Rekursionstiefe ist höchstens m+n.
Anzahl Knoten im Rekursionsbaum: im Worst Case O(3m+n).
Tnaiv(m,n) = O(3m+n) Exponentiell, weil dieselben Teilprobleme immer wieder berechnet werden.
Wie kann die Editierdistanz effektiver ermittelt werden? Mit welcher anderen Funktion/Berechnung wird diese Methode verglichen?
Wie bei Fibonacci wird bei der naiven Variante Teilprobleme immer wieder aufgerufen â exponentiell.
D(i, j) hĂ€ngt ab von D(iâ1, j), D(i, jâ1), D(iâ1, jâ1). Die selben Teilprobleme tauchen auch hier öfter auf â Memoization/DP, damit jedes Teilproblem nur 1x berechnet wird.
Im Gegensatz zu Fibonacci (O(n)) ist die Laufzeit hier =(m*n). Also abhÀngig von beiden WortlÀngen.
Bsp.
D(2,2) ( "ab" vs "cd" )
ââ D(1,2) ( "a" vs "cd" )
â ââ D(0,2) (" " vs "cd")
â ââ D(1,1) ("a" vs "c")
â ââ D(0,1)
â ââ D(1,0)
â ââ D(0,0)
ââ D(2,1) ( "ab" vs "c" )
â ââ D(1,1) (kommt nochmal!)
â ââ D(2,0)
ââ D(1,1) ( "a" vs "c" ) (kommt nochmal!)
Was ist das Grundkonzept und Ziel vom Hashing?
Umwandeln von Daten beliebiger GröĂe in einen kurzen Index â Hashwert oder SchlĂŒssel
Zeiel: Schnelles Suchen, EinfĂŒgen, Löschen und PrĂŒfen, ob Element existiert O(1)
Mit welchen Datenstrukturen kann Hashing in Python umgesetzt werden.
Liste von Paaren, SuchbÀume, Dictionaries
Welche Probleme können bei der Erstellung des Hashwertes auftauchen?
Die Hashfunktion kann so programmiert sein, dass bspw. Strings mit gleichen Buchstaben den gleichen Wert zugewiesen bekommen. Entweder können die Werte dann ĂŒberschrieben werden oder es wird eine Liste angelegt mit beiden Strings. Sind zu viele Eingaben in der Liste, ist Array nur noch um konstanten Faktor effizienter. (Dominanz der inneren Listenstrukturen)
â dynamischer Array, der bei best. FĂŒllgrad vergröĂert wird. Mit amortisierter Laufzeit.
â groĂer SchlĂŒsselbereich/ KeySet {0,1,âŠ., n-1}
Was ist ein Bit (b), Byte (B)?
Bit: kleinste Informationseinheit: 0 oder 1
Byte: 8 Bit: ein Zeichen hat 1 Byte. Nutzung bspw. bei ASCII-Zeichen.
Nenne ein Beispiel fĂŒr verlusthafte und verlustfreie Datenkompression
verlusthaft: jpeg, mp4
verlustfrei: zip
Was beschreibt der Begriff Entropie?
Informationsdichte
Bei geringer Informationsdichte, viele Werte unnötig â kompakte Darstellunf mögl.
Wie viele Zeichen benötigt man, um âeine leise eseleiâ darzustellen, wie viele Bits ?
8Ă17 Zeichen â 144 Bit
6 Zeichen: (e, i, n, _, l, s) â 8 Bit code: 8Ă17 = 144 Bit
aber 6 Zeichen auch als 3 Bit code darstellbar â 3Ă17= 51 Bit
Wie sĂ€he der Huffman-Algorithmus fĂŒr âeine leise eseleiâ aus?
