(Menjawab di sini karena tidak ada pertanyaan terpisah untuk data yang diurutkan.)
Jika data yang diurutkan, Anda bisa menggunakan VLOOKUP
dengan range_lookup
argumen TRUE
(atau dihilangkan, karena itu default), yang secara resmi dijelaskan untuk Excel sebagai "mencari pertandingan perkiraan".
Dengan kata lain, untuk data yang diurutkan:
- mengatur argumen terakhir untuk
FALSE
mengembalikan nilai pertama , dan
- mengatur argumen terakhir untuk
TRUE
mengembalikan nilai terakhir .
Ini sebagian besar tidak berdokumen dan tidak jelas, tetapi tanggal untuk VisiCalc (1979), dan hari ini memegang setidaknya dalam Microsoft Excel, LibreOffice Calc, dan Google Sheets. Hal ini pada akhirnya karena pelaksanaan awal LOOKUP
di VisiCalc (dan dari situ VLOOKUP
dan HLOOKUP
), ketika tidak ada parameter keempat. Nilai ditemukan oleh pencarian biner , menggunakan terikat kiri inklusif dan terikat kanan eksklusif (implementasi umum dan elegan), yang menghasilkan perilaku ini.
Secara teknis ini berarti bahwa seseorang memulai pencarian dengan interval kandidat [0, n)
, di mana n
panjang array, dan kondisi loop invarian adalah bahwa A[imin] <= key && key < A[imax]
(batas kiri adalah <= target, batas kanan, yang dimulai satu setelah akhir, adalah > target; untuk memvalidasi, baik memeriksa nilai pada titik akhir sebelumnya, atau memeriksa hasil setelah), dan berturut-turut membagi dua dan memilih pihak mana saja yang mempertahankan invarian ini: dengan mengesampingkan satu sisi akan, sampai Anda mencapai interval dengan 1 term [k, k+1)
,, dan Algoritma kemudian kembali k
. Ini tidak perlu kecocokan persis (!): Itu hanya kecocokan terdekat dari bawah. Dalam hal duplikat pertandingan, ini menghasilkan mengembalikan pertandingan terakhir , karena mengharuskan nilai berikutnya lebih besardaripada kunci (atau akhir array). Dalam kasus duplikat Anda memerlukan beberapa perilaku, dan ini masuk akal dan mudah diimplementasikan.
Perilaku ini dinyatakan secara eksplisit dalam artikel Pangkalan Pengetahuan Microsoft yang lama ini (penekanan ditambahkan): "XL: Cara Mengembalikan Pertandingan Pertama atau Terakhir dalam Array" ( Q214069 ):
Anda dapat menggunakan fungsi LOOKUP () untuk mencari nilai dalam array data yang diurutkan dan mengembalikan nilai terkait yang terkandung dalam posisi itu dalam array lain. Jika nilai pencarian diulang dalam array, itu mengembalikan kecocokan terakhir yang ditemui . Perilaku ini berlaku untuk fungsi VLOOKUP (), HLOOKUP (), dan LOOKUP ().
Dokumentasi resmi untuk beberapa spreadsheet mengikuti; tidak dalam perilaku "pertandingan terakhir" yang dinyatakan, tetapi tersirat dalam dokumentasi Google Sheets:
Microsoft Excel
TRUE mengasumsikan kolom pertama dalam tabel diurutkan baik secara numerik atau alfabet, dan kemudian akan mencari nilai terdekat .
Google Sheets :
Jika is_sorted
ini TRUE
atau dihilangkan, pertandingan terdekat ( kurang dari atau sama dengan kunci pencarian) dikembalikan