1. Trang chủ
  2. » Tất cả

Cấu trúc dữ liệu giải thuật đối sánh chuỗi ctdl 10 string matching

26 0 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

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ổ

Ngày đăng: 25/03/2023, 13:10

w