(Beantwortung hier als keine separate Frage für sortierte Daten.)
Wenn die Daten wurden sortiert, könnten Sie VLOOKUP
mit dem range_lookup
Argument TRUE
(oder weggelassen wird , da es die Standardeinstellung), die offiziell für Excel beschrieben wird als „für ungefähre Übereinstimmung finden“.
Mit anderen Worten für sortierte Daten:
- Setzen des letzten Arguments,
FALSE
um den ersten Wert zurückzugeben, und
- Wenn Sie das letzte Argument so einstellen, dass
TRUE
der letzte Wert zurückgegeben wird.
Dies ist weitgehend undokumentiert und unklar, stammt jedoch aus VisiCalc (1979) und gilt heute zumindest für Microsoft Excel, LibreOffice Calc und Google Sheets. Dies ist letztendlich auf die anfängliche Implementierung LOOKUP
in VisiCalc (und von dort VLOOKUP
und HLOOKUP
) zurückzuführen, als es keinen vierten Parameter gab. Der Wert wird durch binäre Suche unter Verwendung von inklusive linker und exklusiver rechter Grenze (eine übliche und elegante Implementierung) gefunden, was zu diesem Verhalten führt.
Technisch bedeutet dies, dass man die Suche mit dem Kandidatenintervall startet [0, n)
, wobei n
die Länge des Arrays ist, und die schleifeninvariante Bedingung ist, dass A[imin] <= key && key < A[imax]
(die linke Grenze ist <= das Ziel, die rechte Grenze, die eine nach dem Ende beginnt, ist > das Ziel (zu validieren, entweder die Werte an den Endpunkten vorher oder das Ergebnis danach zu überprüfen) und nacheinander die Seite zu halbieren und auszuwählen, die diese Invariante beibehält: durch Ausschluss wird eine Seite, bis Sie zu einem Intervall mit 1 Term kommen [k, k+1)
, und die Der Algorithmus kehrt dann zurück k
. Dies muss keine exakte Übereinstimmung (!) Sein: Es ist nur die engste Übereinstimmung von unten. Bei doppelten Übereinstimmungen wird die letzte Übereinstimmung zurückgegeben, da der nächste Wert größer sein mussals der Schlüssel (oder das Ende des Arrays). Im Falle von Duplikaten benötigen Sie ein gewisses Verhalten, das sinnvoll und einfach zu implementieren ist.
Dieses Verhalten wird in diesem alten Microsoft Knowledge Base-Artikel explizit angegeben (Hervorhebung hinzugefügt): "XL: Zurückgeben der ersten oder letzten Übereinstimmung in einem Array" ( Q214069 ):
Mit der Funktion LOOKUP () können Sie nach einem Wert in einem Array sortierter Daten suchen und den entsprechenden Wert an dieser Position in einem anderen Array zurückgeben. Wenn der Suchwert innerhalb des Arrays wiederholt wird, wird die zuletzt gefundene Übereinstimmung zurückgegeben . Dieses Verhalten gilt für die Funktionen VLOOKUP (), HLOOKUP () und LOOKUP ().
Offizielle Dokumentation für einige Tabellenkalkulationen folgt; In beiden Fällen wird das Verhalten "Letzte Übereinstimmung" nicht angegeben, es ist jedoch in der Google Sheets-Dokumentation enthalten:
Microsoft Excel
TRUE geht davon aus, dass die erste Spalte in der Tabelle entweder numerisch oder alphabetisch sortiert ist, und sucht dann nach dem nächstgelegenen Wert .
Google Sheets :
Wenn is_sorted
ist TRUE
oder weggelassen wird , das nächste Spiel ( kleiner oder gleich dem Suchschlüssel) zurückgegeben