Nhu cầu tìm kiếm và sắp xếp Thao tác tìm kiếm được sử dụng nhiều nhất trong các hệ lưu trữ và quản lý dữ liệu.. Để đạt được điều này dữ liệu phải được tổ chức theo một thứ tự nào đó thì
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
Thao tác tìm kiếm được sử dụng nhiều nhất trong các hệ lưu trữ và quản lý dữ liệu.
Do dữ liệu lớn nên tìm ra giải thuật tìm kiếm nhanh chóng là mối quan tâm hàng đầu Để đạt được điều này dữ liệu phải được tổ chức theo một thứ tự nào đó thì việc tìm kiếm sẽ nhanh chóng và hiệu quả hơn, vì vậy nhu cầu sắp xếp dữ liệu cũng được lưu ý.
Tóm lại, bên cạnh những giải thuật tìm kiếm thì các giải thuật sắp xếp dữ liệu không thể thiếu trong hệ quản lý thông tin trên máy tính
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ả như sau:
Tập dữ liệu được lưu trữ là dãy số a 1 , a 2 , ,a N
Giả sử chọn cấu trúc dữ liệu mảng để lưu trữ dãy
số này trong bộ nhớ chính, có khai báo: int a[N];
Khoá cần tìm là x, được khai báo như sau: int x;
Trang 6Tìm kiếm tuyến tính
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 đã tìm hết mảng mà không thấy x
Chưa hết mảng
Đã tìm thấy tại
vị trí 5
Đã hết mảng
Trang 8Nguyê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 9return i; //a[i] là phần tử có khoá x }
Trang 1011
Trang 11return 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 12Tìm kiếm nhị phân
Ý tưởng
Áp dụng đối với những dãy số đã có thứ tự
Tại mỗi bước tiến hành so sánh x với phần tử
nằm ở vị trí giữa của dãy tìm kiếm hiện hành, dựa vào kết quả so sánh này để quyết định phạm vi tìm kiếm ở bước kế tiếp
Trang 15Giả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 17Code 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);
Trang 19void TaoMang(int a[], int N)
Trang 20int LinearSearch(int a[], int N, int x)
Trang 21Bài tập lý thuyết
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
có giá trị nhỏ nhất trong dãy số: Dùng mã tự nhiên, mã giả và lưu đồ
Trang 22Bài tập viết chương trình
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