Untitled Data Structures & Algorithms Các thuật toán tìm kiếm chuỗi (String Searching Algorithms) Nguyễn Tri Tuấn Khoa CNTT – ĐH KHTN Tp HCM Email nttuan@fit hcmus edu vn Autumn 2008 Data Structures &[.]
Trang 1Data Structures & Algorithms
Các thu ậ t toán tìm ki ế m chu ỗ i
(String Searching Algorithms)
Nguy ễ n Tri Tu ấ n Khoa CNTT – Đ H.KHTN.Tp.HCM Email: nttuan@fit.hcmus.edu.vn
Trang 3Ý t ưở ng:
Đố i v ớ i v ị trí th ứ i c ủ a v ă n b ả n T (i=0…n-m), ta so sánh
các ký t ự c ủ a P t ươ ng ứ ng t ừ trái sang ph ả i:
P[0] v ớ i T[i], P[1] v ớ i T[i+1],…, P[m-1] v ớ i T[i+m-1]
P[j] vớ i T[i+j] (j = 0 m-1)
Ví d ụ :
T = “ TWO RED ROADS CROSSING ”
n = length(T) = 22
Trang 6return -1 ; // không tìm th ấ y
}
Trang 7Brute-Force (tt)
Đ ánh giá:
Tr ườ ng h ợ p x ấ u nh ấ t O(m*n) – t ự ch ứ ng minh
Trang 8Brute-Force (tt)
Đ ánh giá:
Tr ườ ng h ợ p t ố t nh ấ t O(n) – t ự ch ứ ng minh
Tr ườ ng h ợ p trung bình O(n+m) – t ự ch ứ ng minh
Trang 10Đặt vấn đề
Trong thu ậ t toán Brute-Force: khi x ả y ra không so kh ớ p
t ạ i m ộ t ký t ự , ta đ ã xóa b ỏ t ấ t c ả thông tin có đượ c b ở i
Trang 11H ướ ng gi ả i quy ế t c ủ a Morris-Pratt:
L ợ i d ụ ng thông tin đ ã bi ế t v ề các ký t ự đ ã so sánh
Bi ế n j th ể hi ệ n s ố ký t ự đ ã đượ c so kh ớ p gi ữ a m ẫ u (P) và v ă n b ả n (T) Khi g ặ p v ị trí không so kh ớ p, thay
vì gán j = 0 để quay l ạ i t ừ đầ u chu ỗ i P, ta s ẽ gán cho
j m ộ t giá tr ị thích h ợ p
Trang 13Morris-Pratt (tt)
Giai đ o ạ n ti ề n x ử lý – tính giá tr ị b ả ng NEXT
Xây d ự ng m ả ng NEXT[0 m-1] (có m ph ầ n t ử ) NEXT[j] ch ứ a giá tr ị dùng để d ị ch chuy ể n con tr ỏ j khi
x ả y ra s ự không kh ớ p t ạ i v ị trí j
Trang 17Ví d ụ : P = AAATA
NEXT[1] = 0 (j=1)
NEXT[2] = 1
A
Trang 19Morris-Pratt (tt)
// Hàm tính giá tr ị b ả ng NEXT (Morris-Pratt)
void initNEXT_MP(char *p, int NEXT[]) {
}
Trang 21Morris-Pratt (tt)
Ví d ụ :
Xây d ự ng b ả ng NEXT cho P = 10100
Xây d ự ng b ả ng NEXT cho P = ABACAB Xây d ự ng b ả ng NEXT cho P = GCAGAGAG Xây d ự ng b ả ng NEXT cho P = AABAABA
Trang 22Morris-Pratt (tt)
P = 10100 0 1 2 3 4 NEXT -1 0 0 1 2
P = ABACAB 0 1 2 3 4 5 NEXT -1 0 0 1 0 1
P = GCAGAGAG 0 1 2 3 4 5 6 7
NEXT -1 0 0 0 1 0 1 0
Trang 24C ả i ti ế n c ủ a KMP so v ớ i Morris-Pratt
Khi xây d ự ng b ả ng NEXT, Knuth b ổ sung ki ể m tra
đ i ề u ki ệ n c ≠ a để tránh tr ườ ng h ợ p “mis-match” ngay
v ị trí đầ u tiên sau khi d ị ch chuy ể n j
Giải thích: nếu a == c, tức là c ≠ b (vì a ≠ b) sẽ
“mis-match” ngay lần so sánh đầu tiên sau khi dịch chuyển j
Trang 25Knuth-Morris-Pratt (tt)
Tóm l ạ i: thu ậ t toán KMP
Giai đ o ạ n ti ề n x ử lý có m ộ t c ả i ti ế n nh ỏ : Tính độ d ị ch chuy ể n t ố t h ơ n tránh so sánh cùng m ộ t ký t ự
trong T hai l ầ n
Giai đ o ạ n tìm ki ế m: hoàn toàn gi ố ng thu ậ t toán Morris-Pratt
Trang 26} }
Trang 28Thank you for your attention
Trang 29Q & A