Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 89 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Tiêu đề
Thuật Toán Xử Lý Xâu
Định dạng
Số trang
89
Dung lượng
11,53 MB
Nội dung
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!