8. Testataufgaben
Abgabetermin: Donnerstag, 1. Februar 2024
Aufgaben: die Testataufgaben auf dieser Seite
Abgabeformat: Text, also vorzugsweise Latex.
Arithmetische Operationen
Im Kapitel 5 haben
wir Algorithmen für arithmetische Operationen kennengelernt.
Essenziell war dabei die Erkenntnis, dass für große natürliche
Zahlen der Datentyp int
nicht mehr ausreicht;
wir müssen sie als Array von byte
(oder int
)
darstellen.
Somit können Operationen wie x*y
auch nicht mehr in
einem Prozessortakt ausgeführt werden.
Man nennt eine solche Darstellung einen
BigInteger-Datentyp.
In Python werden große Zahlen intern bereits
als BigInteger dargestellt, ohne das wir als
Programmierer uns darum kümmern müssen.
Testataufgabe 8.1.1
Wie würden Sie die Exponentialfunktion
exp(a,b)
, die a**b
?
Schätzen Sie die Laufzeit Ihrer Implementierung mit der
Messen Sie empirisch die Laufzeit in Python: implementieren Sie
# die Datei exp.py
from timeMyPrograms import *
def exp(a,b):
return a*b
und messen dann die Laufzeit mit dem Modul timeMyPrograms.py:
python3 -i exp.py
measure_alg(exp, 2 1000)
Legen Sie eine kleine Tabelle an (Exponent 1000 wird wohl zu klein sein, um aussagekräftig zu sein) und versuchen Sie, zu erraten, um welche Laufzeitkomplexität es sich hier handelt.
Eine alternative Union-Find-Datenstruktur
Im Kapitel über billigste Spannbäume haben
wir Union-Find-Datenstrukturen kennengelernt.
Zur Erinnerung: meine
Folien zu
Union-Find with Path Compression. Wir hatten in der Vorlesung auch eine
alternative Datenstruktur diskutiert: jedes Element hat ein
Label, das beschreibt, zu welcher Klasse es gehört.
Wenn die Elemente die Zahlen
- Am Anfang setzen wir
, jedes Element ist also in seiner eigenen Klasse. -
Wir können feststellen, ob
und in der gleichen Klasse sind, indem wir prüfen, ob gilt. -
Um
durchzuführen, setzen wir und . Daraufhin gehen wir alle Elemente der Klasse durch und setzen das Label auf , also: . Hierfür brauchen wir pro Klasse noch eine verkettete Liste, die uns einfaches Durchlaufen und Hinzufügen ermöglicht.
Testataufgabe 8.1.2
Beschreiben Sie ein Szenario, in welchem
die obige Datenstruktur Union-Find by Label
schlechtes Laufzeitverhalten zeigt. Insbesondere
eine Folge von
Ändern Sie nun die Implementierung der Union-Operation:
- Für
setzen wir und . Daraufhin benennen wir alle Elemente der kleineren Klasse um.
Testataufgabe 8.1.3
Zeigen Sie, dass die Laufzeit bei
Billigste Wege in DAGs
Erinnern Sie sich: ein DAG, also directed acyclic graph,
ist ein gerichteter Graph ohne Kreise. In der Vorlesung
haben wir gesehen, wie das Problem der Edit Distance
formuliert werden kann als die Suche nach einem billigsten
Pfad in einem DAG. Der erste Algorithmus für Edit Distance
hatte Komplexität
Nun betrachten wir allgemeine DAGs
Testataufgabe 8.1.4
Beschreiben Sie einen Algorithmus zum Finden
billigster
Testataufgabe 8.1.5
Wir betrachten ungewichtete DAGs, also
Warum scheitert Ihr Algorithmus an allgemeinen (d.h. nicht azyklischen) Graphen?
Testataufgabe 8.1.6
In der Vorlesung haben wir einen Algorithmus gesehen,
der die Edit-Distanz zweier Wörter von Länge
Verallgemeinern Sie diesen Algorithmus für für das Szenario,
dass wir den wahren Wert