Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
282,98 KB
Nội dung
1 Data Structures & Algorithms Các thuật toán đối sánh chuỗi (String Searching) Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM2 String Searching Giới thiệu Các bước xử lý Các cách tiếp cận Brute-Force Knuth-Morris-Pratt 2 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM3 Giới thiệu ªCác thuật ngữ thường dùng: String searching Pattern matching String matching Text searching Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM4 Giới thiệu (tt) ª“Đối sánh chuỗi”làgì? Cho một chuỗi T vàmột chuỗi P, hãy xác định P có xuất hiện trong T hay không ? Tương tự như lệnh: strstr(T, P) [trong C++] Pos(P, T) [trong Pascal] Pattern (P) Text (T) m n 3 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM5 Giới thiệu (tt) ªĐối sánh chuỗi làmột trong những bài toán cơ bản và“tự nhiên”nhất của ngành Tin Học ªCông dụng: Chức năng search trong các trình soạn thảo văn bản vàWeb browser Các công cụ search (vd. Google) Sinh học phân tử (tìm kiếm các mẫu trong DNA / protein) … Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM6 Giới thiệu (tt) ªLịch sử phát triển: Brute Force: Trong trường hợp xấu nhất thời gian thực hiện tỷ lệ với m*n Trong nhiều ứng dụng thực tế thời gian xử lý thực sự tỉ lệ với m+n Thích hợp với hầu hết các hệ máy tính Trong năm 1970, S.A.Cook đã chứng minh một kết quả lý thuyết giúp suy ra sự tồn tại của một thuật toán để giải bài toán đối sánh mẫu, cóthời gian tỷ lệ với M+N trong trường hợp xấu nhất 4 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM7 Giới thiệu (tt) ªLịch sử phát triển: D.E.Knuth và V.R.Pratt đã kiên trì theo đuổi kiến trúc mà Cook đã dùng để chứng minh cho cho định lý của ông vànhận được một thuật toán tương đối đơn giản. Đồng thời J.H.Morris cũng khám phára thuật toán này Knuth, Morris, Pratt đã không giới thiệu thuật toán của họ cho đến năm 1976, vàtrong thời gian này R.S.Boyer và J.S.Moore đã khám phára một thuật toán nhanh hơn nhiều Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM8 Giới thiệu (tt) ªLịch sử phát triển: Trong năm 1980, R.M.Karp và M.O.Rabin đã đi đến thuật toán đơn giản gần như thuật toán Brute Force, cóthời gian thi hành thường tỉ lệ với m+n 5 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM9 Giới thiệu (tt) ªCác thuật toán tiêu biểu: Brute Force Karp-Rabin Morris-Pratt Knuth-Morris-Pratt Boyer-Moore Boyer-Moore-Horspool Apostolico-Giancarlo Aho-Corasick Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM10 Các bước xử lý ªCác thuật toán đối sánh chuỗi thường có 2 bước xử lý sau: Bước tiền xử lý (Preprocessing Phase): Xử lý Pattern Khởi tạo cấu trúc dữ liệu Bước tìm kiếm (Searching Phase) Tìm kiếm Pattern trong Text 6 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM11 Các cách tiếp cận ª Có4 cách tiếp cận chính để làm tăng tốc độ thuật toán: Classical Algorithms Thuật toán chủ yếu dựa vào phép so sánh giữa các ký tự Thuật toán: Quick Search, Brute Force… Suffix Automata Algorithms Sử dụng Suffix Automaton Data Structure để nhận ra tất cả các hậu tố của Pattern Thuật toán: Knuth –Morris –Pratt… Bit-Parallelism Algorithms Khai thác bản chất song song của các dữ liệu bit để thực hiện các thao tác cùng lúc Thuật toán: Shift-Or… Hashing Algorithms Sử dụng kỹ thuật băm, tránh việc so sánh các ký tự có độ phức tạp bậc 2 Thuật toán: Karp-Rabin Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM12 Độ phức tạp ªĐộ phức tạp của thuật toán phụ thuộc vào 3 yếu tố sau: Chiều dài của Pattern Chiều dài của Text Độ lớn của tập các ký tự: Binary, DNA, Alphabets… 7 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM13 String Searching Giới thiệu Các bước xử lý Các cách tiếp cận Brute-Force Knuth-Morris-Pratt Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM14 Brute-Force ªÝ tưởng: Đối với vị tríthứ i của văn bản T (i=0…n-m), ta so sánh các ký tự của P tương ứng từ trái sang phải: P[0] với T[i], P[1] với T[i+1],…, P[m-1] với T[i+m-1] P[j] với T[i+j] (j = 0 m-1) ªVídụ: T = “TWO RED ROADS CROSSING” n = length(T) = 22 P = “ROADS” m = length(P) = 5 8 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM15 Brute-Force (tt) ªVídụ: Bước 1: TWO RED ROADS CROSSING ROADS Bước 2: TWO RED ROADS CROSSING ROADS … Bước 5: TWO RED ROADS CROSSING ROADS … Bước 9: TWO RED ROADS CROSSING ROADS Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM16 Brute-Force (tt) ªCài đặt bằng C: int stringSearchBF (char *P, char *T); Kết quả: -1 : nếu P không nằm trong T, hoặc >=0: vị trícủa P trong T 9 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM17 Brute-Force (tt) int stringSearchBF(char *P, char *T) { for (int i=0; i<=strlen(T)-strlen(P); i++) { int j = 0; while (j < strlen(P)) if (T[i+j]==P[j]) j++; else break; if(j==strlen(P))return i; // tìm thấy } return -1 ; // khôngtìm thấy } Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM18 Brute-Force (tt) ªĐánh giá: Trường hợp xấu nhất O(m*n) – tự chứng minh 10 Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM19 Brute-Force (tt) ªĐánh giá: Trường hợp tốt nhất O(n) – tự chứng minh Trường hợp trung bình O(n+m) – tự chứng minh Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM20 String Searching Giới thiệu Các bước xử lý Các cách tiếp cận Brute-Force Knuth-Morris-Pratt [...]... b) à sẽ “mismatch” ngay lần so sánh đầu tiên sau khi dịch chuyển j Autumn 2008 Data Structures & Algorithms - String Searching - Nguyen Tri Tuan, DH.KHTN Tp.HCM 35 Knuth-Morris-Pratt (tt) ªTóm lại: thuật toán KMP Giai đoạn tiền xử lý có một cải tiến nhỏ: Tính độ dịch chuyển tốt hơn à tránh so sánh cùng một ký tự trong T hai lần Giai đoạn tìm kiếm: hoàn toàn giống thuật toán Morris-Pratt Autumn 2008... dụng thông tin đã biết về các ký tự đã so sánh Biến j thể hiện số ký tự đã được so khớp giữa mẫu (P) và văn bản (T) Khi gặp vị trí không so khớp, thay vì gán j = 0 để quay lại từ đầu chuỗi P, ta sẽ gán cho j một giá trị thích hợp Autumn 2008 Data Structures & Algorithms - String Searching - Nguyen Tri Tuan, DH.KHTN Tp.HCM 22 11 Morris-Pratt (tt) // Tư tưởng chính của thuật toán Morris-Pratt // giai...Đặt vấn đề ª Trong thuật toán Brute-Force: khi xảy ra không so khớp tại một ký tự, ta đã xóa bỏ tất cả thông tin có được bởi các phép so sánh trước đó và bắt đầu lại việc so sánh từ ký tự đầu tiên của mẫu P [i=i+1; j=0] ª Ví dụ: T = 101010100111; P = 10100 101010100111 10100 101010100111 10100 (không... p[j]) { i++; j++; NEXT[i] = j; } else j = NEXT[j]; } } Autumn 2008 Data Structures & Algorithms - String Searching - Nguyen Tri Tuan, DH.KHTN Tp.HCM 30 15 Morris-Pratt (tt) ª Cài đặt bằng C: // Thuật toán đối sánh Morris-Pratt // Kết quả: // -1 : nếu P không nằm trong T, hoặc // >=0 : vị trí của P trong T int stringSearchMP (char *P,char *T) { int n = strlen(T); int m = strlen(P); int *NEXT = new int[m];... Nguyen Tri Tuan, DH.KHTN Tp.HCM 22 11 Morris-Pratt (tt) // Tư tưởng chính của thuật toán Morris-Pratt // giai đoạn tìm kiếm i = j = 0; while (i+j < n) { if (p[j]==t[i+j]) { j++; // khi đã đi hết độ dài của chuỗi P // à đã tìm được P à trả về vị trí tìm được if (j==m) return i; } else { // khi không so khớp, dịch chuyển về vị // trí NEXT[j] i = i + j – NEXT[j]; if (j > 0) j = NEXT[j]; } return -1; // không... Structures & Algorithms - String Searching - Nguyen Tri Tuan, DH.KHTN Tp.HCM 33 Morris-Pratt (tt) ªĐộ phức tạp: Giai đoạn tiền xử lý: O(m) (tính NEXT) Giai đoạn tìm kiếm: O(n) Tổng: O(n+m) Số phép so sánh lớn nhất của một ký tự 0, giá trị của NEXT[j] là số k lớn nhất nhỏ hơn j sao cho k ký tự đầu tiên của mẫu P khớp với k ký tự cuối của P[0 j-1] Ví dụ: P = AAATA NEXT[1] = 0 (j=1) NEXT[2]... Structures & Algorithms - String Searching - Nguyen Tri Tuan, DH.KHTN Tp.HCM 37 Knuth-Morris-Pratt (tt) ªĐộ phức tạp: Giai đoạn tiền xử lý: O(m) (tính NEXT) Giai đoạn tìm kiếm: O(n) Tổng: O(n+m) Số phép so sánh lớn nhất của một ký tự