Hiểu về tìm kiếm xấp xỉ trong Excel – một cách để tối ưu hóa tốc độ

Page 4 of 4

Cách xử lý nếu kết quả tìm kiếm trong mảng khớp với nhiều giá trị trùng lặp?

Tiếp tục với bài toán trên. Bây giờ, ta sẽ viết lại logic công thức:

=LOOKUP(1,{1;1;1;1;1;1;1},mảng tương ứng)

Hoặc, để dễ minh họa hơn, ta sẽ dùng MATCH trong trường hợp này:

=MATCH(1,{1;1;1;1;1;1;1},1)

Bạn nghĩ kết quả của hàm MATCH trên có phải là 4 (vị trí ở giữa theo quy tắc của Binary Search) không?

Câu trả lời là Không. Kết quả là 7, vị trí cuối cùng.

Tại sao lại là cuối cùng? Có phải nó rất mâu thuẫn với Binary Search?

Để làm rõ hơn, giờ ta sẽ có 1 mảng như này:

[1,1,1,1,1,0,1]

Khi thực hiện tìm kiếm với Binary Search, kết quả trả về là 5 (ngay bên trái số 0) thay vì 7 là giá trị cuối cùng. Bây giờ, thay vị trí trung tâm của mảng thành 2:

[1,1,1,2,1,0,1]

Kết quả trả về là 3, nằm ngay bên trái số 2.

Và khi thay vị trí trung tâm của mảng thành 0:

[1,1,1,0,1,0,1]

Kết quả là 7, vị trí cuối cùng.

Tại sao lại như vậy? Dưới đây sẽ là kết luận:

Mình đã đi hỏi rất nhiều bên, cả những moderator của Excel community cũng nói rằng phải xem xét vấn đề này vì nó thực sự không dễ để vừa trả lời vừa giữ bí mật về cách viết hàm. Tuy nhiên thì mình cũng có một assumption khá chính xác như sau:

Khi giá trị được tìm thấy trong mảng, công thức sẽ không dừng lại và trả ngay ra giá trị đó. Bởi mảng được sắp xếp sẽ có 1 tính chất đó là các giá trị trùng lặp nhau chắc chắn sẽ nằm cạnh nhau, nên công thức sẽ tiếp tục duyệt về bên phải để tìm các giá trị trùng lặp khác. Khi gặp một giá trị khác với giá trị đã tìm được, khi đó công thức sẽ trả về giá trị nằm gần nhất về bên trái.

Mình rút ra từ bài viết này: https://stackoverflow.com/a/13197618

Hình ảnh minh họa như sau:

Và đó là cách tìm kiếm xấp xỉ hoạt động. Các bạn đã rõ hơn chưa nào?

Tối ưu hóa tốc độ

Quên mất, còn lời khuyên. Mình có một số thứ rút ra như sau:

  1. Bởi Binary Search là thuật toán tìm kiếm nhanh hơn Linear Search, nên nếu dữ liệu của bạn có thể sắp xếp được và bạn kiểm soát được việc đó, hãy tìm kiếm xấp xỉ để đạt được tốc độ cao. Còn nếu bạn không thể kiểm soát được, hãy tiếp tục tìm kiếm chính xác (và có thể là cả nâng cấp phần cứng máy tính).
  2. Mình từng thấy một số bên sử dụng LOOKUP(1,1/…) thay vì LOOKUP(2,1/…). Lời khuyên của mình là dù cả hai cùng trả về kết quả ở vị trí cuối, hãy chọn phương án thứ hai, bởi vì trong 1 set dữ liệu lớn thì phương án 2 sẽ nhanh hơn phương án 1 đấy. Tại sao? Các bạn thử coi mỗi lần lặp là 1s, cho 1 triệu dòng dữ liệu, tính xem 2 phương án sẽ trả kết quả lần lượt trong bao nhiêu giây nào?

Đọc thêm những bài viết liên quan nhé:

Các hàm Lookup trong Excel: https://blog.hocexcel.online/ham-hlookup-nen-su-dung-hlookup-hay-index-ket-hop-match-se-hay-hon.html

LOOKUP nâng cao trong Excel: https://blog.hocexcel.online/tai-sao-ham-lookup-lai-tim-2-va-1-la-gi-9-99e307-la-gi.html

INDEX/MATCH trả về hình ảnh: https://blog.hocexcel.online/tai-sao-ham-lookup-lai-tim-2-va-1-la-gi-9-99e307-la-gi.html

Page

Tác giả: Minhlai

· · ·

Khóa học mới xuất bản