23.06.2013 Aufrufe

aktuelle Version des Vorlesungsskripts - ZIB

aktuelle Version des Vorlesungsskripts - ZIB

aktuelle Version des Vorlesungsskripts - ZIB

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!