(Odpowiedź tutaj jako osobne pytanie dla posortowanych danych).
Jeśli dane były sortowane, można użyć VLOOKUP
z range_lookup
argumentem TRUE
(lub jest pominięty, ponieważ jest to ustawienie domyślne), która jest oficjalnie opisany dla programu Excel jako „szukaj przybliżonej meczu”.
Innymi słowy, dla posortowanych danych:
- ustawienie ostatniego argumentu tak, aby
FALSE
zwracał pierwszą wartość, oraz
- ustawienie ostatniego argumentu w celu
TRUE
zwrócenia ostatniej wartości.
Jest to w dużej mierze nieudokumentowane i niejasne, ale datuje się na VisiCalc (1979), a dziś ma co najmniej w Microsoft Excel, LibreOffice Calc i Arkuszach Google. Jest to ostatecznie spowodowane początkową implementacją LOOKUP
w VisiCalc (i stamtąd VLOOKUP
i HLOOKUP
), kiedy nie było czwartego parametru. Wartość znajduje się w wyszukiwaniu binarnym , z wykorzystaniem włączonej lewej granicy i wyłącznej prawej granicy (wspólna i elegancka implementacja), co powoduje takie zachowanie.
Technicznie oznacza to, że wyszukiwanie rozpoczyna się od przedziału kandydującego [0, n)
, gdzie n
jest długość tablicy, a warunkiem niezmiennym dla pętli jest to, że A[imin] <= key && key < A[imax]
(lewa granica to <= cel, prawa granica, która zaczyna się po końcu, to: > cel; w celu sprawdzenia poprawności albo sprawdź wartości w punktach końcowych przed, albo sprawdź wynik po), a następnie dzielenie na sekcje i wybranie dowolnej strony zachowuje ten niezmiennik: wykluczając jedną ze stron, dopóki nie dojdziesz do przedziału z 1 terminem [k, k+1)
, a algorytm następnie zwraca k
. To nie musi być dokładne dopasowanie (!): To tylko najbliższe dopasowanie od dołu. W przypadku zduplikowanych dopasowań powoduje to zwrócenie ostatniego dopasowania, ponieważ wymaga, aby następna wartość była większaniż klucz (lub koniec tablicy). W przypadku duplikatów trzeba pewne zachowania, a to jest rozsądne i łatwe do wdrożenia.
To zachowanie jest wyraźnie określone w starym artykule z bazy wiedzy Microsoft Knowledge Base (wyróżnienie dodane): „XL: Jak zwrócić pierwszy lub ostatni wynik w tablicy” ( Q214069 ):
Możesz użyć funkcji WYSZUKAJ (), aby wyszukać wartość w tablicy posortowanych danych i zwrócić odpowiednią wartość zawartą w tej pozycji w innej tablicy. Jeśli wartość wyszukiwania jest powtarzana w obrębie tablicy, zwraca ostatnie napotkane dopasowanie . To zachowanie dotyczy funkcji WYSZUKAJ.PIONOWO (), WYSZUKAJ.PIONOWO () i WYSZUKAJ ().
Poniżej przedstawiono oficjalną dokumentację niektórych arkuszy kalkulacyjnych; nie podano też zachowania „ostatniego dopasowania”, ale jest to sugerowane w dokumentacji Arkuszy Google:
Microsoft Excel
PRAWDA zakłada, że pierwsza kolumna w tabeli jest posortowana numerycznie lub alfabetycznie, a następnie wyszuka najbliższą wartość .
Arkusze Google :
Jeśli is_sorted
jest TRUE
lub zostało pominięte, zwracane jest najbliższe dopasowanie ( mniejsze lub równe kluczowi wyszukiwania)