Bài giảng Cấu trúc dữ liệu và giải thuật - Đối sánh chuỗi - Đậu Ngọc Hà Dương
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và giải thuật - Đối sánh chuỗi - Đậu Ngọc Hà Dương", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_cau_truc_du_lieu_va_giai_thuat_doi_sanh_chuoi_dau.pptx
Nội dung text: Bài giảng Cấu trúc dữ liệu và giải thuật - Đối sánh chuỗi - Đậu Ngọc Hà Dương
- Giảng viên: Đậu Ngọc Hà Dương
- 2 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 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 3 Đối sánh chuỗi Từ khóa: String matching, String searching, Pattern searching, Text Searching Một trong những thuật toán quan trọng và có ứng dụng rộng rãi. Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 4 Ứng dụng của đối sánh chuỗi: Máy tìm kiếm Trình soạn thảo văn bản Trình duyệt web Sinh học phân tử (Tìm mẫu trong dãy DNA). Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 5 Mục tiêu: Kiểm tra sự tồn tại của một chuỗi ký tự (mẫu, pattern) trong một chuỗi ký tự có kích thước lớn hơn nhiều (văn bản, text). Nếu tồn tại, trả về một (hoặc nhiều) vị trí xuất hiện. 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 và T có cùng tập hữu hạn ký tự ∑. (∑ = {0, 1}; ∑={A, ,Z}, ) m ≤ n Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 6 Đối sánh chuỗi: Bằng cách lần lượt dịch chuyển (cửa sổ) P trên T. P tồn tại trên T tại vị trí bắt đầu là i (0 ≤ i ≤ n – m) nếu ◼ T[i + j] = P[j] với mọi 0 ≤ j ≤ m - 1. Ví dụ: P = abbaba T = ababaabbabaa => i = 5 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 7 Các thuật toán tiêu biểu: Brute Force Karp-Rabin Morris-Pratt Knuth-Morris-Pratt Boyer-Moore Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 9 Lần lượt kiểm tra điều kiện P[0 m-1] = T[i i+m-1] tại mọi vị trí có thể của i. Ví dụ Tìm kiếm P = aab trong T = acaabc Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 10 bruteForceMatcher(T, P) n ← length[T] m ← length[P] for i ← 0 to n - m if P[0 m-1] = T[i i+m-1] return i Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 11 Trường hợp tốt nhất – không tìm thấy: O(n). Trường hợp xấu nhất – không tìm thấy: O(n*m). Trường hợp trung bình: O(n+m). Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 12 Không cần thao tác tiền xử lý trên P. Luôn luôn dịch chuyển mẫu (cửa sổ) sang phải một vị trí. Thao tác so sánh có thể thực hiện theo bất kỳ chiều nào. Trường hợp xấu nhất: O((n-m+1)*m). Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 14 Điểm hạn chế của thuật toán Brute-Force: Không ghi nhớ được thông tin đã trùng khớp (trước) khi xảy ra tình trạng không so khớp. Phải so sánh lại từ đầu (trên P) trong tất cả trường hợp Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 15 Ví dụ: T: 10101011101001; P: 10100 Brute Force: s = 0, j = 4, T[s+j] != P[j] => s = 1, j = 0 ◼ T : 10101011101001 ◼ P: 10100 Cách khác? s = 0, j = 4, T[s+j] != P[j] => s = 2, j = 2 ◼ T : 10101011101001 ◼ P: 10100 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 16 Ghi nhận lại những phần của T đã trùng với P trước đó. Cố gắng tăng số bước dịch chuyển P trên T (thay vì 01 đơn vị). Cố gắng bỏ qua một số bước so sánh giữa P và T tại vị trí mới (thay vì j=0, gán j bằng một số thích hợp). Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 17 Giả sử: i là vị trí bắt đầu sự đối sánh (trên T). j là vị trí đang so sánh (trên P). (Ký tự tương ứng trên T tại vị trí i+j). T[i+j] != P[j] => không so khớp Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 18 Tìm: Vị trí mới i1 (trên T) và j1 (trên P) sao cho ◼ i+j = i1+j1 (vị trí đang xem xét) ◼ v =T[i1 i1+j1–1] là đoạn so khớp mới giữa P và T. Khi đó: Đoạn dịch chuyển cửa sổ: j – j1.(do j1 < j) Có thể tìm i1 dựa trên j1. Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 19 Vấn đề: Tìm giá trị j1 dựa trên j. Cách thức: Tính sẵn các giá trị của j1 ứng với mỗi giá trị j (dựa trên P). Câu hỏi: Có thể làm được không? Tại sao? Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 20 Bảng NEXT: Bảng chứa các giá trị j1 ứng với các giá trị j. Ví dụ: j 0 1 2 3 4 5 6 j1 -1 0 1 1 0 3 2 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 21 Hoàn toàn dựa trên P. Cách thức: NEXT[0] = -1 Với mỗi j > 0, giá trị của NEXT[j] (j1) là số k lớn nhất (k < j) sao cho: ◼ k ký tự đầu tiên khớp với k ký tự cuối trước vị trí j. ◼ Nghĩa là P[0 k-1] = P[j-k j-1] Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 22 Ví dụ: P = AAATA Bảng NEXT: ◼ NEXT[0] = -1 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 23 P = AAATA j = 1 NEXT[1] = 0 A A A T A A A A T A Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 24 P = AAATA j = 2 NEXT[2] = 1 A A A T A A A A T A Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 25 P = AAATA j = 3 NEXT[3] = 2 A A A T A A A A T A Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 26 P = AAATA j = 4 NEXT[4] = 0 A A A T A A A A T A Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 27 P = AAATA Bảng NEXT ◼ NEXT[0] = -1 ◼ NEXT[1] = 0 ◼ NEXT[2] = 1 ◼ NEXT[3] = 2 ◼ NEXT[4] = 0 0 1 2 3 4 NEXT -1 0 1 2 0 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 28 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 dữ liệu và giải thuật - HCMUS 2010
- 29 P = 10100 0 1 2 3 4 NEXT -1 0 0 1 2 P = ABACAB 0 1 2 3 4 5 NEXT -1 0 0 1 0 1 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 30 Mục tiêu : Xác định vị trí mới i1 (trên T) và j1 (trên P) sao cho ◼ i+j = i1+j1 (vị trí đang xem xét) ◼ v =T[i1 i1+j1–1] là đoạn so khớp mới giữa P và T. Đã có j1 = NEXT[j] Vậy, i1 = i + j – NEXT[j] Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 31 Ví dụ: T = AATAAAATA P = AAATA 0 1 2 3 4 NEXT -1 0 1 2 0 i = 0 AATAAAATA j = 0 AAATA i = 0 AATAAAATA j = 1 AAATA Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 32 Ví dụ: T = AATAAAATA P = AAATA 0 1 2 3 4 NEXT -1 0 1 2 0 i = 0 AATAAAATA j = 2 AAATA i = 1 AATAAAATA (i = 0 + 2 – 1) j = 1 AAATA (j = 1) Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 33 Ví dụ: T = AATAAAATA P = AAATA 0 1 2 3 4 NEXT -1 0 1 2 0 i = 2 AATAAAATA (i = 1 + 1 – 0) j = 0 AAATA (j = 0) i = 3 AATAAAATA (i = 2 + 0 – (-1)) j = 0 AAATA (j = 0) Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 34 Ví dụ: T = AATAAAATA P = AAATA 0 1 2 3 4 NEXT -1 0 1 2 0 i = 3 AATAAAATA j = 3 AAATA i = 4 AATAAAATA (i = 3 + 3 – 2) j = 2 AAATA (j = 2) Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 35 Ví dụ: T = AATAAAATA P = AAATA 0 1 2 3 4 NEXT -1 0 1 2 0 i = 4 AATAAAATA j = 4 AAATA (Hoàn toàn so khớp, vị trí xuất hiện của P trong T tại i=4) Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 36 Tính NEXT: O(m) Tìm kiếm: O(n) Tổng: O(n+m) Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 37 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 38 Thuật toán Knuth-Morris-Pratt cải tiến Morris- Pratt bằng cách bổ sung thêm điều kiện a ≠ c (vì nếu a =c sẽ không so khớp ngay sau khi dịch chuyển). Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 39 Thay đổi cách tính bảng NEXT: Nếu p[i] ≠ p[j] thì NEXT[i] = j Ngược lại NEXT[i] = NEXT[j] Thao tác tìm kiếm vẫn không thay đổi Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- 40 P = 10100 0 1 2 3 4 MP -1 0 0 1 2 KMP -1 0 -1 0 2 P = ABACAB 0 1 2 3 4 5 MP -1 0 0 1 0 1 KMP -1 0 -1 1 -1 0 Cấu trúc dữ liệu và giải thuật - HCMUS 2010
- Cấu trúc dữ liệu và giải thuật - HCMUS 2010