CÁC THUẬT TOÁN SẮP XẾP VÀ TèM KIẾM 3.1 Cỏc thuật toỏn tỡm kiếm
3.1.2. Tỡm nhị phõn 1 Giải thuật
3.1.2.1. Giải thuật
Đối với những dóy số đó cú thứ tự (giả sử thứ tự tăng), cỏc phần tử trong dóy cú quan hệ ai-1 ≤ ai ≤ ai+1, từ đú kết luận được nếu x > ai thỡ x chỉ cú thể xuất hiện trong đoạn [ai+1, aN] của dóy, ngược lại nếu x < ai thỡ x chỉ cú thể xuất hiện trong đoạn [a1, ai-1] của dóy. Giải thuật tỡm nhị phõn ỏp dụng nhận xột trờn đõy để tỡm cỏc giới hạn phạm vi tỡm kiếm sau mỗi lần so sỏnh x với một phần tử trong dóy.
í tưởng của giải thuật là tại mỗi bước tiến hành so sỏnh x với phần tử nằm ở giữa của dóy tỡm kiếm hiện hành, dựa vào kết quả so sỏnh này để quyết định giới hạn dóy tỡm kiếm ở bước kế tiếp là nửa trờn hay nửa dưới của dóy tỡm kiếm hiện hành.
Gọi x là giỏ trị cần tỡm, a là mảng chứa cỏc giỏ trị dữ liệu gồm N phần tử đó sắp xếp tăng dần, left và right là chỉ số đầu và cuối của đoạn cần tỡm, midle là chỉ số của phần tử nằm giữa của đoạn cần tỡm. Cụng việc tỡm kiếm được tiến hành như sau:
Bước 1: Khởi đầu xỏc định vựng tỡm kiếm trờn tất cả cỏc phần tử ban đầu
left := 1; right := N; dóy cỏc phần tử là aleft..aright
Bước 2: gỏn midle := Int((left+right)/2); So sỏnh a[midle] với x, cú 3 khả năng :
* a[midle] = x : Tỡm thấy. Dừng
* a[midle] > x : Tỡm tiếp giỏ trị x trong dóy con aleft..amidle-1 với right := midle – 1;
* a[midle] < x: Tỡm tiếp giỏ trị x trong dóy con amidle+1..aright với left := midle + 1;
Bước 3:
Nếu left < right : Dóy tỡm kiếm hiện hành vẫn cũn phần tử. Lặp lại bước 2.
Ngược lại : Dóy tỡm kiếm hiện hành hết phần tử. Dừng.
Thuật toỏn trờn cũng chỉ đơn giản sử dụng một vũng lặp để duyệt qua cỏc phần tử trong mảng. Tuy nhiờn, vũng lặp này sẽ khụng duyệt qua hết tất cả cỏc phần tử như đối với tỡm kiếm tuyến tớnh. Tư tưởng của thuật toỏn này cũng giống như đối với tỡm kiếm tuyến tớnh, nghĩa là khi kết thỳc vũng lặp cũng cú 2 khả năng xảy ra:
- Chỉ số left vẫn cũn bộ hơn hoặc bằng chỉ số right. Điều này cú nghĩa là đó cú một phần tử nào đú bằng với giỏ trị x cần tỡm, cụ thể là giỏ trị của phõn tử middle. Do đú, hàm sẽ trả về giỏ trị nằm trong biến middle.
- Chỉ số left đó bằng hoặc vượt qua chỉ số right, nghĩa là đó duyệt qua hết cỏc phần tử trong mảng mà khụng tỡm thấy phần tử nào cú giỏ trị bằng x.
3.1.2.2. Đỏnh giỏ thuật toỏn
Trường hợp giải thuật tỡm nhị phõn ta cú bảng phõn tớch sau:
Trường hợp Số lần so sỏnh Giải thớch
Tốt nhất 1 Phần tử giữa của mảng ban đầu cúgiỏ trị x. Xấu nhất log2 N Phần tử cần tỡm nằm ở cuối mảng
Trung bỡnh log2 N/2 Giả sử xỏc xuất cỏc phần tử trongmảng nhận giỏ trị x là như nhau.
Nhận xột
Giải thuật tỡm nhị phõn phụ thuộc vào thứ tự của cỏc phần tử trong mảng để định hướng trong quỏ trỡnh tỡm kiếm, do vậy chỉ ỏp dụng được cho những dóy đó cú thứ tự.
Thuật toỏn tỡm kiếm nhị phõn tiết kiếm thời gian hơn rất nhiều so với giải thuật tỡm tuyến tớnh do Onhị phõn(log2n) < Otuyến tớnh(n). Tuy nhiờn khi muốn ỏp dụng giải thuật tỡm nhị phõn cần phải xột đến thời gian sắp xếp dóy số để thỏa điều kiện dóy số cú thứ tự, thời gian này khụng nhỏ, và khi dóy số biến động cần phải tiến hành sắp xếp lại, … tất cả cỏc nhu cầu đú tạo ra khuyết điểm chớnh cho giải thuật tỡm nhị phõn.