Nội dung bài giảng trình bày khái niệm tìm kiếm; bài toán tìm kiếm; các thuật toán tìm kiếm; tìm kiếm trên dãy chưa sắp; tìm kiếm tuần tự; tìm kiếm tuần tự cải tiến; tìm kiếm tuần tự trên dãy đã sắp... Để nắm chắc kiến thức mời các bạn cùng tham khảo bài giảng Chương 4: Các thuật toán tìm kiếm.
Trang 1CHƯƠNG 4 CÁC THU T TOÁN TÌM KI M ẬT TOÁN TÌM KIẾM ẾM
Trang 2I KHÁI NIỆM TÌM KIẾM
CỦA TA ĐÂU?
Trang 3I KHÁI NIỆM TÌM KIẾM
2 Khái niệm
Tìm kiếm là việc kiểm tra xem có hay không
một đối tượng có một số thông tin cho trước
(đối tượng cần tìm) trong một tập các đối
tượng cho trước (không gian tìm kiếm)
Ví dụ: Tìm một chùm chìa khóa trong một gian
phòng
Ta có hình ảnh của chùm chìa khóa
Trang 43 BÀI TOÁN TÌM KIẾM
- Dãy a, có n đối tượng, mỗi đối tượng có một
“khóa tìm kiếm”
- Khóa của đối tượng cần tìm (Key)
- Nếu tìm thấy đối tượng có khóa ‘Key’ trong
dãy a trả lại giá trị 1, ngược lại trả lại giá trị 0.
Trang 5II CÁC THUẬT TOÁN TÌM KIẾM
Tìm kiếm tuần tự
Tìm kiếm nhị phân
Tìm kiếm trên cây nhị phân tìm kiếm
Trang 6II CÁC THUẬT TOÁN TÌM KIẾM
Tùy theo dữ liệu vào ta có thể phân chia bài
toán tìm kiếm thành hại loại
Tìm kiếm trên dãy chưa sắp: dãy tìm kiếm
chưa được sắp xếp theo thứ tự khóa tìm kiếm
Tìm kiếm trên dãy đã sắp: dãy tìm kiếm đã
sắp theo thứ tự tăng dần của khóa tìm kiếm
Trang 71 TÌM KIẾM TRÊN DÃY CHƯA SẮP
Với một dãy chưa được sắp xếp thì cách tìm kiếm
đơn giản nhất là tìm kiếm tuần tự
Tìm kiếm tuần tự là một phương pháp tìm kiếm khá
phổ biến và hết sức đơn giản
?
Trang 81.1.TÌM KIẾM TUẦN TỰ
a Ý tưởng :
So sánh khóa của đối tượng cần tìm với khóa của đối
tượng đầu tiên trong dãy
Nếu bằng nhau, kết thúc tìm kiếm (thành công)
Nếu không bằng, chuyển sang đối tượng kế tiếp
Lặp lại công việc trên cho đến khi gặp một đối tượng
có khóa bằng với khóa cần tìm (thành công) hoặc đã hết các đối tượng trong dãy (không thành công)
Trang 101.1.TÌM KIẾM TUẦN TỰ
Việc tìm kiếm có thể minh họa như sau
i=0; a0=5 <> x=6; i=i+1;
i=1; a1=1 <> x=6; i=i+1;
i=2; a2=6 = x; Tìm thấy x
Tìm kiếm kết thúc thành công
Chuyển sang đối tượng kế tiếp
Chuyển sang đối tượng kế tiếp
Trang 11- Minh họa việc tìm số x1=42 và số x2=43 trong
dãy bằng phương pháp tìm kiếm tuần tự
a5 a6 a7
Ví dụ 2
a1
- Minh họa việc tìm số x1=42 và số x2=43 trong
dãy bằng phương pháp tìm kiếm tuần tự
Trang 14TÌM KIẾM TUẦN TỰ CẢI TIẾN
Nhận xét : mỗi lần so sánh đều phải kiểm tra xem
dãy đã hết chưa (i<n), nên tốn thêm thời gian
Để tránh điều đó người ta thêm đối tượng x vào
cuối dãy a (gán a[n]=x)
Trang 16TÌM KIẾM TUẦN TỰ CẢI TIẾN
int tktt2(int x, int a[], int n)
{ int i=0; a[n]=x;
Trang 17 Với một dãy đã sắp xếp theo theo thứ tự của khóa tìm kiếm thì việc tìm kiếm về cơ bản sẽ nhanh hơn
Việc tìm kiếm có thể thực hiện bằng một trong hai phương pháp
Tìm kiếm tuần tự hoặc
TÌM KIẾM TRÊN DÃY ĐÃ SẮP
Trang 18 Việc tìm kiếm giống như tìm kiếm trên dãy chưa sắp
Quá trình tìm kiếm kết thúc khi gặp một trong 3 điều kiện
Gặp đối tượng có khóa bằng với khóa của đối tượng cần tìm (tìm kiếm thành công)
Gặp đối tượng có khóa “lớn hơn” khóa của đối tượng
cần tìm (tìm kiếm không thành)
Đã duyệt hết dãy (tìm kiếm không thành)
TÌM KIẾM TUẦN TỰ TRÊN DÃY ĐÃ SẮP
Trang 19TÌM KIẾM TUẦN TỰ TRÊN DÃY ĐÃ SẮP
Trang 21TÌM KIẾM TUẦN TỰ TRÊN DÃY ĐÃ SẮP
int tktt3(int x, int a[], int n)
{ int i=0; a[n]=x;
while ( a[i]<x) i++;
if (i<n && a[i]==x) return 1;
return 0;
}
• Độ phức tạp của thuật toán : O(n)
Trang 22 Ý tưởng
So sánh khóa cần tìm với khóa của đối tượng ở trung tâm của dãy đang xét m=(l+r)/2
Tìm kiếm kết thúc thành công nếu a[m]==x
Nếu a[m] > x, tìm kiếm được thực hiện với dãy trái a[l], , a[m-1]
Nếu a[m] < x, tìm kiếm được thực hiện với dãy phải a[m+1], , a[r]
Quá trình tìm kiếm tiếp tục cho đến khi gặp đối tượng mong muốn (thành công) hoặc dãy khóa đang xét trở nên rỗng
TÌM KIẾM NHỊ PHÂN
Trang 25 Ví dụ 2
TÌM KIẾM NHỊ PHÂN
- Cho dãy số a được sắp tăng dần
- Minh họa việc tìm số x1=11 và số x2=37 trong
dãy bằng phương pháp tìm kiếm nhị phân
a5 a6 a7
Trang 27TÌM KIẾM NHỊ PHÂN
int tknp(int x, int a[], int n)
{ int l=0, r=n-1, m ; while (l<=r)
{ m= (l+r)/2 ;
if (a[m]==x) return 1;
if (a[m] > x) r=m-1;
else l=m+1 ; }
return 0;
Trang 28}
Trang 29TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM
Trang 30TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM
Trang 31TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM
Cây nhị phân tìm kiếm tương ứng
• t->key<x, tìm trong cây B
• B->key>x, tìm trong cây C
• C->key<x, tìm trong cây D
• D->key=x, tìm thấy x, kết
thúc tìm kiếm
Trang 32TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM
int tkcnp(int x, node *t )
{ while (t!=NULL) { if (t->key==x) return 1;
if (t->key>x) t= t->left ; else t=t->right ;
}
return 0;
Trang 33TÌM KIẾM TRÊN CÂY NHỊ PHÂN TÌM KIẾM
int tkcnp2(int x, node *t )
Trang 34Bài 1
Viết chương trình thực hiện các việc sau
Nhập vào một mảng một chiều n số nguyên (0<n<100)
Nhập số nguyên x
Thông báo x có xuất hiện trong dãy không, nếu có thì
nó ở vị trí thứ bao nhiêu theo thuật toán tìm kiếm tuần
tự, tìm kiếm nhị phân
BÀI TẬP ÁP DỤNG
Trang 35Bài 2
Viết chương trình thực hiện các yêu cầu sau
Nhập vào cây nhị phân tìm kiếm n số nguyên (0<n<50)
Nhập số nguyên x
Thông báo x có trong cây hay không theo thuật toán tìm kiếm trên cây nhị phân tìm kiếm
BÀI TẬP ÁP DỤNG
Trang 36Bài 3
Tự cho các dãy khóa nguyên (n>10), mô tả quá trình tìm kiếm khóa x trong dãy khóa theo các thuật toán tìm kiếm đã học
BÀI TẬP ÁP DỤNG