Cài đặt được giải thuật tìm kiếm bằng ngôn ngữ C/C++... Nhu cầu tìm kiếm và sắp xếpTìm kiếm: Có trong hầu hết trong các hệ thống thông tin Muốn tìm kiếm nhanh và hiệu quả dữ liệu có
Trang 1Chương 2.1 Giải thuật
tìm kiếm
Trần Minh Thái
Email: minhthai@itc.edu.vn
Website: www.minhthai.edu.vn
Trang 2Cài đặt được giải thuật tìm kiếm bằng ngôn ngữ C/C++
Trang 4Nhu cầu tìm kiếm và sắp xếp
Tìm kiếm: Có trong hầu hết trong các hệ thống thông tin
Muốn tìm kiếm nhanh và hiệu quả dữ liệu có thứ tự sắp xếp
Trang 5Các giải thuật tìm kiếm
Có 2 giải thuật thường được áp dụng: Tìm tuyến tính và tìm nhị phân
Đặc tả:
Tập dữ liệu được lưu trữ là dãy số a 1 , a 2 , ,a N
Khai báo: int a[N];
Khóa cần tìm: int x;
Trang 6Tìm kiếm tuyến tính (Linear Search)
Ý tưởng
Lần lượt so sánh x với phần tử thứ nhất, thứ hai, của mảng a cho đến khi gặp được phần tử
cần tìm, hoặc hết mảng
Trang 7Tìm kiếm tuyến tính
Minh họa tìm x =10
Minh họa tìm x =25
Chưa hết mảng
Đã tìm thấy tại
vị trí 5
Đã hết mảng
Trang 8Giải thuật
Bước 1:
i = 1; // bắt đầu từ phần tử đầu tiên của dãy
Trang 9Nguyên tắc cài đặt hàm tìm kiếm
Nếu có xuất hiện phần tử có giá trị x thì trả
về vị trí tìm được
Ngược lại thì trả về -1
Trang 10return i; //a[i] là phần tử có khoá x }
Trang 1111
Trang 12return i; // tìm thấy x tại vị trí i }
Độ phức tạp tính toán cấp n: T(n)=O(n)
Trang 13Q & A
Trang 14Tìm kiếm nhị phân (Binary Search)
Ý tưởng
Áp dụng đối với dãy số đã có thứ tự
Mỗi bước tiến hành so sánh x với phần tử ở
giữa của dãy hiện hành để quyết định phạm
vi tìm kế tiếp
Trang 17Giải thuật
Bước 1: left = 1; right = N; //tìm kiếm tất cả các 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ó 3 khả năng :
Trang 19Q & A
Trang 20Code minh họa
#include <iostream.h>
#include<stdlib.h>
#include<time.h>
#define MAX 1000
void TaoMang(int a[], int N);
void XuatMang(int a[], int N);
int LinearSearch(int a[], int N, int x);
Trang 22void TaoMang(int a[], int N)
Trang 23int LinearSearch(int a[], int N, int x)
Trang 24Bài tập áp dụng
Viết chương trình tự động phát sinh ra mảng có giá trị ngẫu nhiên có thứ tự tăng dần; nhập vào giá trị cần tìm x; in ra vị trí xuất hiện của x
(nếu có) và số lần so sánh với mỗi phương
pháp tìm kiếm: tuyến tính và nhị phân
Trang 25Bài tập lý thuyết
LT1_1: Cho dãy số sau:
Cho biết vị trí tìm thấy và số lần so sánh để tìm được phần tử có giá trị x = 6 khi áp dụng giải thuật tìm kiếm: tuyến tính và nhị phân
LT1_2: Xây dựng giải thuật tìm kiếm phần tử
có giá trị nhỏ nhất trong dãy số: Dùng mã tự nhiên, mã giả và lưu đồ
Trang 26Bài tập lý thuyết – Hướng dẫn
LT1_1: Tìm x = 6
i=1 (a[i]=3) x Tăng vị trí i
i=2 (a[i]=4) x Tăng vị trí i
i=3 (a[i]=6) = x Dừng, trả về vị trí i (3)
Tìm x theo phương pháp tuyến tính
Trang 27Bài tập lý thuyết – Hướng dẫn
Trang 28Q & A
Trang 29Bài tập lý thuyết – Hướng dẫn LT1_2
Trang 30Bài tập lý thuyết – Hướng dẫn LT1_2
Trang 31Bài tập lý thuyết – Hướng dẫn LT1_2
Trang 32Q & A