Thông tin tài liệu
Chươ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 1 Mục tiêu Xác định được vai trò của tìm kiếm và sắp xếp trong hệ thống thông tin Nắm vững và minh họa được giải thuật tìm kiếm tuyến tính và tìm kiếm nhị phân trên mảng một chiều Cài đặt được giải thuật tìm kiếm bằng ngôn ngữ C/C++ 2 Suy nghĩ 3 Tại sao hầu hết phần mềm phải có chức năng m kiếm và sắp xếp, mối quan hệ giữa m kiếm và sắp xếp? ? Nhu 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 4 Cá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; 5 a 1 a 2 a 3 a 4 a 5 … a n-1 a N Tì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 6 Tìm kiếm tuyến tính Minh họa tìm x =10 Minh họa tìm x =25 7 Chưa hết mảng 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 10 10 25 Chưa hết mảng Đã m thấy tại vị trí 5 Đã hết mảng Giải thuật Bước 1: i=1;//bắtđầutừphầntửđầutiêncủadãy Bước 2: Sosánha[i]vớix,có2khảnăng: a[i]=x:Tìmthấy.Dừng a[i]!=x:SangBước3. Bước 3: i=i+1;//xéttiếpphầntửkếtrongmảng Nếui>N:Hếtmảng,khôngtìmthấy.Dừng Ngượclại:LặplạiBước2. 8 Nguyê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 9 Cài đặt intLinearSearch(inta[],intN,intx) { inti=0; while((i<N)&&(a[i]!=x)) i++; if(i==N) return-1;//tìmhếtmảng else returni;//a[i]làphầntửcókhoáx } 10 [...]... tìm x =10 10 7 5 12 41 10 10 32 13 9 15 3 10 1 2 3 4 5 6 7 8 9 10 11 Minh họa tìm x = 25 25 7 5 12 41 10 32 13 9 15 3 25 25 1 2 3 4 5 6 7 8 9 10 11 11 Cài đặt int LinearSearch2(int a[],int N,int x) { int i=0; a[N] = x; // thêm phần tử x sau mảng while (a[i]!=x ) i++; if (i==N) return -1; // tìm hết mảng else return 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) 12 . .. 3 4 6 6 12 16 21 34 41 80 1 2 3 4 5 6 7 8 9 10 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 đồ 25 Bài tập lý thuyết – Hướng dẫn LT1 _1: Tìm x = 6 3 4 6 6 12 16 21 34 41 80 1 2 3 4 5 6 7 8 9 10 Tìm x theo... T(n)=O(n) 12 Q&A 13 Tì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 14 Minh họa tìm x = 41 x x x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 l m m Tìm thấy x tại vị trí 6 r m 15 Minh họa tìm x = 45 x x x x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 l m m r... với x Kết quả 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) 26 Bài tập lý thuyết – Hướng dẫn LT1 _1: Tìm x = 6 3 4 6 6 12 16 21 34 41 80 1 2 3 4 5 6 7 8 9 10 Tìm x theo phương pháp nhị phân Xét đoạn So sánh giữa đoạn l =1, r =10 Vị trí với x m=(l+r) /2= 5 (a[m]= 12 ) ≠ x Kết quả Cập nhật r=m -1= 4 (a[m]>x xét trái) l =1, r=4 m=(l+r) /2= 2 (a[m]=4) ≠ x... Không tìm thấy m m 16 Giả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 : a[mid] = x: Tìm thấy Dừng a[mid] > x: / /tìm tiếp x trong dãy con aleft amid -1 right =mid - 1; a[mid] < x: / /tìm tiếp x trong dãy con amid +1 aright left = mid + 1; Bước 3: Nếu left . 71 1 2 3 4 5 6 7 8 9 10 x m 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 m x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 r m x l 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 m x 3. 9 10 l m x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 r m x 3 14 16 19 22 41 46 51 63 71 1 2 3 4 5 6 7 8 9 10 Tìm thấy x tại vị trí 6 Minh họa tìm x = 45 16 3 14 16 19 22 41 46 51 63 71 1. hết mảng 6 Tìm kiếm tuyến tính Minh họa tìm x =10 Minh họa tìm x =25 7 Chưa hết mảng 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 7 5 12 41 10 32 13 9 15 3 1 2 3 4 5 6 7 8 9 10 10 10 25 Chưa
Ngày đăng: 04/09/2015, 15:14
Xem thêm: Bài giảng cấu trúc dữ liệu và giải thuật chương 2 tìm kiếm và sắp xếp trên mảng 1 chiều phần 1 , Bài giảng cấu trúc dữ liệu và giải thuật chương 2 tìm kiếm và sắp xếp trên mảng 1 chiều phần 1