Voglio creare una tabella di ricerca per questi dati:
Le "variabili di input" (ciò che è usato per "cercare") sono 4 doppi differenti che possono assumere ciascuno 1 di 200 numeri (i numeri vanno da 1-1000 ma ci sono solo 200 numeri possibili che ognuno può essere ( questi 200 numeri possibili che ognuno di loro può essere sono noti a me)) i doppi sono tutti e 2 i decimali. Se uno qualsiasi dei quattro fosse cambiato, cambierebbe leggermente le variabili di output. C'è anche 1 intero (enum in realtà) che può assumere un valore compreso tra 1 e 5.
C'è una condizione su 3 delle variabili di input che (1 / x + 1 / y + 1 / z deve essere inferiore a 1.02). Potrebbe essere usato in un algoritmo di hashing?
Le "variabili di output" (cosa viene restituito) sono ~ 30 doppie (per lo più 2 cifre decimali, ma una ha 10 posizioni decimali). (sarà impacchettato in un oggetto) compreso tra 1 e 1000 (2 posizioni decimali).
Mi aspetto che ci siano ~ 150 milioni di record.
Devo usare un dizionario grande e caricarlo in memoria, quindi avvio il programma?
Un Database e LINQ sarebbero i migliori?
Posso usare Trees o Hashing in qualche modo per velocizzarlo?
Non ho mai dovuto creare una LUT così grande prima, in cui la velocità è un fattore importante.
Chiarificazione: a causa della condizione che (1 / x + 1 / y + 1 / z deve essere inferiore a 1,02, vedi sopra) ci sono solo ~ 150 milioni di combinazioni di variabili di input. Non ~ (200) ^ 4.
Aggiornamento:
Ho esaminato alcune statistiche (valori minimi e massimi osservati e scoperto alcune relazioni) per le mie variabili di input e ho scoperto che se chiamiamo i 4 input doppi A, B, C, D: A and B have ~200 possible values each,
C has ~50 possible values, and
D has ~120 possible values
Di questi, ci sono diverse relazioni che indicano che ci sono solo ~ 27 milioni di combinazioni di questi piuttosto che i ~ 150 milioni che avevo inizialmente pensato. Quindi ci saranno circa 27 milioni di record nella LUT. C'è anche sicuramente una relazione che non sono stato in grado di capire tra (A, B, C) e D che farà scendere anche il numero di combinazioni.
Sarebbe ottimale eseguire LUT da RAM ora che ho ridotto le voci da 150 a 27 milioni (e probabilmente inferiori)?
Ora che fino a 27 milioni li conserverebbero come interi moltiplicandoli per 100 (2 posizioni decimali), sarebbe ancora ottimale?
Poiché suggerito da DocBrown , dovrei memorizzare i doppi come valori (moltiplicarli per 100 perché hanno 2 posizioni decimali ) e quindi combinare i 5 diversi valori (4 doppi (vedi sopra) e 1 enum (valore: 1-5)) in un tasto per la LUT.
Come fare in modo che avrò un valore unico per ciascuna combinazione delle mie 5 variabili di input (i 5 ints) E questo metodo è aperto all'espansione di ciascuna delle variabili di input, cioè dovrei aver bisogno di espandere il doppio Le combinazioni di C a 70 anziché a 50 I avranno bisogno di valori chiave univoci per le nuove voci che sono il risultato del numero espanso di combinazioni totali delle variabili di input.