Proseminar | |
Programming Pearls | |
Algorithm Design Techniques | |
von Andreas Lenerz | |
Algorithmus A3
Eine andere Überlegung führt zu einer weiteren Möglichkeit, das gestellte Problem zu lösen:
Array x |
|
|||||||
Array h |
|
mit:
h[-1] = 0
h[i] = sum x[0..i]
Der Hilfsarray speichert auf seinem i-ten Element jeweils die Summe des Teilarrays x[0..i]. Er besitzt die Größe n+1, wobei das zusätzliche Element als x[-1] zur Verfügung steht ( Dies dient lediglich zu Anschauungszwecken und ist für eine Implementierung in dieser Form natürlich nicht geeignet )
Was kann man nun mit diesem Hilfsarray machen ?
Aber wenn man nun weiterhin erkennt, daß
sum x[i..j] = h[j] - h[i-1]
gilt, für 0 <= i <= j <= n , also die Summe der Teilarrays über die Hilfsunktion bestimmt werden kann, so kommt man zu folgendem Algorithmus.
Eingabe: Array rationaler Zahlen x der Länge n
Algorithmus A3: | ||||
cumarr[-1] = 0 | ||||
for i = [0,n) | ||||
| ||||
max_so_far = 0 | ||||
for i = [0,n) | ||||
|
Erläuterung:
cumarr[i] | die Bezeichnung des Hilfsarrays h von oben. cumarr kommt von "cumulated array". h[-1] = 0 wird benötigt, alls der rote Ausdruck mit i=0 aufgerufen wird. |
cumarr[i-1] | x[0]+x[1]+x[2]+...+x[i-2]+x[i-1] |
cumarr[j] | x[0]+x[1]+x[2]+...+x[i-2]+x[i-1] + x[i]+x[i+1]+...+x[j-1]+x[j] |
cumarr[j] - cumarr[i-1] | x[i]+x[i+1]+x[i+2]+...+x[j-1]+x[j] = sum x[i..j] |
Vorteile zu A1 | Nachteile zu A1/A2 |
|
|
Im Test ergab sich das folgenden Ergebnis:
Für 10.000 Werte benötigte A2 eine Zeit von: 1 sec 773 msec