AlgoDat Selbsttest (01) (Stefan Bosse) [14.2.2025]

AlgoDat Selbsttest (01)

Dieser Selbsttest dient der Vorbereitung auf die Klausur.

AlgoDat Selbsttest (01)
Inhalte
Pseudonotation
Variablen und Aggregation
Operationen
Funktionen und Prozeduren
Kontrollstrukturen
Hilfsfunktionen
Eingaben
Tabellen
Listen
Bäume
Graphen
Numerik
Textsuche
Sort by Hand

Inhalte

Zusammenfassung der Themen (gemäß Vorlesungsmaterial und Konzepte/Methoden aus den Übungen):

  1. Grundlagen der Algorithmenmodelle (Modul A,C)
  2. Tabellen (Modul H)
  3. Numerische Verfahren: Vektoren und Matrizen (Modul B)
  4. Listen (Modul L)
  5. Bäume (Modul T)
  6. Graphen (Modul G)
  7. Sortierverfahren (Modul S)
  8. Datenbanken (nicht prüfungsrelevant, Modul DB)
  9. Reguläre Ausdrücke und Textsuche (prüfungsrelevant, Modul X)

In der Klausur wird nicht programmiert, mit Ausnahme von algorithmischen Beschreibungen in einem wie nachfolgend eingeführten Pseudokode (quasi JavaScript light, Abweichungen sind erlaubt).

Pseudonotation

Das Semikolon ist nur zur Trennung von Anweisungen in gleicher Zeile notwendig und kann i.A. weggelassen werden.

Variablen und Aggregation

Variablen und Aggregationen werden ohne Schlüsselwort, Datentypen und Typsignatur eingeführt ("on-the-fly").

// Zuweisung mit Ausdruck ε
x=ε
// ε: Ausdrücke wie in Java!
ε := number | variable | (operand +.*/%<>== operand) | functioncall ...
// Arrays
x=vector(N); x=array(N); x=array(N,init); x=[ε,ε,ε...]
fill(x,0)
// Zugriff auf Element
x[index]
// Structures
x={a:ε,b:ε,...}
// Zugriff auf Attribut/Element
x.attribute

Zeiger auf Elemente werden direkt durch Angabe eines Variablenamens ausgedrückt. Ein Nullzeiger wird mit null belegt.

Beispiel

o1 = { x:0, y:0, child:null }
o2 = { x:1, y:1, child:o1 }

Arrays können hier statisch aber leer mit array(n) und dann durch indizierte Zuweisung erzeugt werden. Die Indizierung beginnt immer mit Null (erstes Element).

Beispiel

table=array(4)
table[0]=...
table[1]=...
imag = { re:1, im:2 }
function Imag(re,im) { return { re:re, im:im }}
image = Imag(1,2)

Operationen

a + - * / b: Addition, Subtraktion, Multiplikation, Division
a % n : Modulo n
a & | b : Logische (bitstellige) Operationen
a && || b : Boolesche Operationen
-a ~a !a: Numerische Negation, logische Negation, Boolesche Negation

Funktionen und Prozeduren

function foo(arg1,arg2,..) {
  ...
  return ε
}
// Aufruf
foo(ε,ε,...)

Es gibt in der Pseudonotation keine Klassen, Objekte und Methoden. Daher werden hier alle Daten prozedural verarbeitet. Datentstrukturen werden mit Funktionen erstellt. Das Schlüsselwort function kann auch weggelassen werden.

Beispiel:

// JAVA
public class Node {
  Data data;
  int key;
  Node more;
  ...
  public Node(Data data,int key) {
    this.data=data;
    this.key=key;
    ...
  }
  public void insert(...) {

  }
}
// Pseudo
function Node(data,key) { return {data:data,key:key,more:null} }
node=Node("Hello",12)
function insert(node,...) { ... } 

Kontrollstrukturen

for(index=ε;εCond(index);index=ε(index) {
  ...
  break; continue
}
for(element in object) { ... }
while (εCond) { .. }
do { .. } while (εCond)
if (ε) { } else { }
switch (ε) {
  case v: ... break
  default: ...
}

Komplexere Operationen als Platzhalter im Algorithmus können textuell beschrieben werden. Besser ist es aber Erkärungen als Kommentare (//) einzufügen.

Hilfsfunktionen

I.a. nicht notwendig, aber nützlich:

array(n)     : Erzeuge statisches Array mit n Elementen (leer)
head(o)      : Kopfelement eines Arrays 
length(o)    : Anzahl der Elemente in einem Array
slice(0,a,b) : Teil eines Arrays [a,b]
tail(o)      : Rest eine Arrays ohne Kopfelement

Eine Pseudonotation ist nicht standardisiert sondern dient als (konsequentes) Muster Algorithmen in ihrem wesentlichen Verhalten, Wirkung auf Daten und Aktionen zu beschreiben. Der Pseudocode, häufig mathematische Basisnotation, kann mit textuellen Passagen ergänzt sein um komplexe Berechnungen auf das Wesentliche zu reduzieren. Es ist nicht notwendig sich strikt an eine bestimmte Notation zu halten, nur konsequent sollte man sein, also z.B. statt {x:1} kann man auch {x=1} schreiben. Abweichungen sind immer zulässig!

Eingaben

  1. Programmkode in Pseudonotation (im eingebetteten Editor). Der Programmkode wird gespeichert.
  2. Textuelle Lösungen (im Eingabefeld). Der Text wird gespeichert.
  3. Grafische Skizzen. Dazu ist ein einfacher Freihand Zeicheneditor eingebettet. Auf das Doppelkasten Symbol klicken um die Zeichnung zu bearbeiten. Es kann die Stiftbreite und die Stiftfarbe eingestellt werden. Undo - und Redo funktionieren mit beliebiger Tiefe und die Historie bleibt auch nach der Speicherung erhalten! Mit Print kann optional die Grafik lokal gespeichert werden. Das Bild wird gespeichert und kann später auch weiter bearbeitet werden..


Tabellen

Aufgabe 1. Welche Vor- und welche Nachteile haben lineare Tabellen als Datenstruktur, auch bezüglich Saklierbarkeit (wachsendes N) und den elementaren Operationen Einfügen, Löschen und Suchen?


Aufgabe 2. Geben Sie für folgende Tabelle eine programmatische Erzeugung in Pseudonotation an (mit Datenstrukturen über Erzeugungsfunktionen, Arrays, und Einfügeoperation)


a b c y
0 0 0 0
0 1 0 1
0 0 1 1
1 0 1 0

Programm um obige Tabelle zu erzeugen

dGFibGU9YXJyYXkoNCkKZnVuY3Rpb24gUm93KGEsYixjLHkpIHsgcmV0dXJuIHsgYTphLGI6YixjOmMseTp5IH19CmZ1bmN0aW9uIGluc2VydFJvdyhyb3cpIHsgdGFibGVbbGVuZ3RoW3RhYmxlXV09cm93IH19Cmluc2VydFJvdyhSb3coMCwwLDAsMCkpCmluc2VydFJvdyhSb3coMCwxLDAsMSkpCmluc2VydFJvdyhSb3coMCwwLDEsMSkpCmluc2VydFJvdyhSb3coMSwwLDEsMCkp

Listen

Aufgabe 3. (1) Beschreiben Sie die Eigenschaften und das Prinzip von einfach verketteten Listen. (2) Wie sieht ein Element, (3) wie der Zugang zu der Liste aus?


Aufgabe 4. Beschreiben Sie in Pseudonotation die Datenstruktur einer einfach verketteten Liste (Knoten Node und Liste List1 selber). Sowohl Knoten als auch die Liste sollen durch Funktionen erzeugt werden. Überlegen Sie was als administrative Datenstruktur bei einer Liste wirklich nur benötigt wird. Ein Knotenelement enthält neben der Verknüpfungsstruktur noch data und key als Elemente.


ZnVuY3Rpb24gTm9kZShkYXRhLGtleSkgeyByZXR1cm4geyBkYXRhOmRhdGEsa2V5OmtleSxuZXh0Om51bGwgfX0KZnVuY3Rpb24gTGlzdDEoaGVhZCkgeyByZXR1cm4geyBoZWFkOmhlYWQgfQ==

Aufgabe 5. Stellen Sie eine einfach verkettete Liste graphisch dar. Es sollen die Elemente mit ("Hello",10), ("World", 12), ("Joe",5) verkettet werden, dabei hat das Tupel die Inhalte (data,key). Ein Knoten soll dabei alle Elemente der Datenstruktur enthalten.

 ⧉ 

#paint0

Aufgabe 6. Geben Sie die Komplexitätsklasse für die Operationen "Einfügen am Anfang", "Einfügen in der Mitte" und "Suche" an. Es ist immer von dem "worst case" auszugehen.


Aufgabe 7. Implementieren Sie in Pseudonotation die Suchfunktion in einer einfach verketteten Liste. Erstens mit einer Schleife und zweitens mit einer Rekursion. Es soll nach einem numerische Schlüssel key gesucht werden und die Daten des gefundenen Knotens zurück gegeben werden. Der Zugang zur Liste erfolgt über das Kopfelement.


ZnVuY3Rpb24gTm9kZShkYXRhLGtleSkgeyByZXR1cm4geyBkYXRhOmRhdGEsa2V5OmtleSxuZXh0Om51bGwgfX0KZnVuY3Rpb24gTGlzdChoZWFkKSB7IHJldHVybiB7IGhlYWQ6aGVhZCB9CmZ1bmN0aW9uIHNlYXJjaExvb3AoaGVhZCxrZXkpIHsKICBub2RlPWhlYWQKICB3aGlsZSAobm9kZSAmJiBub2RlLmtleSE9a2V5KSBub2RlPW5vZGUubmV4dAogIHJldHVybiBub2RlP25vZGUuZGF0YTtudWxsCn0KZnVuY3Rpb24gc2VhcmNoUmVjdShub2RlLGtleSkgewogIGlmIChub2RlICYmIG5vZGUua2V5IT1rZXkpIHNlYXJjaFJlY3Uobm9kZS5uZXh0LGtleSkKICByZXR1cm4gbm9kZT9ub2RlLmRhdGE7bnVsbCAKfQ==

Bäume

Aufgabe 8. (1) Durch welche Eigenschaften ist ein Binärbaum definiert, auch im Unterschied zu einer Liste? (2) Welchen Vorteil bietet die Verwendung eines Binärbaums gegenüber eine einfach verketteten Liste?


Kreuze richtige Feststellungen an


Graphen

Aufgabe 9. Zeichnen Sie einen ungerichteten Syntaxgraphen (zweistellige binäre Knoten) für folgden Ausdruck. Ein Knoten ist dabei entweder eine Operation, eine Variable, oder eine Konstante. Die Kanten bestimmen die Bindung von Werten oder Teilausdrücken mit Operationen (also z.B. +). Jede Operation ist binär, d.h. hat maximal zwei Operanden. Komplexere Ausrücke müssen zerlegt werden.

(x+y)*(x-y)+2
 ⧉ 

#paint0

Numerik

Aufgabe 10. Implementieren Sie nachfolgende Berechnung der Differenzierung mit einem einfachen numerischen festen Delta Algorithmus und zwei Stützstellen.

\[ {f}'{\left({x}\right)}=\frac{{{d}{f}}}{{{\left.{d}{x}\right.}}} \]

ZnVuY3Rpb24gZGVyaXYoZix4LGRlbHRhKSB7CiAgcmV0dXJuIChmKHgrZGVsdGEpLWYoeCkpL2RlbHRhCn0=

Textsuche

Reguläre Ausdrücke. Allgemeine Form: /.../, Konstante und zusammenhängende Textmuster: abcd, Alternative: x|y (entweder x oder y), Sequenz: x* (kein mal, einmal, oder mehrmals x), x+ (einmal oder mehrmals x). Probieren Sie es aus: https://regex101.com

Aufgabe 11. Es gibt eine Sprache mit dem Alphabet {0,1}. Es sollen in einer Folge von Zeichen mit diesem Alphabet zusammenhängende Folgen 000, 111, und 101 gefunden werden. (1) Gebe einen regulären Ausdruck an der alle Vorkommen dieser drei Sequenzen findet. (2) Aber wo könnten Folgen "übersehen" werden bzw. könntes es Mehrdeutigkeiten geben? (3) In einer zweiten Suchen sollen alle zusammenhängenden Folgen mit mindestens zwei Ziffern, die entweder ausschließlich aus der Ziffer 0 oder ausschliesschlich aus der Ziffer 1 bestehen, gefunden werden.


Regulärer Ausdruck

cmVnZXgxPS8wMDB8MTAxfDExMS9nCnJlZ2V4Mj0vMFswXSt8MVsxXSsvZw==

Aufgabe 12. Zeichnen Sie für den regulären Ausdruck /00|11/ ein Zustandsübergangsdiagramm für einen endlichen Zustandsautomaten (EZA). Die Knoten des EZA beinhalten einen unterscheidbaren Zustand (numeriert, 1,2,3...) und die Kanten werden mit der nächsten Eingabe aus einem Eingabestrom von Textzeichen annotiert. Beachten Sie das fehlende "g" am Ende des RA. Zwischenzustände werden mit einem Kreis, Endzustände (Muster gefunden) mit einem Quadrat symbolisch dargestellt. Der Startzustand ist Nummer 1.

Beispiel für /abcd/:

#label

 ⧉ 

#paint0

Sort by Hand

Aufgabe 13. Sortieren Sie schrittweise das nachfolgende Array aufsteigend nach dem Bubblesort Verfahren (links kleinstes, rechts größtes Element). Sortieren Sie bis die Folge sortiert ist. Geben Sie jeden Durchlauf an, auch wenn sich nichts ändert. In jeder Zeile steht das Ergebnis eines Einzelschrittes. Markiere das Ende eines Durchlaufs mit einer Leerzeile. Die erste Zeile ist schon Bestandteil der Sortierung. Tipp: Nach der Eingabe in einem Feld der Tabelle (auf das Feld doppelt klicken) kann einfach mit der Tabulatortaste in das nächste Feld gewechselt werden.

BubbleSort von [ 2 , 7 , 1 , 9 , 5 , 3 , 5 , 4 ]
WyAyLCA3LCAxLCA5LCA1LCAzLCA1LCA0IF0KWyAyLCAxLCA3LCA5LCA1LCAzLCA1LCA0IF0KWyAyLCAxLCA3LCA5LCA1LCAzLCA1LCA0IF0KWyAyLCAxLCA3LCA1LCA5LCAzLCA1LCA0IF0KWyAyLCAxLCA3LCA1LCAzLCA5LCA1LCA0IF0KWyAyLCAxLCA3LCA1LCAzLCA1LCA5LCA0IF0KWyAyLCAxLCA3LCA1LCAzLCA1LCA0LCA5IF0KLS0tLQpbIDEsIDIsIDcsIDUsIDMsIDUsIDQsIDkgXQpbIDEsIDIsIDcsIDUsIDMsIDUsIDQsIDkgXQpbIDEsIDIsIDUsIDcsIDMsIDUsIDQsIDkgXQpbIDEsIDIsIDUsIDMsIDcsIDUsIDQsIDkgXQpbIDEsIDIsIDUsIDMsIDUsIDcsIDQsIDkgXQpbIDEsIDIsIDUsIDMsIDUsIDQsIDcsIDkgXQpbIDEsIDIsIDUsIDMsIDUsIDQsIDcsIDkgXQotLS0tClsgMSwgMiwgNSwgMywgNSwgNCwgNywgOSBdClsgMSwgMiwgNSwgMywgNSwgNCwgNywgOSBdClsgMSwgMiwgMywgNSwgNSwgNCwgNywgOSBdClsgMSwgMiwgMywgNSwgNSwgNCwgNywgOSBdClsgMSwgMiwgMywgNSwgNCwgNSwgNywgOSBdClsgMSwgMiwgMywgNSwgNCwgNSwgNywgOSBdClsgMSwgMiwgMywgNSwgNCwgNSwgNywgOSBd


Created by the NoteBook Compiler Ver. 1.36.2 (c) Dr. Stefan Bosse (Fri Feb 14 2025 18:27:07 GMT+0100 (Central European Standard Time))