Thông tin tài liệu
Thuật Tốn Xử Lý Xâu THUẬT TỐN ỨNG DỤNG Bài tốn tìm kiếm xâu mẫu Thuật tốn trực tiếp Thuật toán Boyer-Moore Thuật toán Rabin-Karp Thuật tốn Knuth-Morris-Pratt (KMP) Xâu (Strings) § Xâu dãy ký hiệu lấy từ bảng ký hiệu (alphabet) å § Ký hiệu T [i j] xâu xâu T vị trí i kết thúc vị trí j T [1 n] a1 a2 – ai + aj – aj aj + an – an T [i j] Algorithmics Strings Trượt/đẩy (Shifts) § Giả sử T1 T2 xâu § |T1| = m |T2| = n § Ta nói T1 xuất nhờ trượt (đẩy) đến s T2 § T1[1 m] = T2[s + s + m] T1 = b1 bm trượt đến s T2 = a1 Algorithmics as + Strings as + m an Vị trí khớp khơng khớp § § § § § Giả sử T1 T2 hai xâu Nếu T1 xuất nhờ trượt đến s T2 s gọi vị trí khớp T1 T2 ngược lại s gọi vị trí khơng khớp Algorithmics Strings Bài tốn tìm kiếm xâu mẫu (The String Matching Problem) § Cho xâu T độ dài n Ø T gọi văn § Cho xâu P độ dài m Ø P gọi xâu mẫu (pattern) § Bài tốn: Tìm tất vị trí khớp P T § Ứng dụng: "trong thu thập thơng tin (information retrieval) "trong soạn thảo văn (text editing) "trong tính tốn sinh học (computational biology) " Algorithmics Strings Ví dụ § Ví dụ: T = 000010001010001 P = 0001, vị trí khớp là: Ø s =1 Ø T = 000010001010001 Ø P = 0001 Ø s=5 Ø T = 000010001010001 ØP = 0001 Ø s=11 Ø T = 000010001010001 ØP = 0001 Bài tốn tìm kiếm xâu mẫu Thuật tốn trực tiếp Thuật toán Boyer-Moore Thuật toán Rabin-Karp Thuật tốn Knuth-Morris-Pratt (KMP) Thuật tốn trực tiếp Nạve algorithm § Ý tưởng: Dịch chuyển vị trí s = 0,1, , n-m, với vị trí kiểm tra xem xâu mẫu có xuất vị trí hay khơng vị trí cuối cần xét: n – m b1 vị trí cần xét: b1 bm a1 am bm an – m + an Tính ts p =0; for (i=0; i and P[k+1] P[q] k p[k] if P[k+1] = P[q] then k ¬ k+1 p[q] ¬ k return p Ví dụ q = k = p[k+1] = a ¹ c = p[q] p[9] = p[p[p[6]]] = q k+1 p[k]+1 q ababababca ababababca ababababca ababababca ababababca k+1 k Thời gian tính Compute-Prefix-Function(P) m ¬ length[P] p[1] ¬ k¬0 for q = to m while k > and P[k+1] ¹ P[q] k ¬ p[k] // decrease k by at least if P[k+1] = P[q] then k ¬ k+1 // £ m - increments, each by 10 p[q] ¬ k 11 return p số lần decrements £ số lần increments, vậy, tổng cộng dòng thực nhiều m -1 lần Thời gian tính Q(m) KMP Algorithm KMP-Matcher(T, P) // n = |T| and m = |P| p ¬ Compute-Prefix-Function(P) // Q(m) time q¬0 for i ¬ to n while q > and P[q+1] ¹ T[i] q ¬ p[q] if P[q+1] = T[i] then q ¬ q+1 // £ n total increments if q = m then print “Pattern xuất vị trí” i - m q ¬ p[q] Thời gian tổng cộng: Q(m+n) // Q(n) time Ví dụ: Thực thuật tốn KMP i P[1 i] p[i] 10 11 a b a b b a b a b a a 0 2 abababbababbaababbababaa abababbababbaababbababaa ababbababaa ababbababaa đẩy q - p[q] = - đẩy - = abababbababbaababbababaa ababbababaa đẩy - = abababbababbaababbababaa ababbababaa abababbababbaababbababaa ababbababaa đẩy - = Thank you for your attentions!
Ngày đăng: 02/07/2022, 07:53
Xem thêm: