Trova l'indice dell'oggetto più vicino al valore, ma è anche inferiore al valore

1

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.

    
posta itsme86 07.08.2013 - 22:20
fonte

1 risposta

2

Ciò richiede una semplice ricerca binaria: solo invece di restituire un errore quando i limiti convergono senza un hit, si restituisce l'indice più basso successivo. (A meno che il numero totale di valori sia così piccolo da poter essere facilmente inserito nella memoria), una cache completa è la strada da percorrere.)

    
risposta data 07.08.2013 - 22:45
fonte

Leggi altre domande sui tag