Dữ liệu trong máy tính được lưu trữ dưới rất nhiều dạng khác nhau, nhưng sử dụng chuỗi vẫn là một trong những cách rất phổ biến. Trên chuỗi các đơn vị dữ liệu không có ý nghĩa quan trọng bằng cách sắp xếp của chúng. Ta có thể thấy các dạng khác nhau của chuỗi như ở các file dữ liệu, trên biểu diễn của các gen, hay chính văn bản chúng ta đang đọc. Một phép toán cơ bản trên chuỗi là đối sánh mẫu (pattern matching), bài toán yêu cầu ta tìm ra một hoặc nhiều vị trí xuất hiện của mẫu trên một văn bản.. Trong đó mẫu và văn bản là các chuỗi có độ dài N và M (M ≤ N), tập các ký tự được dùng gọi là bảng chữ cái å, có số lượng là d. Việc đối sánh mẫu diễn ra với nhiều lần thử trên các đoạn khác nhau của văn bản. Trong đó cửa sổ là một chuỗi M ký tự liên tiếp trên văn bản. Mỗi lần thử chương trình sẽ kiểm tra sự giống nhau giữa mẫu với cửa sổ hiện thời. Tùy theo kết quả kiểm tra cửa sổ sẽ được dịch đi sang phải trên văn bản cho lần thử tiếp theo.
BÁO CÁO CHUYÊN ĐỀ CÁC THUẬT TOÁN ĐỐI SÁNH MẪU Họ tên: Nguyễn Viết Minh Mã SV: B12DCCN235 Lớp: D12CNPM1 I Nội dung chuyên đề: Hiện giới liệu tồn nhiều dạng khác nhau, liệu dạng text chiếm khối lượng không nhỏ Việc tìm kiếm số tài liệu khoảng thời gian nhanh chóng công việc có tính quan trọng bậc Việc so khớp chuỗi vị trí văn xuất chuỗi đầu vào có sẵn Ứng dụng tìm kiếm cho phép người dùng lọc thông tin tìm kiếm nhanh thông qua việc tìm kiếm từ khóa (keyword) Ngoài ra, việc so sánh chuỗi có ứng dụng ngành tin sinh học so khớp gen, xác định vị trí gen ADN, ARM, từ xác định phân chia tính trạng phân ly Điều có ý nghĩa to lớn việc thiết lập đồ gen người, tiến tới điều trị bệnh nan y biến đổi gen gây Do ý nghĩa vai trò to lớn đối sánh mẫu, nhiều thuật toán người nghĩ ra, triển khai áp dụng vào công việc so khớp chuỗi Dưới số thuật toán đối sánh mẫu II Các thuật toán đối sánh mẫu: Có 35 thuật toán đối sánh mẫu liệt kê đây: Thuật toán Knuth-Morris-Partt Thuật toán Karp-Rabin Thuật toán Shift or Thuật toán Morris-Partt Thuật toán Automat hữu hạn Thuật toán Simon Thuật toán Colussi Thuật toán Galil-Giancarlo Apostolico-Crochemore algorithm 10 Not So Naive algorithm 11 Turbo BM algorithm 12 Apostolico-Giancarlo algorithm 13 Reverse Colussi algorithm 14 Boyer-Moore algorithm 15 Horspool algorithm 16 Quick Search algorithm 17 Tuned Boyer-Moore algorithm 18 Zhu-Takaoka algorithm 19 Berry-Ravindran algorithm 20 Smith algorithm 21 Raita algorithm 22 Reverse Factor algorithm 23 Turbo Reverse Factor algorithm 24 Forward Dawg Matching algorithm 25 Backward Nondeterministic Dawg 2.38 Matching algorithm 26 Backward Oracle Matching algorithm 27 Galil-Seiferas algorithm 28 Two Way algorithm 29 String Matching on Ordered 30 Alphabets algorithm 31 Optimal Mismatch algorithm 32 Maximal Shift algorithm 33 Skip Search algorithm 34 KMP Skip Search algorithm 35 Alpha Skip Search algorithm III Phân loại thuật toán đối sánh mẫu: Ta phân loại thuật toán theo nhóm dựa cách thức tìm kiếm thuật toán Nhóm 1: Các thuật toán duyệt từ trái sang phải: Brute force algorithm Search with an automaton Karp-Rabin algorithm Shift Or algorithm Morris-Pratt algorithm Knuth-Morris-Pratt algorithm Apostolico-Crochemore algorithm Not so naive algorithm Nhóm 2: thuật toán duyệt từ phải sang trái: Boyer-Moore algorithm Turbo-BM algorithm Tuned boyer-moore algorithm Apostolico-giancarlo algorithm Zhu-Takaoka algorithm Berry-Ravindran algorithm Nhóm 3: thuật toán duyệt vị trí cụ thể: Colussi algorithm Skip search algorithm Nhóm 4: thuật toán duyệt vị trí bất kỳ: Horspool algorithm Quick Search algorithm Smith algorithm Raita algorithm IV Trình bày thuật toán tìm kiếm mẫu từ trái qua phải: Brute Force algorithm: 1.1 Đặc điểm: - Không có pha chuẩn bị - Bộ nhớ cần dùng cố định - Luôn dịch bước sang phải - Việc so sánh phải dùng trường hợp - Độ phức tạp pha thực thi O(m x n) 1.2 Trình bày thuật toán: Thuật toán Brute Force bao gồm kiểm tra, tất vị trí đoạn văn n-m, không cần quan tâm liệu mẫu có tồn vị trí hay không Sau đó, sau lần kiểm tra mẫu dịch sang phải vị trí 1.3 Kiểm thử thuật toán: X = “GCAGAGAG” Y = “GCATCGCAGAGAGTATACAGTACG” Quá trình tìm kiếm: G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G G C A T C G C A G A G A G T A T A C A G T A C G G C A G A G A G 1.4 Chương trình chạy: Search with an automaton: 2.1 Đặc điểm: - Yêu cầu xây dựng automation đơn định (DFA) - Pha xử lý có độ phức tạp tính toán O(n∂) - Quá trình tìm kiếm có độ phức tạp O(n) Trường hợp DFA đươc xây dựng cân độ phức tạp O(n*log(∂)) 2.2 Trình bày thuật toán: Trong thuật toán này, trình tìm kiếm đưa trình biến đổi trạng thái automat Hệ thống automat thuật toán DFA xây dựng dựa xâu mẫu Mỗi trạng thái (nút) automat lúc đại diện cho số ký tự khớp mẫu với văn Các ký tự văn làm thay đổi trạng thái Và đạt trạng thái cuối có nghĩa tìm vị trí xuất mẫu Thuật toán có phần giống thuật toán Knuth-Morris-Pratt việc nhảy trạng thái trước gặp ký tự không khớp, thuật toán DFA có đánh giá xác việc xác định vị trí nhảy dựa ký tự không khớp văn (trong thuật toán KMP lùi dựa vị trí không khớp) Việc xây dựng hệ automat đơn giản cài đặt ma trận kề Khi thuật toán có thời gian xử lý O(n) thời gian nhớ để tạo hệ automat O(m*d) (tùy cách cài đặt) Nhưng ta nhận thấy DFA có nhiều m cung thuận m cung nghịch, việc lưu trữ cung không cần thiết phải lưu ma trận kề mà dùng cấu trúc danh sách kề Forward Star để lưu trữ Như thời gian chuẩn bị lượng nhớ O(m) Tuy nhiên thời gian tìm kiếm tăng lên chút so với cách lưu ma trận kề 2.3 Kiểm nghiệm thuật toán: X = “GCAGAGAG” Y = “GCATCGCAGAGAGTATACAGTACG” Pha tiền xử lý xây đựng DFA: Pha tìm kiếm: Current state is: G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G G C A T C G C A G A G A G T A T A C A G T A C G 2.4 Chương trình chạy: Skip Search Algorithm: 2.1 Đặc điểm: - Sử dụng thùng chứa (bucket) vị trí xuất kí tự xâu mẫu - Pha xử lý có độ phực tạp thời gian không gian chứa O(m+ ∂) - Pha tìm kiếm có độ phức tạp thời gian O(mn) 2.2 Trình bày thuật toán: Với kí tự bảng chữ cái, thùng chứa (bucket) chứa tất vị trí xuất kí tự xâu mẫu x kí tự xuất k lần mẫu bucket lưu k vị trí kí tự Khi mà xâu y chứa it kí tự chữ có nhiều bucket rỗng Quá trình xử lý thuật toán Skip Search bao gồm việc tính buckets cho tất kí tự bảng chữ cái: for c in z[c] = {i : 0