Diciamo che ho una matrice ordinata di ints in questo modo:
int[] numbers = new[] { 10, 20, 27, 30, 55, 70 };
Qual è il modo più efficiente, dato un valore, per trovare il valore in quell'array (o l'indice di esso) che è più vicino al valore ma non è maggiore del valore?
Ad esempio, dato il valore 26, restituirebbe il 20.
Si noti che i valori nella matrice vengono assegnati dinamicamente una volta all'avvio del programma, ma non cambieranno per la durata del programma.
La soluzione semplice che sto usando ora è questa:
int GetNumber(int value)
{
foreach (int number in numbers)
{
if ((value -= number) <= 0)
return number;
}
return -1;
}
Funziona, ma non è estremamente veloce. Spero che ci sia un qualche tipo di algoritmo che mi permetta di "mappare" valori a intervalli o qualcosa che renderà le ricerche più veloci.
Se è utile sapere, ho utilizzato semplici esempi nel mio esempio, ma il progetto reale su cui sto lavorando è una specie di spazio di memoria segmentato in cui ciascuno dei segmenti è adiacente, ma di varie dimensioni. Questo algoritmo mi permetterebbe di passare un indirizzo di memoria e recuperare il segmento di memoria corrispondente.
Questo è il metodo attuale attualmente in uso:
public MappedMemoryArea GetArea(int address)
{
foreach (MappedMemoryArea area in _areas)
{
if (address < area.Size)
return area;
address -= area.Size;
}
return null;
}
Ho il pieno controllo del tipo MappedMemoryArea, quindi se aggiungere una proprietà ad esso sarebbe vantaggioso per questo scopo, è totalmente fattibile.