TÌM KIẾM NHỊ PHÂN

Một phần của tài liệu cau truc du lieu va giai thuat giaotrinh cuuduongthancong com (Trang 120 - 122)

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 định nửa cần tìm. Đầu tiên, so sánh giá trị cần tìm với giá trị của phần tử ở giữa. Nếu nó nhỏ hơn, 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.

4 5 6 7

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 cau truc du lieu va giai thuat giaotrinh cuuduongthancong com (Trang 120 - 122)

Tải bản đầy đủ (PDF)

(153 trang)