aktuelle Version des Vorlesungsskripts - ZIB
aktuelle Version des Vorlesungsskripts - ZIB
aktuelle Version des Vorlesungsskripts - ZIB
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
4 Komplexitätstheorie und Speicherung von Graphen<br />
Entfernungstabelle in einem Autoatlas definiert ein konkretes Beispiel für das Travelling-<br />
Salesman-Problem.<br />
Aus mathematischer Sicht kann man es sich einfach machen: Ein Problem ist die<br />
Menge aller Problembeispiele. Das Travelling-Salesman-Problem ist also die Menge aller<br />
TSP-Instanzen. Das ist natürlich nicht sonderlich tiefsinnig, vereinfacht aber die mathematische<br />
Notation.<br />
Wir sagen, dass ein Algorithmus Problem Π löst, wenn er für je<strong>des</strong> Problembeispiel<br />
I ∈ Π eine Lösung findet. Das Ziel <strong>des</strong> Entwurfs von Algorithmen ist natürlich, möglichst<br />
„effiziente“ Verfahren zur Lösung von Problemen zu finden.<br />
Um dieses Ziel mit Inhalt zu füllen, müssen wir den Begriff „Effizienz“ meßbar machen.<br />
Mathematiker und Informatiker haben hierzu verschiedene Komplexitätsmaße definiert.<br />
Wir werden uns hier nur mit den beiden für uns wichtigsten Begriffen Zeit- und Speicherkomplexität<br />
beschäftigen. Hauptsächlich werden wir über Zeitkomplexität reden.<br />
Es ist trivial, dass die Laufzeit eines Algorithmus abhängt von der „Größe“ eines Problembeispiels,<br />
d. h. vom Umfang der Eingabedaten. Bevor wir also Laufzeitanalysen anstellen<br />
können, müssen wir beschreiben, wie wir unsere Problembeispiele darstellen, bzw.<br />
kodieren wollen. Allgemein kann man das durch die Angabe von Kodierungsschemata<br />
bewerkstelligen. Da wir uns jedoch ausschließlich mit Problemen beschäftigen, die mathematisch<br />
darstellbare Strukturen haben, reicht es für unsere Zwecke aus, Kodierungsvorschriften<br />
für die uns interessierenden Strukturen anzugeben. Natürlich gibt es für jede<br />
Struktur beliebig viele Kodierungsmöglichkeiten. Wir werden die geläufigsten benutzen<br />
und merken an, dass auf diesen oder dazu (in einem spezifizierbaren Sinn) äquivalenten<br />
Kodierungsvorschriften die gesamte derzeitige Komplexitätstheorie aufbaut.<br />
Ganze Zahlen kodieren wir binär. Die binäre Darstellung einer nicht-negativen ganzen<br />
Zahl n benötigt ⌈log2(|n|+1)⌉ Bits (oder Zellen). Hinzu kommt ein Bit für das Vorzeichen.<br />
Die Kodierungslänge 〈n〉 einer ganzen Zahl n ist die Anzahl der zu ihrer Darstellung<br />
notwendigen Bits, d. h.<br />
〈n〉 := ⌈log2(|n| + 1)⌉ + 1. (4.1)<br />
Jede rationale Zahl r hat eine Darstellung r = p<br />
mit p, q ∈ Z, p und q teilerfremd und<br />
q > 0. Wir nehmen an, dass jede rationale Zahl so dargestellt ist, und können daher<br />
gegeben ist durch<br />
sagen, dass die Kodierungslänge von r = p<br />
q<br />
q<br />
〈r〉 := 〈p〉 + 〈q〉.<br />
Wir werden im Weiteren auch sagen, dass wir eine ganze oder rationale Zahl r in einem<br />
Speicherplatz (oder Register) speichern, und wir gehen davon aus, dass der Speicherplatz<br />
für r die benötigten 〈r〉 Zellen besitzt.<br />
Die Kodierungslänge eines Vektors x = (x1, . . . , xn) T ∈ Q n ist<br />
〈x〉 :=<br />
n<br />
〈xi〉,<br />
i=1<br />
und die Kodierungslänge einer Matrix A ∈ Q (m,n) ist<br />
m n<br />
〈A〉 := 〈aij〉.<br />
60<br />
i=1 j=1