| 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