Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 2: Giải thuật tìm kiếm cung cấp cho người học các kiến thức: Nhu cầu tìm kiếm, sắp xếp dữ liệu trong một hệ thống thông tin, các giải thuật tìm kiếm nội, tìm kiếm tuyến tính, tìm kiếm nhị phân,... Mời các bạn cùng tham khảo.
Trang 1Chương 2.1 Giải thuật
tìm kiếm
Trần Minh Thái
Email: minhthai@huflit.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 3Nhu 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 4Vấn đề tìm kiếm
Dựa vào một phần thông tin được gọi là khoá
(key) tìm một mẫu tin (record) chứa các
thông tin khác liên quan với khoá này
Có thể có nhiều mẫu tin hoặc không có mẫu tin nào chứa khoá cần tìm
Trang 5Đánh giá giải thuật tìm kiếm
Tìm kiếm thường là tác vụ tốn nhiều thời gian trong một chương trình
Tổ chức cấu trúc dữ liệu và giải thuật cho việc tìm kiếm ảnh hưởng lớn đến hiệu suất hoạt động của chương trình
Thông số đo chủ yếu là số lần so sánh khoá cần tìm
Trang 6Phân loại
Tìm kiếm nội và tìm kiếm ngoại
Dữ liệu lưu trên thiết bị lưu trữ ngoài như đĩa hay băng từ: tìm kiếm ngoại
Dữ liệu được lưu trữ trên bộ nhớ chính: tìm kiếm nội
Trang 7Các giải thuật tìm kiếm
Có 2 giải thuật thường được áp dụng: tìm tuần tự 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 8Tìm tuần tự (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 9Đã tìm thấy tại
vị trí 5
Đã hết mảng
Trang 10Giải thuật
Bước 1:
i = 1; // bắt đầu từ phần tử đầu tiên của dãy
Bước 2: So sánh a[i] với x, có 2 khả năng :
a[i] = x : Tìm thấy Dừng
a[i] != x : Sang Bước 3
Bước 3:
i = i+1; // xét tiếp phần tử kế trong 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 2
Trang 11Nguyê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 12return i; //a[i] là phần tử có khoá x }
Trang 13return i; //a[i] là phần tử có khoá x
Nếu có x thì không cần thiết
Có thể loại bỏ?
Trang 1411
Trang 15return 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 16Q & A
Trang 17Tì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 20Giả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 21int BinarySearch(int a[],int N,int x )
{ int left =0; right = N-1;
Trang 22Bài tập
Cài đặt hàm tìm kiếm nhị phân bằng phương pháp đệ quy?
Trang 23Q & A
Trang 24Code 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 26void TaoMang(int a[], int N)
Trang 27int LinearSearch(int a[], int N, int x)
Trang 28Bà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 29Bà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ự
Trang 30Q & A