TÌM KIẾM NHỊ PHÂN

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2013): Phần 2 (Trang 27 - 29)

Trong trường hợp số bản ghi cần tìm rất lớn, việc tìm kiếm tuần tự có thể là 1 giải pháp không hiệu quả về mặt thời gian. Một giải pháp tìm kiếm khác hiệu quả hơn có thểđược sử dụng dựa trên mô hình “chia để trị” như sau: Chia tập cần tìm làm 2 nửa, xác định nửa chứa bản ghi cần tìm và tập trung tìm kiếm trên nửa đó.

Để làm được điều này, tập các phần tử cần phải được sắp, và sử dụng chỉ số của mảng để xác

tiến hành tìm ở nửa đầu dãy, ngược lại, tiến hành tìm ở nửa sau của dãy. Qúa trình được lặp lại tương tự cho nữa dãy vừa được xác định này.

Hàm tìm kiếm nhị phân được cài đặt như sau (giả sử dãy a đã được sắp):

int binary_search(int *a, int x){ int k, left =0, right=n-1; do{

k=(left+right)/2; if (x<a[k]) right=k-1; else l=k+1;

}while ((x!=a[k]) && (left<=right)) if (x=a[k]) return k;

else return -1; }

Trong thủ tục này, x là giá trị cần tìm trong dãy a. Hai biến left và right dùng để giới hạn phân

đoạn của mảng mà quá trình tìm kiếm sẽđược thực hiện trong mỗi bước. Đầu tiên 2 biến này được gán giá trị 0 và n-1, tức là toàn bộ mảng sẽđược tìm kiếm.

Tại mỗi bước, biến k sẽđược gán cho chỉ số giữa của đoạn đang được tiến hành tìm kiếm. Nếu giá trị x nhỏ hơn giá trị phần tử tại k, biến right sẽđược gán bằng k-1, cho biết quá trình tìm tại bước sau sẽđược thực hiện trong nửa đầu của đoạn. Ngược lại, giá trị left được gán bằng k+1, cho biết quá trình tìm tại bước sau sẽđược thực hiện trong nửa sau của đoạn.

06 17 25 32 49 53 61 98

Xét 1 ví dụ với dãy đã sắp ở trên, để tìm kiếm giá trị 61 trong dãy, ta tiến hành các bước như

sau:

Bước 1: Phân chia dãy làm 2 nửa, với chỉ số phân cách là 3.

0 1 2 3 4 5 6 7

06 17 25 32 49 53 61 98

Giá trị phần tử tại chỉ số này là 32, nhỏ hơn giá trị cần tìm là 61. Do vậy, tiến hành tìm kiếm phần tử tại nửa sau của dãy.

Bước 2: Tiếp tục phân chia đoạn cần tìm làm 2 nửa, với chỉ số phân cách là 5.

49 53 61 98

Giá trị phần tử tại chỉ số này là 53, nhỏ hơn giá trị cần tìm là 61. Do vậy, tiến hành tìm kiếm phần tử tại nửa sau của đoạn.

Bước 3: Tiếp tục phân chia đoạn, với chỉ số phân cách là 6.

6 7

61 98

Giá trị phần tử tại chỉ số này là 61, bằng giá trị cần tìm. Do vậy, quá trình tìm kiếm kết thúc, chỉ số cần tìm là 6.

Thuật toán tìm kiếm nhị phân có thời gian thực hiện là lgN. Tuy nhiên, thuật toán đòi hỏi dãy

đã được sắp trước khi tiến hành tìm kiếm. Do vậy, nên áp dụng tìm kiếm nhị phân khi việc tìm kiếm phải thực hiện nhiều lần trên 1 tập phần tử cho trước. Khi đó, ta chỉ cần tiến hành sắp tập phần tử 1 lần và thực hiện tìm kiếm nhiều lần trên tập phần tửđã sắp này.

Một phần của tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật (2013): Phần 2 (Trang 27 - 29)