2012-04-12 6 views
1

Ich habe Daten wie folgt:berechnen maximale Summe von Werten über einen beliebigen Zeitraum 30 Tage

Date  Value 
2011-01-01 1 
2011-01-02 5 
2011-01-03 30 
    ..... 
2012-01-01 4 

ich die Frist von 30 Tagen innerhalb meiner Daten berechnet werden soll, die die maximale Summe von Werten hat.

Nicht sicher, ob meine Frage sinnvoll ist, da es ziemlich schwierig zu erklären ist, da ich keinen guten Mathematik-Kopf habe.

Dank Steve

+1

Welcher Teil stört Sie? Einen laufenden 30-Tage-Summenwert berechnen oder den Maximalwert finden? –

+0

Ich nehme an, das Datumsformat ist YYYY-MM-DD? Es macht sonst weniger Sinn. Sind die Daten in der Datumsreihenfolge und sind ihre fehlenden Daten? – gbulmer

+0

Danke für die Kommentare! Der Maximalwert ist was ich möchte. Das Datumsformat ist in JJJJ-MM-TT und ja die Daten sind in Datumsreihenfolge ohne fehlende Daten. –

Antwort

2

Dies sollte es für Sie tun. Es wird ein auf Null (0) basierendes Array-System angenommen.

 
sum <- 0 
for i = 0 to 29 
    sum <- sum + value(i) 

max <- sum 
start <- 0 

for i = 30 to value.lengh-1 
    sum <- sum - value(i-30) + value(i) 
    if sum > max then 
    max <- sum 
    start <- i-29 

Hier max enthält die maximale Summe von 30 aufeinander folgenden Werte und start enthält den Ausgangspunkt dieser 30 Tage max laufen.

+0

Danke dafür, ich habe diese Lösung und es funktioniert ein Vergnügen für mich. Ich muss noch weitere Tests machen, aber es ist das, wonach ich gesucht habe! –

1

Pseudo-Code:

MaxStartDate = FirstDate 
MaxTotal = -1 (something that is definitely below your possible total) 

for n=0 to lastDate-30 
{ 
    tempMax = 0 

    for m=n to n+29 
     tempMax = tempMax + date(m) 

    if tempMax > MaxTotal 
    { 
     MaxTotal = tempMax 
     MaxStartDate = date(n) 
    } 
} 

Wenn die for-Schleife beendet, MaxTotal Ihren höchsten 30 Tage insgesamt sein wird und MaxStartDate wird der erste Tag in der 30-Tage eingestellt werden.

+0

Der Code über meinem Beitrag ist eleganter, aber es hat einen Fehler und ich kann es nicht kommentieren .... am Ende start_date = Datum (i + 1) ist die richtige Zeile NOT start_date = Datum (30 + i) . –

0
for first 30 days in your data, compute the sum of all values 
let this be called as max_sum 
let start_date be the first date in the input data 

Loop 'i' from 1 to (total dates - 30) 
    temp_sum = (temp_sum + value of date (30+i) - value of date (i)) 
    if max_sum < temp_sum 
     max_sum = temp_sum 
     start_date= ith date 

Endwert von max_sum ist die maximale Summe von Werten über jede Frist von 30 Tagen mit start_date als Startpunkt.

+0

-1; Dies hat ein paar logische Fehler. Der erste, auf den Justin Paulson unten anspielt. Sie behalten auch nicht ständig eine laufende Summe von 30 Tagen; Die einzige Aktualisierung von max_sum erfolgt, wenn die Bedingung erfüllt ist und in vielen Fällen nicht erfüllt ist. Wenn Sie die Fehler beheben oder mich davon überzeugen, dass ich falsch liege, werde ich die -1 entfernen. – andand

Verwandte Themen