Chương 3 Các phương pháp tìm kiếm và sắp xếp Tìm kiếm và sắp xếp dữ liệu là hai thao tác thường xuyên được thực hiện trong khai thác thông tin Tùy thuộc vào cấu trúc lư
Trang 1Các phương pháp sắp xếp
và tìm kiếm
Các phương pháp sắp xếp
và tìm kiếm
Chương 3
Các phương pháp sắp xếp
4
Đệ qui
1
Tìm kiếm đệ qui
2
Các phương pháp tìm kiếm
3
Nội dung
Nội dung
Trang 2Chương 3 Các phương pháp tìm kiếm và sắp xếp
Tìm kiếm và sắp xếp dữ liệu là hai thao tác thường xuyên được thực hiện trong khai thác thông tin
Tùy thuộc vào cấu trúc lưu trữ của dữ liệu các
thuật toán được xây dựng có mức độ hiệu quả khác nhau
Có thể chia thành hai nhóm: các thuật toán thao tác trên bộ nhớ chính (RAM) và trên bộ nhớ
ngoài (các ổ đĩa)
Vấn đề tìm kiếm và sắp xếp dữ liệu
Trang 3Chương 3 Các phương pháp tìm kiếm và sắp xếp
Khái niệm
Một đối tượng X gọi là được định nghĩa đệ qui nếu định nghĩa đệ qui
trong phát biểu của X có dùng chính đối tượng X
Ví dụ: “Người A có cha mẹ là người” – trực tiếp
“Gà Trứng Gà” – gián tiếp
Đệ qui
Trang 4Chương 3 Các phương pháp tìm kiếm và sắp xếp
Khái niệm
Một chương trình đệ qui là chương trình gọi đến chính nó trong các câu lệnh, chương trình đệ qui
bắt buộc phải có điều kiện dừng
Nhược điểm của đệ qui
Sử dụng nhiều bộ nhớ để lưu trữ tạm thời các biến trong lúc chạy đệ qui
Đệ qui
Trang 5Chương 3 Các phương pháp tìm kiếm và sắp xếp
Khái niệm
Một định nghĩa đệ qui thường có 2 thành phần
gọi đệ qui
Ví dụ: 0! = 1! = 1
qui đến tham số khác, dần tiến về thành phần cố định
Ví dụ: n! = n*(n-1)! Nếu n > 1
Đệ qui
Trang 6Chương 3 Các phương pháp tìm kiếm và sắp xếp
Một hàm đệ quy về căn bản luôn gồm 2 phần.
giá trị ban đầu của tham số
có phạm vi nhỏ hơn
Hàm đệ qui
Ví dụ: Xây dựng hàm tính n! theo đệ
qui
long giaithua(int n)
{
if (n == 0 || n == 1) return 1;
else return (n * giaithua(n-1));
}
Ví dụ: Tính UCLN(x,y) theo thuật toán Euclide
int ucln(int x, int y)
{
if (y == 0) return x;
else return (ucln(y, x % y));
}
Trang 7Chương 3 Các phương pháp tìm kiếm và sắp xếp
Xây dựng dần các thành phần của một lời giải hay một cấu hình bằng cách thử tất cả các khả năng
hình bằng cách thử tất cả các khả năng
Ví dụ: liệt kê các dãy nhị phân có độ dài n bit
Với n=3
Tìm kiếm đệ qui
Bit 2 Bit 1 Bit 0
Một “cấu hình”
3 bit ~ 8 khả năng
Trang 8Chương 3 Các phương pháp tìm kiếm và sắp xếp
/* Xác định thành phần xi bằng đệ quy */
void Try( int i )
{ int j;
If (i > N) < ghi nhận 1 cấu hình>;
else {
for (j thuộc tập khả năng đề cử )
if < chấp nhận khả năng ( j )> then {
< Xác định xi theo khả năng ( j ) >
<Ghi nhận khả năng ( j ) đã được chọn cho xi >;
Try( i+1);
< bỏ việc ghi nhận khả năng ( j ) đã chọn cho xi >;
} }
}
Hàm tìm kiếm đệ qui
Trang 9Chương 3 Các phương pháp tìm kiếm và sắp xếp
CTDL: Mảng byte: char X[20]; chứa dãy nhị phân tối đa 20 bit
Khả năng đề cử cho 1 thành phần (1 bit) X[i] là: 0 và 1
void Try(int i)
if ( i > n ) InKetqua;
else for (j =0; j<2; j++)
Try( i + 1 );
} }
Trang 10Chương 3 Các phương pháp tìm kiếm và sắp xếp
Một số ví dụ cơ bản về đệ qui
Trang 11Chương 3 Các phương pháp tìm kiếm và sắp xếp
người
Seminar
Các thuật toán tìm kiếm và sắp xếp