Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
329,78 KB
Nội dung
3 3 Tìmkiếm & Sắpxếp Mục tiêu: • Giới thiệu một số thuật toán tìm kiếmvàsắpxếp nội. • Phân tích, đánh giá độ phức tạp của các giải thuật tìm kiếm, sắp xếp. Nội dung: • Nhu cầu tìm kiếmvàsắpxếp dữ liệu trong một hệ thống thông tin. • Các giải thuật tìmkiếm nội. • Các giải thuật sắpxếp nội. 4 4 Các giải thuật tìmkiếm nội • Tìm tuần tự • Tìm nhị phân Tìmkiếm 5 5 Các giải thuật tìmkiếm nội Bài toán: Tìm vò trí xuất hiện của phần tử có giá trò x trên danh sách đặc a •Tập dữ liệu được lưu trữ là dãy số a 1 , a 2 , . ,a N int a[N]; •Khoá cần tìm là x int x; 6 6 Tìmkiếm tuần tự • Bước 1: i = Vò trí đầu; • Bước 2: Nếu a[i] = x : Tìm thấy. Dừng, vò trí xuất hiện: i • Bước 3 : i = Vò trí kế(i);// xét tiếp phần tử kế trong mảng • Bước 4: Nếu i >Vò trí cuối: //Hết mảng Không tìm thấy. Dừng. Ngược lại: Lặp lại Bước 2. 7 7 Tìmkiếm tuần tự • Ví dụ: Cho dãy số a 12 2 8 5 1 6 4 15 • Giá trò cần tìm: 8 • i = 1 8 8 Tìmkiếm tuần tự • i = 2 • i = 3 9 9 T TT Tì ìì ìm kie m kiem kie m kiế áá ám tua m tuam tua m tuầ àà àn t n tn t n tự ựự ự int LinearSearch(int a[], int N, int x) { for (int i=0; (i<N)&&(a[i]!=x ); i++); if (i<N) return i; // a[i] là phần tử có khoá x return -1; // tìm hết mảng nhưng không có x } 10 10 Tìmkiếm tuần tự • Cải tiến cài đặt: dùng phương pháp “đặt lính canh ” – Đặt thêm một phần tử có giá trò x vào cuối mảng – Bảo đảm luôn tìm thấy x trong mảng – Sau đó dựa vào vò trí tìm thấy để kết luận. 11 11 Tìmkiếm tuần tự int LinearSearch(int a[], int N, int x) { // mảng gồm N phần tử từ a[0] a[N-1] a[N] = x; // thêm lính canh vào cuối dãy for (int i=0; (a[i]!=x); i++); if (i<N) return i; // a[i] là phần tử có khoá x return -1; // tìm hết mảng nhưng không có x } 12 12 Tìmkiếm tuần tự • Đánh giá giải thuật: • Vậy giải thuật tìm tuần tự có độ phức tạp tính toán cấp n: T(n) = O(n) 13 13 Tìmkiếm tuần tự Nhận xét: – Giải thuật tìm tuyến tính không phụ thuộc vào thứ tự của các phần tử trong danh sách, do vậy đây là phương pháp tổng quát nhất để tìmkiếm trên một danh sách bất kỳ. – Một thuật toán có thể được cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt ảnh hưởng đến tốc độ thực hiện của thuật toán. 14 14 Tìmkiếm nhò phân • Đối với những dãy đã sắp thứ tự (giả sử thứ tự tăng), các phần tử trong dãy có quan hệ a i -1 ≤ ≤≤ ≤ a i ≤ ≤≤ ≤ a i+1 Nếu x > a i thì x chỉ có thể xuất hiện trong đoạn [a i+1 ,a N ] của dãy Nếu x < a i thì x chỉ có thể xuất hiện trong đoạn [a 1 ,a i-1 ] của dãy 15 15 Tìmkiếm nhò phân • Ý tưởng của giải thuật là 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ìmkiếm hiện hành, dựa vào kết quả so sánh này để quyết đònh giới hạn dãy tìmkiếm ở bước kế tiếp là nửa trên hay nửa dưới của dãy tìmkiếm hiện hành 16 16 Tìmkiếm nhò phân Bước 1: left = VTĐ; right = VTC; Bước 2: Trong khi left ≤ ≤≤ ≤ right lặp: //đoạn tìmkiếm chưa rỗng Bước 21: mid = (left+right)/2; // lấy mốc so sánh Bước 22: Nếu a[mid] = x: //Tìm thấy. Dừng, vò trí xuất hiện: mid Bước 23: Nếu a[mid] > x: //tìm x trong dãy con a left a mid -1 right = mid - 1; Ngược lại //tìm x trong dãy con a mid +1 a right left = mid + 1; //Hết lặp Bước 3: Dừng, không tìm thấy. 17 17 Tìmkiếm nhò phân • Ví dụ: Cho dãy số a gồm 8 phần tử: 1 2 4 5 6 8 12 15 • Giá trò cần tìm là 8 18 18 Tìmkiếm nhò phân • left = 1, right = 8, mid = 4 19 19 Tìmkiếm nhò phân • left = 5, right = 8, mid = 6 20 20 Tìmkiếm nhò phân int BinarySearch(int a[],int N,int x ) { int left =0, right = N-1, midle; while (left <= right) { midle = (left + right)/2; if (x == a[midle]) return midle;//Tìm thấy x tại mid if (x<a[midle])right = midle -1; else left = midle +1; } return -1; // trong dãy không có x } 21 21 Tìmkiếm nhò phân • Đánh giá giải thuật: • Giải thuật tìm nhò phân có độ phức tạp tính toán cấp logn: T(n) = O(log 2 n) 22 22 Tìmkiếm nhò phân Nhận xét: – Giải thuật tìm nhò phân dựa vào quan hệ giá trò của các phần tử mảng để đònh hướng trong quá trình tìm kiếm, do vậy chỉ áp dụng được cho những dãy đã có thứ tự. – Giải thuật tìm nhò phân tiết kiệm thời gian hơn rất nhiều so với giải thuật tìm tuần tự do T nhò phân (n) = O(log 2 n) < T tuần tự (n) = O(n). [...].. .Tìm kiếm nhò phân Nhận xét: – Khi muốn áp dụng giải thuật tìm nhò phân cần phải xét đến thời gian sắpxếp dãy số để thỏa điều kiện dãy số có thứ tự Thời gian này không nhỏ, và khi dãy số biến động cần phải tiến hành sắpxếp lại => khuyết điểm chính cho giải thuật tìm nhò phân – Cần cân nhắc nhu cầu thực tế để chọn một trong hai giải thuật tìmkiếm trên sao cho có lợi nhất 23 Đònh nghóa bài toán sắp. .. này 1 3 5 7 22 20 10 6 24 Khái niệm nghòch thế • Khái niệm nghòch thế: – Xét một mảng các số a0, a1, … an – Nếu có i aj, thì ta gọi đó là một nghòch thế • Mảng chưa sắpxếp sẽ có nghòch thế • Mảng đã có thứ tự sẽ không chứa nghòch thế a0 ≤ a1 ≤ … ≤ an 25 Các phương pháp sắpxếp thông dụng • • • • • • Selection sort Insertion sort Interchange sort Bubble sort Shaker sort Binary Insertion sort... tiến hành sắpxếp lại => khuyết điểm chính cho giải thuật tìm nhò phân – Cần cân nhắc nhu cầu thực tế để chọn một trong hai giải thuật tìmkiếm trên sao cho có lợi nhất 23 Đònh nghóa bài toán sắpxếp • Sắpxếp là quá trình xử lý một danh sách các phần tử (hoặc các mẫu tin) để đặt chúng theo một thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu giữ tại mỗi phần tử • Lưu ý: Thứ tự . 3 Tìm kiếm & Sắp xếp Mục tiêu: • Giới thiệu một số thuật toán tìm kiếm và sắp xếp nội. • Phân tích, đánh giá độ phức tạp của các giải thuật tìm kiếm, . kiếm, sắp xếp. Nội dung: • Nhu cầu tìm kiếm và 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. • Các giải thuật sắp xếp nội.