(Rispondere qui come nessuna domanda separata per i dati ordinati.)
Se i dati sono stati ordinati, è possibile utilizzare VLOOKUP
con l' range_lookup
argomento TRUE
(o omesso, poiché è l'impostazione predefinita), che è ufficialmente descritta per Excel come "ricerca di una corrispondenza approssimativa".
In altre parole, per i dati ordinati:
- impostando l'ultimo argomento su
FALSE
restituisce il primo valore, e
- impostando l'ultimo argomento su
TRUE
restituisce l' ultimo valore.
Questo è in gran parte privo di documenti e oscuro, ma risale a VisiCalc (1979), e oggi detiene almeno in Microsoft Excel, LibreOffice Calc e Fogli Google. Alla fine è dovuto all'implementazione iniziale di LOOKUP
in VisiCalc (e quindi VLOOKUP
e HLOOKUP
), quando non c'era un quarto parametro. Il valore viene rilevato dalla ricerca binaria , utilizzando il limite sinistro inclusivo e il limite destro esclusivo (un'implementazione comune ed elegante), che determina questo comportamento.
Tecnicamente questo significa che si avvia la ricerca con l'intervallo candidato [0, n)
, dove si n
trova la lunghezza dell'array, e la condizione invariante del loop è che A[imin] <= key && key < A[imax]
(il limite sinistro è <= il bersaglio, il limite destro, che inizia uno dopo la fine, è > il target; per convalidare, controllare i valori agli endpoint prima o verificare il risultato dopo), e successivamente bisecare e scegliere qualunque lato preservi questo invariante: per esclusione un lato lo farà, fino ad arrivare ad un intervallo con 1 termine [k, k+1)
, e il l'algoritmo quindi ritorna k
. Non è necessario che sia una corrispondenza esatta (!): È solo la corrispondenza più vicina dal basso. In caso di corrispondenze duplicate, ciò comporta la restituzione dell'ultima corrispondenza, in quanto richiede che il valore successivo sia maggiorerispetto alla chiave (o alla fine dell'array). In caso di duplicati è necessario un comportamento, e questo è ragionevole e facile da implementare.
Questo comportamento è esplicitamente indicato in questo vecchio articolo della Microsoft Knowledge Base (enfasi aggiunta): "XL: Come restituire la prima o l'ultima corrispondenza in un array" ( Q214069 ):
È possibile utilizzare la funzione LOOKUP () per cercare un valore all'interno di un array di dati ordinati e restituire il valore corrispondente contenuto in quella posizione all'interno di un altro array. Se il valore di ricerca viene ripetuto all'interno dell'array, restituisce l'ultima corrispondenza rilevata . Questo comportamento è vero per le funzioni VLOOKUP (), HLOOKUP () e LOOKUP ().
Segue la documentazione ufficiale per alcuni fogli di calcolo; né viene indicato il comportamento "last match", ma è implicito nella documentazione di Fogli Google:
Microsoft Excel
VERO presuppone che la prima colonna della tabella sia ordinata in ordine numerico o alfabetico e quindi cercherà il valore più vicino .
Fogli Google :
Se is_sorted
è TRUE
o omesso, viene restituita la corrispondenza più vicina ( minore o uguale alla chiave di ricerca)