Proseminar
Programming Pearls
Algorithm Design Techniques
von Andreas Lenerz

Algorithmus A2

Die Zeit, die Algorithmus A1 benötigt, ist für wirklich große Probleme indiskutabel schlecht. Deshalb versucht man nun die Laufzeit von A1 zu verbessern. Dabei hilft einem die folgende Tatsache:

sum x[i..j] = sum x[i..j-1] + x[j]

Dies bedeutet, daß ich die Summe für i und j aus den davor bereits berechneten Werten von i und j-1 durch einfache Addition von x[j] bestimmen kann.

sum x[i..j-1]
x[i] x[i+1] x[i+2] ... x[j-2] x[j-1]
sum x[i..j]
x[i] x[i+1] x[i+2] ... x[j-2] x[j-1] x[j]

Wenn man diese Überlegung in einen neuen Algorithmus A2 einbaut, so kommt man zu folgenden Ergebnis.

Eingabe: Array rationaler Zahlen x der Länge n

Algorithmus A2:
max_so_far = 0
for i = [0,n)
sum = 0
for j = [i,n)
sum += x[j]
max_so_far = max( max_so_far , sum )

Erläuterung:
Weder die Anzahl noch die Benennung der Variablen hat sich im Vergleich zum Algorithmus A1 geändert, somit ist auch ihre eigentliche Bedeutung identisch geblieben. Lediglich die Art und Weise, wie die Summen der Teilarrays bestimmt werden, ist anders.
Anders als in der innersten ( roten ) Schleife von Algorithmus A1 werden hier die Summen der Teilarrays unter Ausnutzung der Tatsache von oben direkt in der j-Schleife vorgenommen, was die Einsparung der 3. und innersten for-Schleife zur Folge hat. ( Die rote Schleife wurde durch den roten Ausdruck ersetzt )

Laufzeit:
Auch hier kann man schnell erkennen, daß durch die Konstruktion mit 2 for-Schleifen, von denen jede maximal von 0 bis n-1 läuft, eine Laufzeit von O( n² ) errreicht wird.


Vorteile zu A1 Nachteile zu A1
  • bessere Laufzeit
  • komplizierter, da Tatsache von oben ersichtlich sein muß

Im Test ergab sich das folgenden Ergebnis:
Für 10.000 Werte benötigte A2 eine Zeit von: 1 sec 522 msec

--> Weiter zu den Beispielen
--> Weiter zu Algorithmus A3
--> Zurück zum Hauptmenü