Thuật toán Tìm kiếm nhị phân (Binary Search)

Binary-Search-tim-kiem-nhi-phan-On-tap-cung-FSE
Chia sẻ bài viết này

Tìm kiếm nhị phân (Binary Search) là một thuật toán tìm kiếm nhanh với độ phức tạp trong thời gian chạy là Ο(log n). Thuật toán tìm kiếm này hoạt động theo nguyên tắc chia để trị. Để thuật toán này có thể hoạt động bình thường, việc thu thập dữ liệu phải ở dạng đã được sắp xếp.

Binary Search tìm kiếm một mục cụ thể bằng cách so sánh mục ở giữa nhất của bộ sưu tập. Nếu khớp xảy ra, thì chỉ mục của mục được trả về. Nếu mục ở giữa lớn hơn mục, thì mục đó được tìm kiếm trong mảng con bên trái của mục ở giữa. Mặt khác, mục được tìm kiếm sẽ nằm trong mảng phụ ở bên phải của mục ở giữa. Quá trình này cũng tiếp tục trên mảng con cho đến khi kích thước của mảng con giảm xuống bằng không.

Video bài giảng: Sức mạnh của thuật toán tìm kiếm nhị phân Binary Search – giảng viên Mai Thành Hiệp (top 4 Leetcode contributor)

Tìm kiếm nhị phân hoạt động như thế nào?

Để tìm kiếm nhị phân hoạt động, bắt buộc phải sắp xếp mảng mục tiêu. Chúng ta sẽ tìm hiểu quá trình tìm kiếm nhị phân với một ví dụ bằng hình ảnh. Sau đây là mảng đã sắp xếp của chúng ta và giả sử rằng chúng ta cần tìm kiếm vị trí của giá trị 31 bằng cách sử dụng tìm kiếm nhị phân.

binary_search_0

Đầu tiên, chúng ta sẽ xác định một nửa mảng bằng cách sử dụng công thức này:

mid = low + (high - low) / 2

Đây là 0 + (9 – 0 ) / 2 = 4 (giá trị nguyên là 4,5). Vì vậy, 4 là giữa của mảng.

binary_search_1

Bây giờ, chúng ta so sánh giá trị được lưu trữ tại vị trí 4, với giá trị đang được tìm kiếm, tức là 31. Chúng ta thấy rằng giá trị tại vị trí 4 là 27, giá trị này không khớp. Vì giá trị lớn hơn 27 và chúng ta có một mảng được sắp xếp, nên chúng ta cũng biết rằng giá trị đích phải nằm ở phần trên của mảng.

binary_search_2

Chúng ta thay đổi mức thấp thành mức trung bình + 1 và tìm lại giá trị mức trung bình mới.

low = mid + 1
mid = low + (high - low) / 2

Trung bình mới của chúng ta bây giờ là 7. Ta so sánh giá trị được lưu trữ tại vị trí 7 với giá trị mục tiêu 31.

binary_search_3

Giá trị được lưu trữ tại vị trí 7 không khớp, thay vào đó, nó lớn hơn mục tiêu tìm kiếm. Vì vậy, giá trị phải ở phần dưới từ vị trí này.

binary_search_4

Do đó, ta tính toán lại giữa. Lần này là 5.

binary_search_5

So sánh giá trị được lưu trữ tại vị trí 5 với giá trị mục tiêu. Ta thấy trùng khớp.

binary_search_6

Chúng ta kết luận rằng giá trị mục tiêu 31 được lưu trữ tại vị trí 5.

Tìm kiếm nhị phân giảm một nửa các mục có thể tìm kiếm và do đó làm giảm số lần so sánh được thực hiện với số lượng rất ít.

Pseudocode

Pseudocode của thuật toán binary search trông sẽ như thế này:

Procedure binary_search
   A ← sorted array
   n ← size of array
   x ← value to be searched

   Set lowerBound = 1
   Set upperBound = n 

   while x not found
      if upperBound < lowerBound 
         EXIT: x does not exists.
   
      set midPoint = lowerBound + ( upperBound - lowerBound ) / 2
      
      if A[midPoint] < x
         set lowerBound = midPoint + 1
         
      if A[midPoint] > x
         set upperBound = midPoint - 1 

      if A[midPoint] = x 
         EXIT: x found at location midPoint
   end while
   
end procedure

Nếu bạn muốn hiểu sâu hơn về Binary Search, đăng ký ngay lớp học thuật toán FSE Big Tech – học trực tiếp từ giảng viên hiện đang làm việc tại các công ty hàng đầu như Google, Amazon, TikTok, Booking, Grab!

Đăng ký nhận tin

Nhận bài viết hướng dẫn ôn luyện Coding Interview vào email của bạn

Bài viết cùng chủ đề

Chinh phục Big Tech interviews với khóa học FSE

Hàng trăm học viên hài lòng và có được công việc như ý.

offline-FSE

Khóa học System Design Interview (SDv2) sắp khai giảng

Days
Hours
Minutes
Seconds

LỚP DSA FOR CODING INTERVIEW

Cảm ơn bạn đã đăng ký!

ban-tay
Chỉ còn 1 bước để hoàn tất...

Chúng tôi sẽ liên hệ để hỗ trợ thanh toán học phí sớm nhất!

Trong khi đó, bạn có thể kết nối với FSE qua mạng xã hội:

HOTLINE hỗ trợ thanh toán: 0986284389

Messenger Chat