Giảng viên: Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng Nguyễn Đức Tiến Giới thiệu Thuật toán Brute-Force Thuật toán Morris-Pratt Cải tiến với Knuth-Morris-Pratt Thuật toán Rabin-Karp Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Đối sánh chuỗi Từ khóa: String matching, String searching, Pattern searching, Text Searching Một thuật tốn quan trọng có ứng dụng rộng rãi Cấu trúc liệu giải thuật - HCMUS 2015 Ứng dụng đối sánh chuỗi: Máy tìm kiếm Trình soạn thảo văn Trình duyệt web Sinh học phân tử (Tìm mẫu dãy DNA) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Mục tiêu: Kiểm tra tồn chuỗi ký tự (mẫu, pattern) chuỗi ký tự có kích thước lớn nhiều (văn bản, text) Nếu tồn tại, trả (hoặc nhiều) vị trí xuất Quy ước: Mẫu cần tìm: P (chiều dài m) Văn bản: T (chiều dài n) P T có tập hữu hạn ký tự ∑ (∑ = {0, 1}; ∑={A, ,Z},…) m≤n Cấu trúc liệu giải thuật - HCMUS 2015 Đối sánh chuỗi: Bằng cách dịch chuyển (cửa sổ) P T P tồn T vị trí bắt đầu i (0 ≤ i ≤ n – m) + j] = P[j] với ≤ j ≤ m - T[i Ví dụ: P = abbaba T = ababaabbabaa => i = Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Các thuật tốn tiêu biểu: Brute Force Morris-Pratt Knuth-Morris-Pratt Rabin-Karp Boyer-Moore … Cấu trúc liệu giải thuật - HCMUS 2015 Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Lần lượt kiểm tra điều kiện P[0…m-1] = T[i…i+m-1] vị trí i Ví dụ Tìm kiếm P = aab T = acaabc Cấu trúc liệu giải thuật - HCMUS 2015 bruteForceMatcher(T, P) n ← length[T] m ← length[P] for i ← to n - m if P[0 m-1] = T[i…i+m-1] return i Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Trường hợp tốt – khơng tìm thấy: O(n) Trường hợp xấu – khơng tìm thấy: O(n*m) Trường hợp trung bình: O(n+m) Cấu trúc liệu giải thuật - HCMUS 2015 Không cần thao tác tiền xử lý P Luôn dịch chuyển mẫu (cửa sổ) sang phải vị trí Thao tác so sánh thực theo chiều Trường hợp xấu nhất: O((n-m+1)*m) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Cấu trúc liệu giải thuật - HCMUS 2015 Điểm hạn chế thuật tốn Brute-Force: Khơng ghi nhớ thơng tin trùng khớp (trước) xảy tình trạng không so khớp Phải so sánh lại từ đầu (trên P) tất trường hợp Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Ví dụ: T: 10101011101001; P: 10100 Brute Force: i = 0, j = 4, T[i+j] != P[j] => i = 1, j = T : 10101011101001 P: 10100 Cách khác? i = 0, j = 4, T[i+j] != P[j] => i = 2, j = T : 10101011101001 P: 10100 Cấu trúc liệu giải thuật - HCMUS 2015 Ghi nhận lại phần T trùng với P trước Cố gắng tăng số bước dịch chuyển P T (thay 01 đơn vị) Cố gắng bỏ qua số bước so sánh P T vị trí (thay j=0, gán j số thích hợp) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Giả sử: vị trí bắt đầu đối sánh (trên T) j vị trí so sánh (trên P) (Ký tự tương ứng T vị trí i+j) T[i+j] != P[j] => không so khớp i Cấu trúc liệu giải thuật - HCMUS 2015 Tìm: Vị trí i1 (trên T) j1 (trên P) cho = i1+j1 (ngay vị trí xem xét) v =T[i1 … i1+j1–1] đoạn so khớp P T i+j Khi đó: Đoạn dịch chuyển cửa sổ: j – j1.(do j1 < j) Có thể tìm i1 dựa j1 Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Vấn đề: giá trị j1 dựa j Tìm Cách thức: Tính sẵn giá trị j1 ứng với vị trí j (trên P) Câu hỏi: Có thể làm khơng? Tại sao? Cấu trúc liệu giải thuật - HCMUS 2015 Bảng NEXT: Bảng chứa giá trị j1 ứng với giá trị j Ví dụ: j j1 -1 Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 10 P = AAATA j=1 NEXT[1] = A A A T A A A A T A Cấu trúc liệu giải thuật - HCMUS 2015 P = AAATA j=2 NEXT[2] = A A A T A A A A T A Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 12 P = AAATA j=3 NEXT[3] = A A A T A A A A T A Cấu trúc liệu giải thuật - HCMUS 2015 P = AAATA j=4 NEXT[4] = A A A T A A A A T A Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 13 P = AAATA Bảng NEXT NEXT[0] = -1 NEXT[1] = NEXT[2] = NEXT[3] = NEXT[4] = NEXT -1 Cấu trúc liệu giải thuật - HCMUS 2015 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 Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 14 P = 10100 NEXT -1 0 P = ABACAB NEXT -1 0 1 Cấu trúc liệu giải thuật - HCMUS 2015 Mục tiêu : Xác định vị trí i1 (trên T) j1 (trên P) cho = i1+j1 (vị trí xem xét) v =T[i1 … i1+j1–1] đoạn so khớp P T i+j Đã có j1 = NEXT[j] Vậy, i1 = i + j – NEXT[j] Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 15 Ví dụ: T = AATAAAATA P = AAATA NEXT -1 i = AATAAAATA j = AAATA i = AATAAAATA j = AAATA Cấu trúc liệu giải thuật - HCMUS 2015 Ví dụ: T = AATAAAATA P = AAATA NEXT -1 i = AATAAAATA j = AAATA i = AATAAAATA j = AAATA (i = + – 1) (j = 1) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 16 Ví dụ: T = AATAAAATA P = AAATA NEXT -1 i = AATAAAATA j=0 AAATA (i = + – 0) (j = 0) i = AATAAAATA j=0 AAATA (i = + – (-1)) (j = 0) Cấu trúc liệu giải thuật - HCMUS 2015 Ví dụ: T = AATAAAATA P = AAATA NEXT -1 i = AATAAAATA j=3 AAATA i = AATAAAATA j=2 AAATA (i = + – 2) (j = 2) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 17 Ví dụ: T = AATAAAATA P = AAATA NEXT -1 i = AATAAAATA j=4 AAATA (Hồn tồn so khớp, vị trí xuất P T i=4) Cấu trúc liệu giải thuật - HCMUS 2015 Tính NEXT: O(m) Tìm kiếm: O(n) Tổng: O(n+m) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 18 Cấu trúc liệu giải thuật - HCMUS 2015 Thuật toán Knuth-Morris-Pratt cải tiến MorrisPratt cách bổ sung thêm điều kiện a ≠ c (vì a c khơng khớp sau dịch chuyển) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 19 Thay đổi cách tính bảng NEXT: Nếu p[i] ≠ p[j] NEXT[i] = j Ngược lại NEXT[i] = NEXT[j] Thao tác tìm kiếm khơng thay đổi Cấu trúc liệu giải thuật - HCMUS 2015 P = 10100 MP -1 0 KMP -1 -1 P = ABACAB MP -1 0 1 KMP -1 -1 -1 Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 20 Cấu trúc liệu giải thuật - HCMUS 2015 Là thuật tốn tìm kiếm chuỗi đề xuất Michael O Rabin Richard M Karp vào 1987 Sử dụng phép băm(hashing) Rabin Karp Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 21 T = “AADCABADCA” P = “BACD” =65 =263 =h_P +=+ = 265 263 264 266= 265 h_T = #263# h_T =266 h_T 266 = 265 =+ h_P h_P h_P # h_P ++ += += 65 65 +=65 +h_T 67 +266 65=h_T 66 65 65 68 + 67 67 h_T # 68 68 h_P = 67 266 265 =++265 #=+h_T h_P A A D D C A B B A A D C A A A D C A B A D C A C A D B C C C C D A D D A D B B i= C B5 A B A D CA AB D B Tư tưởng dịch chuyển chuỗi D = h_P B A h_P 266 = 266 = h_P 266 =h_P 266 = h_P 266 = h_P 266 266 Giảmh_P số =bước soC sánh thừa -> giảm chi phí -> thời gian tìm kiếm 66 chế: + 65 Tốn + 68 nhiều + 67 =chi 266 Hạn phí tính lại hash Cấu trúc liệu giải thuật - HCMUS 2015 Giải pháp: Rolling Hash 65 + 65 + 68 + 67 = 265 + -65 =+263 + 66 = 266 -==65 264 h_T = h_T 265 = 265 265h_T =65 266 h_T h_T + 65 263 h_T =263 265 -=68 264 h_T =67h_T 266 - 68 65 += 67 - 66+ = 26665 = 265 = 265 A A D C A A D C A B A D C B A B A D B C D A B C D A B C A D B C A D C D C A B h_PA= h_P 266D = h_P 266C = h_P 266 = h_P 266 = h_P 266 = 266 665 + =>i = 65 + 68 + 67 = 266 Tận dụng mã hash lần tính trước Lần tính không phụ thuộc vào độ dài chuỗi Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 22 Hàm băm Rabin–Karp h(x) = x mod q (q số nguyên tố lớn) xi = a[i]dm−1 + a[i + 1]dm−2 + + a[i +m − 1] • d số n … … i i+1 i+2 i+3 … i+m-1 i+m n-1 m Cấu trúc liệu giải thuật - HCMUS 2015 Ví dụ: T = “abracadabra” P = “arb” m = length(P) = x_P = [a].102 + [r].101 + [b].100 x0 = [a].102 + [b].101 + [r].100 x1 = [b].102 + [r].101 + [a].100 … x8 = [b].102 + [r].101 + [a].100 d = 10 Dùng số nhằm giảm khả đụng độ Hạn chế: Giá trị hàm hash tăng nhanh Chi phí tính tốn lớn Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 23 Rolling Hash xi = a[i]dm−1 + a[i + 1]dm−2 + + a[i +m − 1] n … … i i+1 i+2 i+3 … i+m-1 i+m n-1 m m−1)d xxi+1 = (x (xii −− a[i]d a[i]dm−1 )d ++ a[i a[i +m] +m] i+1 = Cấu trúc liệu giải thuật - HCMUS 2015 function RabinKarp(string s[1 n], string sub[1 m]) hsub := hash(sub[1 m]); hs := hash(s[1 m]) for i from to n-m+1 if hs = hsub if s[i i+m-1] = sub return i hs := hash(s[i+1 i+m]) return not found Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 24 RABIN-KARP-MATCHER( T, P, d, q ) n ← length[ T ] m ← length[ P ] h ← dm-1 mod q p ← t0 ← for i ← to m ► Preprocessing p ← ( d*p + P[ i ] ) mod q t0 ← ( d*t0 + T[ i ] ) mod q for s ← to n – m ► Matching if p = ts then if P[ m ] = T[ s+1 s+m ] then print “Pattern occurs with shift” s if s < n – m then ts+1 ← ( d * ( ts – T[ s + ] * h ) + T[ s + m + ] ) mod q Cấu trúc liệu giải thuật - HCMUS 2015 Gần tuyến tính Độ phức tạp: Tốt nhất: Xấu nhất: Trung bình: O(m + n) O(m.n) O(m + n) Được sử dụng tìm kiếm đa mẫu (multiple pattern search) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 25 Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 26 ... liệu giải thuật - HCMUS 2015 P = 10100 MP -1 0 KMP -1 -1 P = ABACAB MP -1 0 1 KMP -1 -1 -1 Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 20 Cấu trúc liệu giải thuật - HCMUS 2015 Là thuật. .. i = Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS Các thuật toán tiêu biểu: Brute Force Morris-Pratt Knuth-Morris-Pratt Rabin-Karp Boyer-Moore … Cấu trúc liệu giải thuật - HCMUS... NEXT: O(m) Tìm kiếm: O(n) Tổng: O(n+m) Cấu trúc liệu giải thuật - HCMUS 2015 © FIT-HCMUS 18 Cấu trúc liệu giải thuật - HCMUS 2015 Thuật toán Knuth-Morris-Pratt cải tiến MorrisPratt cách bổ