Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
769,01 KB
Nội dung
Chương 2.1 Giải thuật tìm kiếm Võ Quang Hồng Khang Email: vqhkhang@gmail.com Mục tiêu Xác định vai trò tìm kiếm xếp hệ thống thơng tin Nắm vững minh họa giải thuật tìm kiếm tuyến tính tìm kiếm nhị phân mảng chiều Cài đặt giải thuật tìm kiếm ngôn ngữ C/C++ Suy nghĩ ? Tại hầu hết phần mềm phải có chức tìm kiếm xếp, mối quan hệ tìm kiếm xếp? Nhu cầu tìm kiếm xếp Thao tác tìm kiếm sử dụng nhiều hệ lưu trữ quản lý liệu Do liệu lớn nên tìm giải thuật tìm kiếm nhanh chóng mối quan tâm hàng đầu Để đạt điều liệu phải tổ chức theo thứ tự việc tìm kiếm nhanh chóng hiệu hơn, nhu cầu xếp liệu lưu ý Tóm lại, bên cạnh giải thuật tìm kiếm giải thuật xếp liệu thiếu hệ quản lý thơng tin máy tính Các giải thuật tìm kiếm Có giải thuật thường áp dụng: Tìm tuyến tính tìm nhị phân Đặc tả sau: a1 a2 a3 a4 a5 … an-1 aN Tập liệu lưu trữ dãy số a1, a2, ,aN Giả sử chọn cấu trúc liệu mảng để lưu trữ dãy số nhớ chính, có khai báo: int a[N]; Khố cần tìm x, khai báo sau: int x; Tìm kiếm tuyến tính Ý tưởng Lần lượt so sánh x với phần tử thứ nhất, thứ hai, mảng a gặp phần tử cần tìm, tìm hết mảng mà khơng thấy x Minh họa tìm x =10 10 12 41 10 32 13 15 3 10 Đã tìm Chưa thấy hếttại vịmảng trí Minh họa tìm x =25 Chưa hết Đã hết mảng mảng 25 12 41 10 32 13 15 3 10 Giải thuật Bước 1: i = 1; // phần tử dãy Bước 2: So sánh a[i] với x, có khả : a[i] = x : Tìm thấy Dừng a[i] != x : Sang Bước Bước 3: i = i+1; // xét tiếp phần tử kế mảng Nếu i >N: Hết mảng, khơng tìm thấy Dừng Ngược lại: Lặp lại Bước Nguyên tắc cài đặt hàm tìm kiếm Nếu có xuất phần tử có giá trị x trả vị trí tìm Ngược lại trả -1 Cài đặt int TimTuyenTinh(int a[], int N, int x) { int i=0; while ((i r: Kết thúc: Khơng tìm thấy m m 14 Giải thuật Bước 1: left = 1; right = N; //tìm kiếm tất phần tử Bước 2: mid = (left+right)/2; // lấy mốc so sánh So sánh a[mid] với x, có khả : a[mid] = x: Tìm thấy Dừng a[mid] > x: //tìm tiếp x dãy aleft amid -1 right =mid - 1; a[mid] < x: //tìm tiếp x dãy amid +1 aright left = mid + 1; Bước 3: Nếu left