Tìm nhị phân.

Một phần của tài liệu Thuật toán và một số thuật toán sơ cấp (Trang 27 - 28)

1. CHIA ĐỂ TRỊ Mở đầu

1.2. Tìm nhị phân.

Bài tốn: Giả sử T[n] là mảng sắp thứ tự tăng và x là phần tử nào đĩ. Tìm vị trí để chèn

x vào T sao cho T vẫn là mảng sắp thứ tự.

Cụ thể là ta muốn tìm chỉ số i sao cho 0  i <= n và T[i-1] <= x < T[i] với quy ước logic là T[-1]=- và T[n]=+ . Khi   đĩ vị trí để chèn x vào T là i.

Theo cách tiếp cận chia để trị ta sẽ chia phạm vi tìm kiếm thành 2 phần và xác định sẽ tiếp tục tìm kiếm ở phần nào. Do tính chất sắp thứ tự tăng của mảng nên ta thấy:

- Nếu với chỉ số i nào đĩ mà T[i] < =x thì với mọi chỉ số j < i ta cũng cĩ T[j] <= x. Khi đĩ nếu k là vị trí chèn x thì k > i

- Nếu với chỉ số i nào đĩ mà x < T[i] thì với mọi chỉ số j > i ta cũng cĩ T[j] > x. Khi đĩ nếu k là vị trí chèn x thì k <= i

Quá trình tìm kiếm sẽ được thực hiện bằng cách chia phạm vi đang tìm kiếm là [d,c] bởi vị trí g thành 2 phần cĩ kích thước gần bằng nhau.

Nếu như x > T[g] thì phạm vi tìm kiếm tiếp tục sẽ là [g= +1,c]. Ngược lại, nếu x T[g] thì phạm vi tìm kiếm tiếp tục sẽ là [< d,g]. Thuật tốn cĩ thể mơ tả như sau:

int TimNP2(int T[n],int int int x); { i, j, If (i==j&&T[i]< x) { return i+1; } Else {

g=(i+j)/ 2;

if ( < T[g]) { return TimNP2(T,i,g,x) } x else { return TimNP2(T,g+1,j,x); } } }

ban đầu vì vậy ta khơng cần kết hợp các lời giải của các bài tốn con. Nếu như phần tử x cĩ trong mảng thì vị trí chèn x vào mảng tìm được theo thuật tốn này sẽ là vị trí xuất hiện cuối cùng của x (nếu cĩ nhiều giá trị bằng x) trong mảng.

Một phần của tài liệu Thuật toán và một số thuật toán sơ cấp (Trang 27 - 28)

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

(71 trang)