Tải bản đầy đủ (.pptx) (15 trang)

Ngôn ngữ lập trình C++_Chuong13_GiaiThuatTimKiem_part pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (171.37 KB, 15 trang )

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

×