Hiểu về tìm kiếm xấp xỉ trong Excel – một cách để tối ưu hóa tốc độ
Khi sử dụng Excel, ta đã quá quen thuộc với những hàm tìm kiếm như VLOOKUP, HLOOKUP, INDEX/MATCH. Mới hơn nữa ta có XLOOKUP, XMATCH. Lâu đời hơn cả là LOOKUP. Các bạn có để ý rằng trong những hàm này đều có một tham số tùy chọn giữa “Exact” – tìm chính xác và “Approximate” – tìm xấp xỉ không? Trong bài viết này, Học Excel Online sẽ nói về tìm kiếm xấp xỉ. Hiểu được cách Excel thực hiện việc tìm kiếm này, các bạn sẽ biết thêm cách để tối ưu hóa tốc độ file.
Giới thiệu về tìm kiếm với hàm MATCH
Chúng ta sẽ đến với một hàm rất quen thuộc: MATCH.
=MATCH(lookup_value,lookup_array,[match_type])
MATCH sẽ trả về vị trí của một giá trị trong một mảng. Chẳng hạn ta có mảng:
["a","c","b","z","e","f","g"]
Ở đây, khi nhập hàm MATCH để tìm kiếm “b”, ta sẽ viết:
=MATCH("b",mảng_trên,0)
Kết quả trả về là 2, vì phần tử “b” ở vị trí thứ 2 từ trái sang.
Tại sao match_type bắt buộc lại là 0? Bởi vì theo như tài liệu của Microsoft cũng như theo “kinh nghiệm dân gian”, nếu bỏ trống hoặc điền 1/-1 thì kết quả trả về sẽ sai hoặc lỗi.
Giờ hãy đến với ví dụ tiếp theo.
Một ví dụ khác, ta có mảng:
[5,10,15,20,25,30]
Khi thực hiện tìm kiếm số 15 với MATCH, ta hoàn toàn có thể viết:
=MATCH(15,mảng_trên,0)
hoặc
=MATCH(15,mảng_trên)
hoặc
=MATCH(15,mảng_trên,1)
Cả 3 công thức trên đều trả về kết quả 3, chính là vị trí của số 15 trong mảng. Vậy tại sao trong trường hợp này lại có thể dùng match_type = 1?
Chúng ta đã biết rằng nếu để mặc định thì match_type sẽ được ngầm hiểu là 1, và theo như tài liệu của Microsoft, nếu tiến hành tìm kiếm “xấp xỉ” với tham số 1, mảng cần phải được sắp xếp theo thứ tự.
Quả vậy, nếu mảng của ta đổi thành [10,5,30,25,20,15] hoặc sắp xếp theo một thứ tự khác, thì tìm kiếm xấp xỉ sẽ bị sai.
Nhưng đã bao giờ bạn tự hỏi vì sao chưa?
Hãy đọc tiếp nhé.
Vì sao khi tìm kiếm xấp xỉ, ta cần phải sắp xếp dữ liệu từ nhỏ tới lớn hoặc từ lớn tới nhỏ?
Mình đã đi hỏi những người “trong ngành” và biết được một điều rằng, việc chọn match_type (cũng như lookup_type) giống như trigger một cái công tắc về lựa chọn thuật toán tìm kiếm.
Với type = 0, Excel sẽ sử dụng Linear Search.
Với type = 1, Excel sẽ sử dụng Binary Search.
Với các hàm như MATCH, XLOOKUP, XMATCH, ta có thêm tùy chọn -1, cũng vẫn là Binary Search với mảng được xếp ngược lại.
Các bạn có thể google 2 từ khóa trên để hiểu.
Và chính vì Binary Search chỉ hoạt động đúng khi mảng được sắp xếp từ nhỏ tới lớn, nên trong các tài liệu của Excel luôn yêu cầu ta phải sắp xếp như vậy để kết quả không sai.
Các bạn có thể ngừng đọc ở đây. Lý do đã được nêu lên rồi.
Nhưng tại sao không đào sâu thêm nữa nhỉ? Các bạn có hứng thú đọc tiếp chứ?
Phần dưới đây là một “nhận định” – assumption của mình. Gọi là nhận định vì Microsoft không chia sẻ tài sản sở hữu trí tuệ – intellectual property (cách các kĩ sư đã viết nên các hàm).