Sto facendo alcune manipolazioni datetime e ho implementato un algoritmo veramente lento. Sto sperando in qualche miglioramento suggerito. Sto chiedendo qui (invece di StackOverflow) e mantenendo il linguaggio agnostico perché questa è una domanda sulla scelta dell'algoritmo giusto, non su come implementarlo.
La funzione ha tre input: MeasurementDates: DateTime [], EventDates: DateTime [], e Interval: Timespan.
Il tipo restituito è un int [] della stessa lunghezza di MeasurementDates. L'obiettivo è calcolare il numero di eventi dagli eventi che si sono verificati entro il tempo di intervallo prima delle date di misurazione.
Per contesto: diciamo che MeasurementDates sono le date in cui è registrato un prezzo azionario per alcune società e EventDates sono le date in cui la società è stata inclusa nelle notizie. Voglio calcolare un valore, "Numero di volte in cui la società era nelle notizie negli ultimi X giorni" come un potenziale predittore del prezzo delle azioni. (Questo è pensato per illustrare la funzione, non descrivere il caso di utilizzo reale.)
Esempio: passaggio in MeasurementDates = [3 agosto, 4 agosto, 5 agosto], EventDates = [2 agosto] e intervallo = (2 giorni) e mi aspettavo di ottenere [1,1,0] perché il il primo elemento di MeasurementDates ha un evento entro due giorni prima di esso, il secondo elemento di MeasurementDates ha un evento entro due giorni prima di esso e il terzo elemento ha zero eventi entro due giorni prima di esso.
Il mio algoritmo attuale funziona così:
define CountEventsWithinInterval(MeasurementDates, EventDates, Interval):
result := repeat(0, length(MeasurementDates))
for Event in EventDates:
bool[] toIncrement := MeasurementDates.map(event is within interval before date)
for i in 0:length(toIncrement):
if toIncrement[i]:
result[i] := result[i] + 1
return result
Questo produce il risultato corretto, ma è lento. Deve confrontare ogni data in MeasurementDates con ogni data in EventDates, risultando in O (m * n). Forse c'è un modo di usare l'ordinamento che impedisce all'algoritmo di confrontare ogni data in un input con ogni data nell'altro, o forse mi manca qualcosa del tutto.
Dato che MeasurementDates e EventDates sono probabilmente molto lunghi nella pratica (migliaia di voci), spero che manchi qualcosa che potrebbe far funzionare l'algoritmo più rapidamente.
L'ordine di MeasurementDates è già cronologico; EventDates può essere ordinato se ciò aiuta.