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

Thông tin cơ bản

Định dạng
Số trang 26
Dung lượng 1,48 MB

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