Tìm kiếm và sắp xếp

12 368 0
Tìm kiếm và sắp xếp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

3 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 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, sắp xếp. Nội dung: • 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. • Các giải thuật sắp xếp nội. 4 4 Các giải thuật tìm kiếm nội • Tìm tuần tự • Tìm nhị phân Tìm kiếm 5 5 Các giải thuật tìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiế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ìm kiếm ở bước kế tiếp là nửa trên hay nửa dưới của dãy tìm kiếm hiện hành 16 16 Tìm kiếm nhò phân Bước 1: left = VTĐ; right = VTC; Bước 2: Trong khi left ≤ ≤≤ ≤ right lặp: //đoạn tìm kiế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ìm kiế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ìm kiếm nhò phân • left = 1, right = 8, mid = 4 19 19 Tìm kiếm nhò phân • left = 5, right = 8, mid = 6 20 20 Tìm kiế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ìm kiế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ìm kiế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ắp xếp dãy số để thỏa điều kiện dãy số có thứ tự Thời gian này không nhỏ, khi dãy số biến động cần phải tiến hành sắp xế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ìm kiế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ắp xế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ắp xếp thông dụng • • • • • • Selection sort Insertion sort Interchange sort Bubble sort Shaker sort Binary Insertion sort... tiến hành sắp xế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ìm kiếm trên sao cho có lợi nhất 23 Đònh nghóa bài toán sắp xếpSắp xế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.

Ngày đăng: 30/09/2013, 02:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan