Tìm kiếm &Sắp xếp CácCác giảigiải thuậtthuật tìmtìm kiếmkiếm nộinội TìmTìm kiếmkiếm tuyến tínhtuyến tính TìmTìm kiếmkiếm nhịnhị phânphân Caáu truùc Döõ lieäu Tìm kieám vaø Saép xeáp 2 Tìm kieám la[.]
Trang 1Các giải thuật
Tìm kiếm tuyến tính
Tìm kiếm nhị phân
Trang 2 Tìm kiếm là thao tác thường được thực hiện nhất.
Dữ liệu đã được sắp xếp => tìm nhanh hơn.
- => Vấn đề:
- Tìm kiếm nhanh.
- Sắp xếp nhanh.
Nhu cầu tìm kiếm và sắp xếp dữ liệu trong
một hệ thống thông tin
Trang 3Các giải thuật tìm kiếm nội
Bài toán:
- Chọn cấu trúc dữ liệu mảng (a) để lưu trữ dãy số a1,
a2 ,…,an
- Tìm một số nguyên x trong mảng a
Có 2 giải thuật tìm kiếm:
- Tìm kiếm tuyến tính.
- Tìm kiếm nhị phân.
Trang 4Tìm kiếm tuyến tính
Trang 5gặp được phần tử có khóa cần tìm, hoặc đã tìm hết
mảng mà không thấy x
Trang 6Tìm kiếm tuyến tính
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
Trang 9Tìm kiếm tuyến tính
int LinearSearch ( int a[], int n, int x)
{
int i=0;
while (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
}
Trang 10Tìm kiếm tuyến tính
Cải tiến cài đặt: dùng phương pháp “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
Trang 11a[n] = x; // thêm lính canh vào cuối dãy
while( 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
}
Trang 12Tìm kiếm tuyến tính
Đá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)
Trang 13Tìm kiếm tuyến tính
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
Trang 14Tìm kiếm nhị phân
Trang 15Tìm kiếm nhị phân
Đối với những dãy đã có 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[0] ,a[i-1]] của dãy
Trang 16Tì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
Trang 17Tì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 aleft amid -1 right = mid - 1;
Ngược lại // tìm x trong dãy con amid +1 aright left = mid + 1;
//Hết lặp
Trang 18Ví d : Tìm nh phân ụ ị
Ví d : Tìm nh phân ụ ị
10Target key
Trang 19Tìm kiếm nhị phân
{
int left =0, right = n-1, mid;
while (left <= right) {
mid = (left + right)/2;
if (x == a[mid]) return mid;//Tìm thấy x tại mid
if (x < a[mid]) right = mid -1;
else left = mid +1;
}
Trang 20Tì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)
Trang 21Tì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
Tnhị phân (n) = O(log 2 n) < Ttuần tự (n) = O(n)
Trang 22 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
Trang 23Bài tập tổng hợp
nhất của từng phương pháp sắp xếp đã học.
mảng a gồm 1000 số nguyên Trong trường hợp sau, hãy cho biết số phần tử tối đa có thể được duyệt trong quá trình tìm kiếm:
Trang 24Bài tập tổng hợp(tt)
phương pháp đã học.(ghi rõ số so sánh, số phép hoán vị)
Trang 25Bài tập tổng hợp(tt)
Định nghĩa một mảng gồm 10.000 phần tử kiểu int
Thực hiện 3 lần các thao tác sau:
Gán giá trị ngẫu nhiên (từ 0 10.000)lần lượt cho các
phần tử mảng
Thực hiện việc sắp xếp theo thứ tự tăng dần bằng 5
phương pháp(in ra số lần hoán vị)
Tìm kiếm phần tử ngẫu nhiên(từ 0 10.000)(in ra số
phép gán) bằng pp nhị phân
Trang 26Bài tập tổng hợp(tt)
Bt2: viết chương trình:
trong danh sách.
bản(Toán, Lý, Hóa, TB) của mỗi sv, điểm là số thực:
cấu trúc như trên.
điểm trung bình, và ghi vào file BDSAPXEP.TXT.