Alles Flashcards

1
Q

Nenne drei typische Sortieralgorithmen

A

Selection Sort Insertion Sort Merge Sort

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

Erkläre den Ablauf von Selection Sort

A
  1. Beginne den Algorithmus mit dem Index i = 1 2. Durchlaufe dazu alle Elemente der Folge von i bis n und identifiziere den Index j, an dem das kleinste Element steht (3. Das kleinste Element kann bereits am Index i stehen, in diesem Fall entspricht der Index j dem Index i) 4. Tausche das Element an Index i gegen das Element an Index j 5. Ergebnis: Das kleinste Element steht nun an der ersten Stelle der Folge i=2; i=2… i=n-1 6. Wiederhole den beschriebenen Ablauf für Index
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Wie ist das Laufzeitverhalten des Selection Sorts? Wie berechnet es sich?

A

Erster Vergleich (i=1) vergleicht N-1 Mal (Vergleich nicht mit sich selbst). Zweiter Vergleich (i=2) vergleicht N-2 Mal (Vergleich nicht mit sich selbst und nicht vorherigen). … Ergebnis: 1+2+3+4…N-1 Mal Durch Gauß: (N²-N)/2 –> Quadratisch

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

Erkläre den Ablauf von Insertion Sort

A
  1. Die Zielfolge enthält initial das erste Element der Folge und ist somit sortiert (da lediglich einelementig) 2. Beginne den Algorithmus mit dem Index i = 2 3. Durchlaufe alle Elemente der Folge von 0 bis i und identifiziere den Index j, an dem das Element an Index i einzufügen ist 4. Füge das Element an Index i am Index j ein und verschiebe alle Elemente von Index j bis i-1 um einen Index nach rechts 5. Ergebnis: Die Indices 0 bis i sind sortiert (Zielfolge) 6. Wiederhole den beschriebenen Ablauf für Index i=3, i=4 , … , i=N
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Wie ist das Laufzeitverhalten des Insertion Sorts? Wie berechnet es sich?

A

Schlüsselvergleiche: Im besten Fall N-1 , im schlechtesten Fall ungefähr N²/2, im Mittel ungefähr N²/4 Austauschoperationen: Im besten Fall 0, im schlechtesten Fall ungefähr N²/2, im Mittel ungefähr N²/4 –> Quadratisch

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

Erkläre den Ablauf von Merge Sort

A

Idee: Zu sortierende Folge in zwei kleinere Folgen aufteilen, diese jeweils rekursiv sortieren und die (sortierten) Ergebnisfolgen per Mischen wieder zusammenfassen Verfahren terminiert, da wiederholtes Aufteilen der Folge irgendwann zu einelementigen Folgen führt, die von Natur aus sortiert sind (Abbruchfall) Ablauf Ist die Folge f leer oder einelementig, stellt sie bereits eine sortierte Folge dar und das Verfahren ist abgeschlossen (Ergebnis: f) Enthält die Folge f hingegen mehr als ein Element, so zerlege sie in der Mitte in zwei Teilfolgen fl und fr(deren Länge sich höchstens um 1 unterscheidet) Sortiere die beiden Teilfolgen fl und fr rekursiv (Ergebnisfolgen fl’ und fr’) Mische die beiden sortierten Folgen fl’ und fr’ zur sortierten Folge f’

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

Wie ist das Laufzeitverhalten des Merge Sorts? Wie berechnet es sich?

A

Laufzeitverhalten? Anzahl Schritte? Algorithmus bildet über die wiederholte Halbierung log2(N) Ebenen Für jede Ebene müssen beim Mischen mindestens 1/2 N und schlimmstenfalls N-1 Vergleiche durchgeführt werden Schlüsselvergleiche Im besten Fall 1/2*N* Log2(N), im schlechtesten Fall N* Log2(N) Laufzeitverhalten näherungsweise N* Log2(N) => schlechter als linear, besser als quadratisch => auch als linearithmetisches Laufzeitverhalten bezeichnet Speicherverhalten? Typischerweise Out-of-Place-Sortieren, d.h. Erzeugung neuer Datenstrukturen in Abhängigkeit von N (hier des temporären Arrays beim Mischen) zusätzlicher Speicher in Höhe von N erforderlich

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

Wie sieht die Klasse “MyRBSet” aus?

A

public class MYRBSet<e>&gt;<br></br>implements GenericOrderedSet<e>{</e></e>

private static class TreeNode<t>{<br></br>private T key;<br></br>private boolean red;<br></br>private TreeNode<t> left;<br></br>private TreeNode<t> right;</t></t></t>

private TreeNode{T key, boolean red, TreeNorde<t> left, TreeNode<t> right){<br></br>this.key = key;<br></br>this.red = red;<br></br>this.left = left;<br></br>this.right = right;</t></t>

}

}

private TreeNode<e> root;</e>

}

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

Wie sieht die lookup/contains-Operation im Binären Suchbaum (und damit auch bei Rot-Schwarz-Bäumen) aus?

In welcher Laufzeitkomplexität arbeitet diese?

A

Laufzeit 0(H), wobei H die Baumhöhe darstellt.

private TreeNode<e> lookup(TreeNode<e> t, E key){</e></e>

if (t == null){
return null;
}
int cmp = key.compareTo(t.key);
if (cmp \< 0){
return lookup(t.left, key);
} else if (cmp \> 0){
return lookup(t.right, key);
} else {
return t;
}
}
@Override
public boolean contains(E key){
return lookup(this.root, key) != null;
​}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Wie wird rotateLeft bei Schwarz-Rot-Bäumen implementiert?

A

private TreeNode<e> rotateLeft(TreeNode<e> t){</e></e>

TreeNode<e> r = t.right;<br></br><br></br>t.right = r.left;<br></br>r.left = t;<br></br><br></br>r.red = t.red;<br></br>t.red = true;</e>

return r;

}

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

Wie wird das Umfärben (Elternknoten rot, Kindknoten schwarz) im Rot-Schwarz-Baum genannt und wie wird dies implementiert?

A

private TreeNode<e> flip(TreeNode<e> t){</e></e>

t. red = true;
t. left.red = false;
t. right.red = false;

return t;
}

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

Wie wird rotateRight im Rot-Schwarz-Baum implementiert?

A

private TreeNode rotateRight (TreeNode t){

TreeNode l = t.left;

t. left = l.right;
l. right = t;

l. red = t.red;
t. red = true;

return l;

}

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

Wie sieht die Insert-Funktion beim Rot-Schwarz-Baum aus?

A
private TreeNode insert(TreeNode t, E key){
if (t == null){
return new TreeNode(key, true, null, null);
}
int cmp = key.compareTo(t.key);
if(cmp \< 0){
t.left = insert(t.left, key);
} else if (cmp \> 0){
t.right = insert(t.right, key);
 }else {
return t;
}

if (isRed(t.right) && !isRed(t.left)){
t = rotateLeft(t);
}
if(isRed(t.left) && isRed(t.left.left){
t= rotateRight(t);
}
if(isRed(t.left) && isRed(t.right)){
t = flip(t);
}
return t;
}

private Boolean isRed(TreeNode t){
return t != null && t.red;
}

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

Wie sieht die Klasse MyLinked List in ProgrammCode aus?

A

public class MyLinkedList implements GenericList{

private static class ListNode{
private T value;
private ListNode<t> next = null;<br>private ListNode(T value; ListNode<t> next){<br>this.value = value;<br>this.next = next;<br>}</t></t>

}
private ListNode first = new ListNode<e>(null, null);<br></br>}</e>

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

Wie sieht bei MyLinkedList die Insert-Funktion aus?

A

public MyLinkedList insert(E value, int idx){

ListNode<e> curr = this.first;<br></br>while(idx-- &gt; 0){<br></br>curr = curr.next;<br></br>}<br></br>curr.next = new ListNode<e>(value, curr.next);<br></br>return this;<br></br>}</e></e>

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

Wie sieht die remove-Funktion bei verketteten Listen aus?

A

@Override
public E remove(int idx){

E removed = null;
ListeNode curr = this.first;
while (idx– > 0){
curr = curr.next;
}
removed = curr.next.value;
curr.next = curr.next.next;
return removed;
}

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

Wie wird in der Verketteten Liste (MyLinkedList) indexOf implementiert?
Was muss als erstes gemacht werden?

A

Erst das Startelement nehmen und durchlaufen, bis Start-Index gefunden

18
Q

Wie wird insert bei “MyArrayList” implementiert?

A

public MyArrayList insert(E value, int idx){

E[] new_vals = (E[]) new Object[this.vals.length + 1];
System.arraycoppy(this.vals, 0, new_vals, 0, idx);
System.arraycopy(this.vals, idx, new_vals, idx +1, this.vals.length - idx);
new_vals[idx] = value;

this.vals = new_vals;

return this;

}

19
Q

Was wird bei der MyArrayList bei der Methode remove zurückgegeben? Findet hier auch eine Verkleinerung des Arrays statt?

A

Es wird das entfernte Element E zurückgegeben:
public E remove(int idx)

Das Array wird verkleinert.

20
Q

Beschreibe die wesentlichen Unterschiede der MyFastArrayList für die Methode insert im Vergleich zur MyArrayList

A

public MyFastArrayList insert(E value, int idx){
if(this.used == this.vals.length){
E[] new_vals = (E[]) new Object[this.vals.length + MyFastArrayList.block];
System.arraycopy(this.vals, 0, new_vals, 0, idx);
System.arraycopy(this.vals, idx, new_vals, idx+1, this.vals.length - idx)
new_vals[idx] = value;
} else{
System.arraycopy(this.vals, idx, this.vals, idx+1, this.used - idx);
this.vals[idx] = value;
}

this.used++;
return this;
}

21
Q

Wie sieht die MyFastArrayList-Klasse aus?

A

public class MyFastArrayList<e> implements GenericList<e>{<br></br>private final static int block = 100;<br></br>private int = 0;<br></br>private E[] vals = (E[]) new Object[MyFastArrayList.block];</e></e>

}

22
Q

Wie wird die MyRecursiveList implementiert?

A

public class MyRecursiveListNode<e> implements GenericRecursiveList<e>{</e></e>

private E value;
private GenericRecursiveList<e> next = null;</e>

public MyRecursiveListNode(E value, GenericRecursiveList<e> next){<br></br>this.value = value;<br></br>this.next = next;<br></br>}</e>

}

23
Q

Wie ist bei der MyRecursiveList die insert-Methode implementiert?

A
@Override
public GenericRecursiveList<e> insert(E value, int idx){<br>if (idx==0){<br>return new MyRecursiveListNode(value, this);<br>} else {<br>this.next = this.next.insert(value, idx-1);<br>return this;<br>}<br>}</e>
24
Q

Was ist der Unterschied zwischen der MyFastArrayList und der MyFastDSArrayList?

A

Bei der MyFastArrayList gibt es einen Block, um den die Länge erhöht wird. Bei der DS ist es ein Prozentsatz.

25
Q

Wie sieht die doppekt verkettete Ringliste aus? (MyRingList)

A
public class MyRingList implements GenericList{
private static class ListNode {
private T value;
private ListNode prev = null;
private ListNode next = null;
private ListNode(){
this.value = null;
this.prev = this;
this.next = this;
}
private ListNode(T value, ListNode prev, ListNode next){
this.value = value;
this.prev = prev;
this.next = next;
}
}
private ListNode<e> first = new ListNode&lt;&gt;();<br>}</e>
26
Q

Was ist bei der MyRingList bei der insert-Methode zu beachten? Wie wird dies realisiert?

A

Es muss entschieden werden, ob vorwärts oder rückwärte gelaufen werden soll.

ListNode<e> curr = this.first;<br></br>if(idx &lt; (this.length / 2){<br></br>while (idx-- &gt; 0){<br></br>curr = curr.next;<br></br>}<br></br>ListNode<e> newnode = new ListNode&lt;&gt;(value, curr, curr.next);<br></br>curr.next.prev = newnode;<br></br>curr.next=newnode;<br></br>} else{<br></br>while (idx++ &lt; this.length){<br></br>curr = curr.prev;<br></br>}<br></br>...<br></br>}<br></br>++this.length;<br></br>return this;<br></br>}<br></br><br></br> </e></e>

27
Q

Wie wird das lookup im MyBSArraySet implementiert?
Vorweg: Welche Art Set wird per implements hinzugezogen?

A

GenericOrderedSet

public class MyBSArraySet<e>&gt; implements GenericOrderedSet<e>{<br></br><br></br>private int lookup(E key){<br></br>int low = 0;<br></br>int high = this.used - 1:<br></br>int mid = low + (high - low)/2;<br></br><br></br>while (low &lt;= high){<br></br>if(key.compareTo(this.vals[mid] == 0){<br></br>return mid;<br></br>}<br></br>if(key.compareTo(this.vals[mid] &gt; 0){<br></br>low = mid + 1;<br></br>} else {<br></br>high = mid - 1;<br></br>}<br></br>mid = low + (high- low)/2;<br></br><br></br>}<br></br>return -1;<br></br>}<br></br>}</e></e>

28
Q

Wie können in einem Heap (Array) der
- Parent
- linkes Kind
rechts Kind
bestimmt werden?

A
parent(i) = (i - 1) / 2
left\_child(i) = 2i + 1
right\_child(i) = 2i + 2
29
Q

Wieso werden Heaps (Array) nicht für binäre Suchbäume genutzt?

A

Binäre Suchbäume sind nicht immer vollständig belegt, weshalb es zu exponentiellem Speicherbedarf kommen würde. Siehe dazu Grafik.
Außerdem können Transformationen (bspw Rotationen) problematisch werden.

30
Q

Wie ermittelt heapify die Indices, bis zu denen er die heap-Eigenschaften prüfen muss?

A

(heap_size / 2)-1 bis 0

31
Q

Wie wird heapify implementiert?

A

private void heapify(int i){
int smallest = i;
int l = left_child(i);
int r = right_child(i);
if(l < this.heap_size && this.heap[l].compareTo(this.heap[smallest]) < 0){
smallest = l;
}
if(r < this.heap_size && this.heap[r].compareTo(this.heap[smallest] < 0){
smallest = r;
}
if(smallest != i){
E exchange = this.heap[i];
this.heap[i] = this.heap[smallest];
this.heap[smallest] = exchange;
this.heapify(smallest);
}
}

32
Q

Wie wird das HashSet implementiert?

A

private class MyHashSet<e> implements GenericSet<e>{<br></br><br></br>private static class BucketNode<t>{<br></br>private T key;<br></br>private BucketNode<t> next = null;<br></br><br></br>private BucketNode(T key, BucketNode<t> next){<br></br>this.key = key;<br></br>this.next = next;<br></br>}<br></br><br></br>private final static int init_buckets = 256;<br></br>private final static double load_factor = 0,5;<br></br>private BucketNode<e>[] buckets = <br></br>new BucketNode[MyHashSet.init_buckets];<br></br>private int size = 0;<br></br><br></br>private int hash(E key, int M){<br></br>return Math.abs(key.hashCode() % M);<br></br>}<br></br>/*...*/<br></br>}<br></br><br></br><br></br> </e></t></t></t></e></e>

}
}

33
Q

Wie wird bei den HashSets reorganize implementiert?

A

private BucketNode[] reorganize(BucketNode<e>[] old_buckets, int new_length){<br></br><br></br>BucketNode new_bucket​s = new BucketNode[new_length]:<br></br><br></br>for(int i = 0; i &lt; old_buckets.length; i++){<br></br>BucketNode<e> src = old_buckets[i];<br></br>while(src != null){<br></br>E key = src.key;<br></br>addToTable(new_buckets, key);<br></br>src = src.next;<br></br>}<br></br>}<br></br>return new_buckets;<br></br>}</e></e>

34
Q

Was ist bei der Vergrößerung eines HashSets zu beachten?

A

Die neue Länge des Arrays führt zu einer neuen Defintion des Hash-Algorithmus (bspw. bei Modulo relevant)

35
Q

Wie wird seek in Hash-Tabellen implementiert?

A

private BucketNode<e> seek(BucketNode<e>[] buckets, E key){<br></br>int hash = hash(key, buckets.length);<br></br>BucketNode<e> cn = buckets[hash];<br></br><br></br>while(cn != null &amp;&amp; !key.equals(cn.key)){<br></br>cn = cn.next;<br></br>}</e></e></e>

return cn;
}

36
Q

Wie sieht die Methode aus, die benutzt wird, um zu testen, ob ein Schlüssel in einem HashSet enthalten ist?

A

public boolean contains(key){
BucketNode<e> cn = seek(this.buckets, key);<br></br>return cn != null;<br></br>}</e>

37
Q

Wie wird addToTable in HashSets implementiert?

A

private int addToTable(BucketNode<e>[] buckets, E key){<br></br>int hash = hash(buckets, key);<br></br>BucketNode<e> cn = buckets[hash];</e></e>

if(cn == null){
buckets[hash] = new BucketNode<e>(key, null);<br>return 1;<br>} else if(!cn.key.equals(key)){<br>while(cn.next != null &amp;&amp; !cn.next.key.equals(key)){<br>cn = cn.next;<br>}<br>if(cn.next == null){<br>cn.next = new BucketNode(key, null);<br>return 1;<br>}</e>

}
return 0:
}

38
Q

Wie wird removeFromTable bzgl HashSets implementiert?

A

private int removeFromTable(BucketNode<e>[] buckets, E key){<br></br>int hash = hash(key, buckets.length);<br></br>BucketNode<cn> cn = buckets[hash];<br></br><br></br>if(cn == null){<br></br>return 0;<br></br>} else if(cn.key.equals(key)){<br></br>buckets[hash] = cn.next;<br></br>return 1;<br></br>};<br></br>while(cn.next != null &amp;&amp; !cn.next.key.equals(key){<br></br>cn = cn.next;<br></br>}<br></br>if(cn.next == null){<br></br>return 0;<br></br>} else{<br></br>cn.next = cn.next.next;<br></br>return 1;<br></br>}<br></br>}<br></br>}</cn></e>

39
Q

Wie wird die minimale Anzahl Schlüssel im 2-3-Baum berechnet?

A

2^H - 1

40
Q

Wie wird die maximale Anzahl Schlüssel im 2-3-Baum berechnet?

A

3^H - 1