Phầ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
Cá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
1. 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
1. 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ếm4
2. 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ếm5
Tì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ếm6
Tì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ếm7
Tìm kiếm tuần tự
•
Cài đ t hàmặ
Chương 12: Các Giải thuật Tìm Kiếm8
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
return -1; //Không tìm thấy
}
Tì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ếm9
Tìm kiếm nhị phân
•
Cài đ t hàmặ
Chương 12: Các Giải thuật Tìm Kiếm10
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);
}
3. 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ếm11
Giớ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ếm12
Giả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ếm13
Giả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ếm14
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;
}
Xin cảm ơn!
Chương 12: Các Giải thuật Tìm Kiếm15