Tìm kiếm nhị phân 2 Nguyễn Minh Thành... Tìm kiếm hồ sơ, tập tin Tìm kiếm 1 người trong một danh sách... Tìm Kiếm Tuyến Tính Có 2 loại tìm kiếm tuyến tính : Vét cạn exhaustive Dù
Trang 1Giảng viên : Nguyễn Minh Thành Email : thanhnm@itc.edu.vn
Chương 2 (1) : Giải Thuật Tìm Kiếm
Trang 2Nội Dung
I. Giới thiệu
II. Giải thuật tìm kiếm
III. Tìm kiếm tuyến tính
IV. Tìm kiếm nhị phân
2 Nguyễn Minh Thành
Trang 3 Tìm kiếm hồ sơ, tập tin
Tìm kiếm 1 người trong một danh sách
Trang 4II Giải thuật tìm kiếm
Trang 5III Tìm Kiếm Tuyến Tính
Có 2 loại tìm kiếm tuyến tính :
Vét cạn (exhaustive)
Dùng lính canh (sentinel)
Trang 6III Tìm Kiếm Tuyến Tính – Vét Cạn
Trang 7III Tìm Kiếm Tuyến Tính – Vét Cạn
Trang 8III Tìm Kiếm Tuyến Tính – Vét Cạn
Trang 9III Tìm Kiếm Tuyến Tính – Vét Cạn
Phép so sánh là phép toán sơ cấp được dùng trong thuật toán->
số lượng các phép so sánh sẽ là thước đo độ phức tạp của thuậttoán
Mỗi vòng lặp có 2 điều kiện cần kiểm tra:
Kiểm tra cuối mảng
Kiểm tra phần tử hiện tại có bằng x hay không?
Trường hợp xấu nhất nằm ở cuối mảng A
Ta có 2*n+1 số phép so sánh
=> Số phép so sánh tăng/giảm tuyến tính theo số phần tử
Vậy độ phức tạp của thuật toán là : O(n)
Trang 10III Tìm Kiếm Tuyến Tính – Lính Căn
10 Nguyễn Minh Thành
Trong thuật toán vét cạn, có 2 điều kiện được kiểm tra:
Có thể bỏ việc kiểm tra điều kiện cuối mảng bằng cách dùng
Trang 11III Tìm Kiếm Tuyến Tính – Lính Căn
Thuật toán lính căn
Tìm tuần tự từ đầu mảng cho đến khi tìm thấy x (chắc chắn sẽtìm thấy x)
Nếu x được tìm thấy tại vị trí lính canh thì x không thuộc mảngA
Ngược lại trả về vị trí của x trong mảng A
Trang 12III Tìm Kiếm Tuyến Tính – Lính Căn
12 Nguyễn Minh Thành
Cài đặt 1 :
int LinearSentinel(int a[],int N,int x)
a[N] = x; // thêm phần tử thứ N+1 while (a[i]!=x )
Trang 13III Tìm Kiếm Tuyến Tính – Lính Căn
Trang 14III Tìm Kiếm Tuyến Tính – Lính Căn
14 Nguyễn Minh Thành
Số phép so sánh trong trường hợp xấu nhất : n+2
Vậy độ phức tạp của thuật toán là O(n)
Tuy nhiên, thực nghiệm cho thấy trong trường hợp n lớn, thời gian tìm kiếm giảm khi dùng phương pháp lính canh
Với n=15000: nhanh hơn khoảng 20% (0.22s so với 0.28s)
Trang 15IV Tìm Kiếm Nhị Phân
Khi một mảng đã được sắp thứ tự, tận dụng điều này ta có thể giảm một số thao tác cho thuật toán tìm kiếm
Thuật toán tìm kiếm nhị phân
Trang 16IV Tìm Kiếm Nhị Phân
Trang 17IV Tìm Kiếm Nhị Phân
Trang 18IV Tìm Kiếm Nhị Phân
Trang 19IV Tìm Kiếm Nhị Phân
Các bước của giải thuật
Bước 1: left = 1; right = N; // tìm kiếm trên 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 20IV Tìm Kiếm Nhị Phân
}while (left <= right);
return -1; // Tìm hết dãy mà không có x }
Trang 21IV Tìm Kiếm Nhị Phân
Trang 22IV Tìm Kiếm Nhị Phân
Trang 23Hỏi Đáp