Các nội dung chính1.
Trang 1Phần 3: Cấu trúc dữ liệu
và Giải thuật
Ch ươ ng 13: Các gi i thu t tìm ki m ả ậ ế
1Chương 12: Các Giải thuật Tìm Kiếm
Trang 2Các nội dung chính
1 Gi i thi u ớ ệ
2 Các gi i thu t tìm ki m ph n t ả ậ ế ầ ử
3 Các gi i thu t tìm ki m chu i con ả ậ ế ỗ
2Chương 12: Các Giải thuật Tìm Kiếm
Trang 31 Giới thiệu
• Bài h c này s trình b y m t s gi i ọ ẽ ầ ộ ố ả thu t tìm ki m cho hai bài toán tìm ậ ế
ki m c b n: ế ơ ả
– Th nh t, là bài toán tìm m t ph n t ứ ấ ộ ầ ử trong m t dãy ph n t cho tr ộ ầ ử ướ c theo m t ộ khoá tìm ki m ế
– Th hai, là tìm s xu t hi n c a m t chu i ứ ự ấ ệ ủ ộ ỗ con trong m t chu i cho tr ộ ỗ ướ c
3Chương 12: Các Giải thuật Tìm Kiếm
Trang 41 Giới thiệu
• V i bài toán th nh t, có hai chi n l ớ ứ ấ ế ượ c tìm
ki m là tìm ki m b ng cách so sánh hay tìm ế ế ằ
ki m tr c ti p d a vào giá tr khoá c n tìm ế ự ế ự ị ầ
• V i bài toán th hai cũng có nhi u gi i thu t ớ ứ ề ả ậ khác nhau, t gi i thu t tìm ki m đ n gi n ừ ả ậ ế ơ ả (còn g i là tìm ki m thô), cho đ n các gi i ọ ế ế ả thu t khá ph c t p nh c a Knuth-Morris- ậ ứ ạ ư ủ Pratt và c a Boyer-Moore ủ
Chương 12: Các Giải thuật Tìm Kiếm
4
Trang 52 Các giải thuật tìm kiếm phần tử
• Đ t bài toán: ặ
– Đ đ n gi n cho vi c trình b y ý t ể ơ ả ệ ầ ưở ng các gi i ả thu t, ta s ch n bài toán d ng đ n gi n nh t ậ ẽ ọ ở ạ ơ ả ấ
nh sau: Cho m t dãy N s A = (a0, a1,…, aN-1) và ư ộ ố giá tr c n tìm K (khoá tìm ki m) Yêu c u tìm v trí ị ầ ế ầ ị
m t ph n t có giá tr b ng K ộ ầ ử ị ằ
• Có 2 chi n l ế ượ c tìm ki m: ế
– Tìm ki m b ng cách so sánh ế ằ – Tìm ki m d a tr c ti p vào giá tr khóa ế ự ự ế ị
Chương 12: Các Giải thuật Tìm Kiếm
5
Trang 6Tìm kiếm bằng so sánh
• Ý t ưở ng chung: t khóa tìm ki m K, ta ch a bi t ừ ế ư ế
đ ượ c v trí c a ph n t c n tìm, nên ti n hành so ị ủ ầ ử ầ ế sánh K v i l n l ớ ầ ượ t các ph n t trong dãy c n ầ ử ầ
tìm cho đ n khi ra k t qu (ho c tìm th y ho c ế ế ả ặ ấ ặ không tìm th y) ấ
• Có 2 lo i gi i thu t tìm ki m theo cách này: ạ ả ậ ế
– Tìm ki m tu n t (Sequential Search) ế ầ ự – Tìm ki m nh phân (Binary Search) ế ị
Chương 12: Các Giải thuật Tìm Kiếm
6
Trang 7Tìm kiếm tuần tự
• Ý t ưở ng gi i thu t: ả ậ
– Đ tìm ph n t b ng K trong dãy N s A = ể ầ ử ằ ố (a0, a1,…, aN-1), ti n hành so sánh K v i ế ớ
l n l ầ ượ t các ph n t trong dãy, cho đ n khi: ầ ử ế
• Ho c tìm th y ph n t ai = K, thì tr v v trí i ặ ấ ầ ử ả ề ị
c n tìm ầ
• Ho c đã so sánh v i toàn b các ph n t c a ặ ớ ộ ầ ử ủ dãy nh ng v n không th y, thì tr v k t qu ư ẫ ấ ả ề ế ả không tìm th y ấ
Chương 12: Các Giải thuật Tìm Kiếm
7
Trang 8Tìm kiếm tuần tự
• Cài đ t hàm ặ
Chương 12: Các Giải thuật Tìm Kiếm
8
int SequentialSearch(int A[], int N, int K)
{ int i=0;
while (i<N && A[i] != K) i++;
if (i<N) return i; //Tìm thấy
}
Trang 9Tìm kiếm nhị phân
• Ý t ưở ng gi i thu t: ả ậ
– Đ tìm ph n t b ng K trong dãy N s A = (a0, a1,…, aN- ể ầ ử ằ ố 1), thì gi i thu t này có m t yêu c u là dãy A đã đ ả ậ ộ ầ ượ c s p ắ
x p, gi s là theo chi u tăng d n Các b ế ả ử ề ầ ướ c c a gi i ủ ả thu t đ quy này nh sau: ậ ệ ư
• So sánh K v i ph n t am gi a dãy (m=N/2) Có 3 kh năng ớ ầ ử ở ữ ả
x y ra:ả
– N u K = am thì tr v v trí tìm th y m ế ả ề ị ấ – N u K < am thì tìm K trong dãy (a0,a1,…,am-1) ế – Trái l i, thì tìm K trong dãy (am+1,am+2,…,aN-1) ạ
• Đi m d ng: khi tìm th y ho c khi dãy không còn ph n t nào ể ừ ấ ặ ầ ử thì tr v k t qu không tìm th y.ả ề ế ả ấ
Chương 12: Các Giải thuật Tìm Kiếm
9
Trang 10Tìm kiếm nhị phân
• Cài đ t hàm ặ
Chương 12: Các Giải thuật Tìm Kiếm
10
int BSearch(int K, int A[], int b, int e) {
if (b>e) return -1; //Không tìm thấy int m= (b+e)/2;
if (K==A[m]) return m; //Tìm thấy else
if (K<A[m]) return BSearch(K, A, int b, m-1); else
return BSearch(K, A, m+1,e);
}
int BinarySearch(int K, int A[], int N){
return BSearch(K,A,0,N-1);
}
Trang 113 Tìm kiếm chuỗi con
• Gi i thi u bài toán ớ ệ
• Gi i thu t tìm ki m thô (brute-force) ả ậ ế
Chương 12: Các Giải thuật Tìm Kiếm
11
Trang 12Giới thiệu bài toán
• Cho tr ướ c m t văn b n ộ ả V g m ồ n kí t (v0,v1,…,vn-1) và ự
m t chu i con ộ ỗ P (g i là m u) g m ọ ẫ ồ m kí t (p0,p1, ự
…,pm-1) Yêu c u tìm v trí xu t hi n đ u tiên c a P ầ ị ấ ệ ầ ủ trong V
• Bài toán này có nhi u gi i thu t Gi i thu t thô khá ề ả ậ ả ậ
đ n gi n nh ng có th i gian x lý t i nh t t l v i ơ ả ư ờ ử ồ ấ ỉ ệ ớ m x
n Gi i thu t KMP c n các thao tác ti n x lý trên ả ậ ầ ề ử chu i m u nên khá ph c t p, nh ng có th i gian t t ỗ ẫ ứ ạ ư ờ ố
h n nhi u, ch t l v i ơ ề ỉ ỉ ệ ớ m + n.
Chương 12: Các Giải thuật Tìm Kiếm
12
Trang 13Giải thuật tìm kiếm thô
• Ý t ưở ng gi i thu t: ả ậ
– So sánh l n l ầ ượ t các ký t c a m u P v i các ự ủ ẫ ớ
kí t c a văn b n V b t đ u t v trí i (0 ự ủ ả ắ ầ ừ ị ≤ i ≤
n-m) cho đ n khi ho c kh p t t c các kí t ế ặ ớ ấ ả ự
c a P v i các kí t trong V thì i là v trí c n ủ ớ ự ị ầ tìm, ho c so đ n kí t cu i cùng trong V v n ặ ế ự ố ẫ không kh p thì k t lu n tìm ki m không ớ ế ậ ế
th y, ho c g p b t kì kí t nào không kh p ấ ặ ặ ấ ự ớ thì quay l i so sánh t đ u c a m u P v i ạ ừ ầ ủ ẫ ớ các kí t c a V b t đ u t v trí i+1 ự ủ ắ ầ ừ ị
Chương 12: Các Giải thuật Tìm Kiếm
13
Trang 14Giải thuật tìm kiếm thô
• Cài đ t hàm ặ
Chương 12: Các Giải thuật Tìm Kiếm
14
int BFSearch(char V[], char P[] ) {
/*Ham tra ve vi tri tim thay dau tien, tra
ve -1 neu khong tim thay*/
int N = strlen(V);
int M = strlen(P);
int i, j, b;
i=0; j=0;
do { b=i; //Vi tri bat dau tim
while (i<N-1 && j<M-1 &&
V[i]==P[j]) { i++; j++;
}
if (i<N-1 && j<M-1 ) { i=b+1;
j=0;
} } while (i<N-1 && j<M-1) ;
if (j>=M-1) return b;
else return -1;
}
Trang 15Xin cảm ơn!
Chương 12: Các Giải thuật Tìm Kiếm
15