1 .GIỚI THIỆU
2. MỘT SỐ GIẢI THUẬT TÌM KIẾM
2.3 TÌM KIẾM NHỊ PHÂN
Cùng xem xét vấn đề tìm kiếm một từ trong một cuốn từ điển. Bước đầu nhảy trực tiếp tới giữa cuốn và so sánh. Nếu từ cần tìm được tìm thấy ngay ở vị trí này thì kết thúc việc tìm kiếm. Ngược lại nếu từ cần tìm nhỏ hơn (theo thứ tự từ điển) thì ta chỉ cần tìm trên nửa trái của cuốn từ điển hoặc nếu từ cần tìm lớn hơn thì chỉ cần tìm trên nửa phải. Việc tìm kiếm cho nửa trái hoặc phải được áp dụng giống như trên. Giải thuật tìm kiếm nhị phân làm việc dựa trên nguyên tắc này.
24
Mơ phỏng: với khóa nKey = 8
Sau đây là hàm tìm kiếm nhị phân áp dụng trên dãy số nguyên được sắp xếp tăng dần // Binary Search Algorithm
int binarySearch (int arrInt[], int n, int nKey) {
int nLeft = 0; int nRight = n – 1; int nMid;
while (nLeft <= nRight) {
nMid = (nLeft + nRight) / 2; if (arrInt[nMid] == nKey)
return nMid;
else if (arrInt[nMid] < nKey) nLeft = nMid + 1;
else nRight = nMid – 1; }
return –1; }
Độ phức tạp: O(logn), bởi vì chúng ta ln ln chỉ phải tìm trên một nửa của dữ liệu tại mỗi bước.
25
1. Hãy cải tiến giải thuật tìm kiếm tuyến tính để có thể liệt kê tất cả các vị trí xuất hiện của khóa tìm kiếm.
2. Viết chương trình nhập vào một dãy A gồm n số thực (n<100), nhập vào dãy số B gồm m số thực (m<100).
a. Viết hàm in ra những phần tử chỉ xuất hiện trong dãy A mà không xuất hiện trong dãy B.
b. Viết hàm in ra những phần tử xuất hiện ở cả hai dãy
3. Tìm và xóa hết các phần tử có giá trị x ở trong mảng A có n phần tử
4. Dựa trên ý tưởng của giải thuật tìm kiếm nhị phân cho mảng M gồm n phần tử. Viết chương trình cho phép in ra số lần chia đôi dãy và in ra các các khoảng chứa giá trị cần tìm x trong mỗi lần chia đơi mảng của giải thuật tìm kiếm nhị phân
Ví dụ: Mảng M: 2 3 5 6 8 9 11 Tìm x=2;
Chương trình phải in ra là:
- Số lần chia đôi mảng là : 2
- Lần 1 : x=2 nằm trong đoạn [0..2] // mid = 3 - Lần 2: x=2 nằm trong đoạn [0..0] // mid =1
// CHU Ý: KHI X= M[MID] THI NGUNG CHIA MANG
5. Viết chương trình cho phép tìm kiếm một sinh viên (masv, hoten, dtb) có xuất hiện trong một danh sách của một lớp học hay không?
Yêu cầu:
- Khai báo CTDL
- Viết hàm Nhập, xuất danh sách sinh viên
- Tìm kiếm một sinh viên có tên là x có xuất hiện trong danh sách hay khơng (sử dụng giải thuật tìm kiếm tuần tự) sau đó sửa điểm trung bình của sinh viên đó thành y.
26
- Tìm kiếm một sinh viên có tên là x có xuất hiện trong danh sách hay khơng (sử dụng giải thuật tìm kiếm nhị phân) sau đó xóa sinh viên đó ra khỏi danh sách.
6. Hãy viết hàm tìm dãy con tăng dài nhất của mảng một chiều a có n phần tử (dãy con là một dãy liên tiếp các phần của a).
7. Viết chương trình cho phép nhập vào từ bàn phím 1 dãy số ngun, lưu trữ nó trong một danh sách có thứ tự tăng dần, theo cách sau: Với mỗi phần tử được nhập vào chương trình phải tìm vị trí thích hợp để xen nó vào danh sách cho đúng thứ tự.
27