(Trả lời ở đây vì không có câu hỏi riêng cho dữ liệu được sắp xếp.)
Nếu dữ liệu đã được sắp xếp, bạn có thể sử dụng VLOOKUP
với range_lookup
đối số TRUE
(hoặc được bỏ qua, vì đó là mặc định), được mô tả chính thức cho Excel là "tìm kiếm kết quả gần đúng".
Nói cách khác, đối với dữ liệu được sắp xếp:
- thiết lập đối số cuối cùng để
FALSE
trả về giá trị đầu tiên và
- thiết lập đối số cuối cùng để
TRUE
trả về giá trị cuối cùng .
Điều này phần lớn không có giấy tờ và tối nghĩa, nhưng có từ VisiCalc (1979) và ngày nay có ít nhất là trong Microsoft Excel, LibreOffice Calc và Google Sheets. Cuối cùng là do việc triển khai ban đầu LOOKUP
trong VisiCalc (và từ đó VLOOKUP
và HLOOKUP
), khi không có tham số thứ tư. Giá trị được tìm thấy bằng tìm kiếm nhị phân , sử dụng ràng buộc bên trái và ràng buộc phải độc quyền (một triển khai phổ biến và thanh lịch), dẫn đến hành vi này.
Về mặt kỹ thuật, điều này có nghĩa là người ta bắt đầu tìm kiếm với khoảng thời gian ứng cử viên [0, n)
, trong đó n
độ dài của mảng và điều kiện bất biến vòng lặp là A[imin] <= key && key < A[imax]
(giới hạn bên trái là <= mục tiêu, giới hạn bên phải, bắt đầu một sau khi kết thúc, là > mục tiêu; để xác thực, kiểm tra các giá trị tại các điểm cuối trước hoặc kiểm tra kết quả sau) và liên tiếp chia đôi và chọn bất kỳ bên nào bảo tồn bất biến này: bằng cách loại trừ một bên sẽ, cho đến khi bạn đạt được một khoảng thời gian với 1 điều khoản [k, k+1)
và thuật toán sau đó trả về k
. Đây không phải là một trận đấu chính xác (!): Đây chỉ là trận đấu gần nhất từ bên dưới. Trong trường hợp trùng khớp, kết quả này sẽ trả về kết quả khớp cuối cùng , vì nó yêu cầu giá trị tiếp theo phải lớn hơnhơn khóa (hoặc cuối mảng). Trong trường hợp trùng lặp, bạn cần một số hành vi, và điều này là hợp lý và dễ thực hiện.
Hành vi này được nêu rõ ràng trong bài viết Cơ sở tri thức Microsoft cũ này (nhấn mạnh thêm): "XL: Cách trả lại kết quả đầu tiên hoặc cuối cùng trong một mảng" ( Q214069 ):
Bạn có thể sử dụng hàm LOOKUP () để tìm kiếm một giá trị trong một mảng dữ liệu được sắp xếp và trả về giá trị tương ứng có trong vị trí đó trong một mảng khác. Nếu giá trị tra cứu được lặp lại trong mảng, nó sẽ trả về kết quả khớp cuối cùng gặp phải . Hành vi này đúng với các hàm VLOOKUP (), HLOOKUP () và LOOKUP ().
Tài liệu chính thức cho một số bảng tính theo sau; không phải là hành vi "trận đấu cuối cùng" được nêu, nhưng nó được ngụ ý trong tài liệu Google Sheets:
Microsoft Excel
TRUE giả định cột đầu tiên trong bảng được sắp xếp theo số hoặc bảng chữ cái và sau đó sẽ tìm kiếm giá trị gần nhất .
Google Sheets :
Nếu is_sorted
được TRUE
hoặc bỏ qua, kết quả khớp gần nhất ( nhỏ hơn hoặc bằng khóa tìm kiếm) được trả về