Khoá luận tốt nghiệp một số thuật toán tìm chuỗi và xây dựng chương trình minh họa thuật toán boyer moore

36 655 4
Khoá luận tốt nghiệp một số thuật toán tìm chuỗi và xây dựng chương trình minh họa thuật toán boyer   moore

Đ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

NGUYỄN THỊ NGỌC ANH TRƯỜNG ĐẠI HỌC sư PHẠM HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN MỘT SÓ THUẬT TOÁN TÌM CHUỖI VÀ XÂY DựNG CHƯƠNG TRÌNH MINH HỌA THUẬT TOÁN BOYER MOORE KHÓA LUẬN TÓT NGHIỆP ĐẠI HỌC • ••• Chuyên ngành: Khoa học máy tính NGUYỄN THỊ NGỌC ANH • MỘT SÓ THUẬT TOÁN TÌM CHUỖI VÀ XÂY DựNG CHƯƠNG TRÌNH MINH HỌA THUẬT TOÁNTRƯỜNG BOYER MOORE ĐẠI -HỌC sư PHẠM HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC • ••• Chuyên ngành: Khoa học máy tính Ngưòi hướng dẫn khoa học TS. TRỊNH ĐÌNH VINH LỜI CẢM ƠN Để hoàn thành khóa luận, nghiên cứu cố gắng thân, em xin gửi lòi cảm ơn tới TS. Trinh Đình Vinh giáo viên trực tiếp hướng dẫn, tận tình bảo định hướng cho em ữong suốt trình thực khóa luận. Em xin gửi lòi cảm ơn chân thành cảm ơn tất thầy, cô giáo trường Đại học Sư phạm Hà Nội nói chung thầy, cô giáo khoa Công nghệ thông tin nói riêng giảng dạy dìu dắt em ữong ữong suốt trình học tập trường. Cuối cùng, em xin gửi lời cảm ơn tới gia đình, bạn bè người bên cổ vũ tinh thần, tạo điều kiện thuận lợi cho em để em học tập tốt hoàn thiện khóa luận. Với điều kiện thòi gian nghiên cứu vốn kiến thức thân em hạn chế nên chương trình không ừánh khỏi thiếu sót. Em mong nhận bảo quý báu quý thầy, cô giáo bạn bè để chương trình em hoàn thiện hơn. Em xin chân thành cảm ơn! Hà Nội, ngày 10 tháng 05 năm 2015 Sinh viên thực Nguyễn Thị Ngọc Anh LỜI CAM ĐOAN Tên em là: Nguyễn Thị Ngọc Anh Sinh viên lớp: K37A - Tin học, khoa Công nghệ Thông tin, trường Đại học Sư phạm Hà Nội 2. Em xin cam đoan: 1. Nội dung đề tài: “Một số thuật toán tìm chuỗi xây dựng chương trình minh họa thuật toán Boyer - Moore” nghiên cứu riêng em. 2. Kết nghiên cứu em không trùng vói kết tác giả khác. Nếu sai em xin hoàn toàn chịu trách nhiệm. Hà Nội, ngày 10 tháng 05 năm 2015 Sinh viên thực Nguyễn Thị Ngọc Anh MỤC LỤC 1.2.1. 1.3. Thuật toán so khớp chuỗi FRANEK - JENNINGS - SMYTH (FJS) 35 1.3.1. 1.3.2 . 1.3.3. MỞ ĐẦU 1. Lý lựa chọn đề tài 1.3.4. Với bùng nổ phát triển công nghệ thông tin ữong năm gần đây, mang lại nhiều hiệu khoa học hoạt động thực tế, phát triển mạnh mẽ công nghệ thông tin làm cho khả thu thập lưu trữ thông tin hệ thống thông tin tăng lên cách nhanh chóng, lượng liệu lưu trữ ữở nên nhiều. Vì việc xử lý thông tin gặp phải nhiều khó khăn, đặc biệt công tác tìm kiếm. 1.3.5. Dữ liệu máy tính lưu trữ nhiều dạng khác liệu dạng chuỗi ữong cách phổ biến nhất. Trên chuỗi đơn vị liệu ý nghĩa quan trọng cách xếp chúng. Có thể thấy dạng khác chuỗi file liệu, gói tin, biểu diễn gen hay văn đọc. Để tìm kiếm thông tin hữu ích nhiều giải pháp, đề xuất áp dụng, bao gồm giải pháp dựa phần cứng phần mềm. Tuy nhiên, hàu hết hệ thống tìm kiếm thông tin gặp phải nhiều vấn đề hiệu chúng phải phân tích, xử lý lượng lớn chuỗi liệu. Hơn việc phân tích, tìm kiếm, so khớp chuỗi đòi hỏi chi phí tính toán thòi gian xử lý lớn. Khi lượng liệu lớn, nhiều thông tin bị bỏ qua không phân tích, không đáp ứng nhu cầu người sử dụng. 1.3.6. Để tìm kiếm thông tin cách xác mà không nhiều thời gian cần phải sâu nghiên cứu thuật toán so khớp chuỗi có hiệu cao. Một thuật toán so khớp chuỗi có hiệu cao thuật toán Boyer - Moore. 1.3.7. Chính lý nên em chọn đề tài “Một số thuật toán tìm chuỗi xây dựng chương trình minh họa thuật toán Boyer - Moore” làm khóa luận tốt nghiệp mình. 2. Mục tiều nhiệm vụ nghiên cứu 1.3.8. Mục tiêu - Áp dụng thuật toán Knuth - Morris - Pratt, Boyer - Moore, Franek Jennings - Smyth để tìm chuỗi. - Xây dựng chương trình minh họa thuật toán Boyer - Moore. 1.3.9. Nhiệm vụ - Tìm hiểu số thuật toán so khớp chuỗi. - Xây dựng chương trình tìm kiếm văn mã Unicode dựa thuật toán Boyer - Moor cải tiến bảng giá trị dịch chuyển chiều. Cài đặt thử nghiệm đánh giá kết quả. 3. Đối tượng phạm vi nghiên cứu 1.3.10. Khóa luận sâu nghiên cứu số thuật toán tìm chuỗi xây dựng chương trình minh họa thuật toán Boyer - Moore cải tiến để tìm kiếm chuỗi mã Unicode. 4. Giả thuyết khoa học 1.3.11. Tìm hiểu, nghiên cứu số thuật toán tìm chuỗi giúp người lập trình hiểu rõ công tác tìm kiếm. Từ đó, việc xây dựng chương trình tìm kiếm văn bản, tìm kiếm thông tin chương trình tìm kiếm mẫu vết công lĩnh vực an toàn mạng, . trở nên dễ dàng hơn. 1.3.12. Chương trình xây dựng đưa vào thực tiễn ượ giúp đắc lực cho người sử dụng ưong việc tìm kiếm thông tin cách nhanh chóng, xác mà không nhiều thời gian. 5. Phương pháp nghiên cứu a. Phương pháp nghiên cứu lý luận 1.3.13. Nghiên cứu qua việc đọc sách, báo tài liệu liên quan nhằm xây dựng sở lý thuyết đề tài biện pháp cần thiết để giải vấn đề đề tài. b. Phương pháp chuyên gia 1.3.14. Tham khảo ý kiến chuyên gia, tìm hiểu quan điểm, kinh nghiệm họ để thiết kế chương trình phù hợp vói yêu cầu thực tiễn. c. Phương pháp thực nghiệm 1.3.15. Căn vào quan sát thực tiễn, yêu càu sở, vào lý luận nghiên cứu kết đạt để có tương tác người dùng chương trình, từ yêu cầu thiết kế hiệu quả. 6. Ý nghĩa khoa học thực tiễn 1.3.16.Ý nghĩa khoa học 1.3.17.Nội dung nghiên cứu khóa luận góp phần làm rõ công tác tìm kiếm số thuật toán so khớp chuỗi. 1.3.18.Ý nghĩa thực tiễn 1.3.19.Chương trình minh họa thuật toán Booyer - Moore thành công góp phần phát triển công tác tìm kiếm ứng dụng tìm kiếm chuỗi văn bản, sinh học phân tử lĩnh vực an toàn mạng, an toàn thông tin, . Giúp người tìm kiếm thông tin xác cách nhanh nhất. 7. Cấu trúc khóa luận 1.3.20. Ngoài phần mở đầu, kết luận hướng phát triển, tài liệu tham khảo cấu trúc khóa luận bao gồm chương sau: 1.3.21.Chương 1: Cơ sở lý thuyết 1.3.22.Chương 2: Một số thuật toán tìm chuỗi 1.3.23.Chương 3: Xây dựng chương trình demo 1.3.24.CHƯƠNG 1: Cơ SỞ LÝ THUYẾT 1.1. Bài toán tìm kiếm hướng giải 1.1.1. Bài toán tìm kiếm 1.3.25.Ngày nay, máy tính sử dụng ữong lĩnh vực đời sống, theo kho thông tin máy tính tăng trưởng không ngừng. Để tìm kiếm thông tin hữu ích, nhiều giải pháp, đề xuất áp dụng, bao gồm giải pháp dựa phần cứng phần mềm. Tuy nhiên, hàu hết hệ thống tìm kiếm thông tin có gặp phải vấn đề hiệu chúng phải phân tích, xử lý lượng lớn chuỗi liệu. Vậy làm để ngân hàng nắm giữ tất thông tin nhiều tài khoản khách hàng càn tìm kiếm để kiểm tra biến động, hãng bảo hiểm hay hệ thống trợ giúp bán vé xe, vé máy bay, . cách xác, cần phải tìm hiểu sâu toán tìm kiếm. 1.3.26.Tìm kiếm thao tác móng cho nhiều tác vụ tính toán. Tìm kiếm nghĩa tìm hay nhiều mẩu thông tin lưu trữ. Dạng phổ biến toán tìm kiếm là: Cho trước nguồn tìm kiếm tập D văn (hoặc sở liệu văn bản, tập văn Internet). Cho chuỗi mẫu q (thường từ, chuỗi ký tự ngắn), tìm tất văn thuộc D mà có chứa q. Trong nhiều trường họp (chẳng hạn, tìm kiếm thông qua máy tìm kiếm) q gọi "truy vấn" toán có tên gọi "tìm kiếm theo truy vấn". Để tìm văn có chứa chuỗi truy vấn q, hệ thống tìm kiếm cần phải kiểm tra chuỗi truy vấn q có chuỗi văn thuộc tập D hay không (so khớp) đưa văn đáp ứng. Trong nhiều trường họp, toán đòi hỏi tìm tất vị trí chuỗi văn trùng với q. Đồng thòi, điều kiện tìm kiếm làm "xấp xỉ" theo nghĩa chuỗi kết không cần chứa q (không cần có chuỗi văn trùng cách hoàn toàn xác với q) mà cần "liên quan" tói q (có chuỗi văn 1.3.27. “xấp xỉ” q). Có thể thấy, máy tìm kiếm sử dụng chế tìm kiếm xấp xỉ mà văn kết tìm kiếm không chứa hoàn toàn chuỗi truy vấn. 1.1.2. Hướng giải 1.3.28. Để giải toán tìm kiếm có nhiều phương pháp, giải thuật nghiên cứu: - lìm kiếm danh sách: Là giải thuật đơn giản, tìm tập hợp phần tử chứa khóa đó. - lìm kiếm cây: Là trung tâm kĩ thuật tìm kiếm, thuật toán tìm kiếm gồm nút, tường minh xây dựng dần trình tìm kiếm - lìm kiếm đồ thị: Là thuật toán giải toán lý thuyết đồ thị. - lìm kiếm đối kháng: Trong trò chơi cờ vua hay cờ tướng, có ừò chơi bao gồm tất nước hai đấu thủ cấu hình bàn cờ kết nước đó. Ta tìm kiếm để có chiến lược chơi hiệu quả. - lìm chuỗi: So sánh nhiều chuỗi mẫu với văn để tìm vị trí số lần xuất cửa chuỗi mẫu văn bản. 1.3.29. Tùy thuộc vào mục đích tìm kiếm khác mà dựa thuật toán, thuật giải khác để giải toán. Từ xây dựng chương trình cài đặt cụ thể. 1.2. So khớp chuỗi 1.2.1. Khái niệm 1.2.1.1. Chuỗi 1.3.30. Chuỗi nhóm ký tự, số, khoảng trắng, dấu ngắt đặt dấu nháy. 1.3.31. Giả sử s chuỗi ký tự có kích thước m. Một chuỗi S[i j] chuỗi s phân đoạn chuỗi có số i j. Một chuỗi tiền tố chuỗi s 1.3.32. chuỗi S[0 i]. Một chuỗi hậu tố chuỗi s chuỗi S[i m-1], i số m-1. 1.3.33.Ví dụ: - Khoảng cách Levenshtein: Phép sửa đổi bao gồm chèn, xoá, thay ký tự. - Khoảng cách Damerau: Phép sửa đổi bao gồm chèn, xoá, thay hoán vị liền kề ký tự. 1.3.116. Xâu chung dài (hay khúc chung dài nhất): Một xâu w x â u c o n h a y k h ú c c o n ( s u b s t r i n g o r f a c t o r ) c ủ a x â u X n ế u X = U W V ( u , Y c ó t h ể rỗng). Xâu w khúc chung hai xâu X, y w đồng thời khúc X y. Khúc chung dài hai xâu X y, ký hiệu LCF(x,y), khúc có độ dài lớn nhất. 1.3.117. Dãy chung dài nhất: Một dãy xâu X dãy ký tự có cách xoá không, nhiều ký tự từ X . Dãy chung hai xâu X, y dãy hai xâu X y. Dãy chung X y có độ dài lớn gọi dãy chung dài LCS(x,y). Có thể dùng độ dài dãy chung hai xâu X , y để tính khoảng cách Levenstein X y theo công thức: 1.3.118.LevDistance (x,y) = m + n - length(LCS( x,y)) 1.2.6. ứng dụng 1.3.119. So khớp chuỗi toán “tự nhiên” ngành Tin học. So khớp chuỗi sử dụng rộng rãi ưong nhiều ứng dụng lĩnh vực khác như: - Chức search trình soạn thảo văn web browser. Các công cụ tìm kiếm như: Google Search, Yahoo Search, - Sinh học phân tử ừong tìm kiếm mẫu DNA, protein, . - lìm kiếm sở liệu GenBank. - Trong nhiễu kênh vói cho phép chấp nhận được. - Trong tìm kiếm mẫu vết công, đột nhập phần mềm độc hại lĩnh vực an toàn mạng an toàn thông tin 1.3.120. CHƯƠNG 2: MỘT SỔ THUẬT TOÁN TÌM CHUỖI 2.1. Thuật toán so khớp chuỗi 2.1.1. Phát biểu toán 1.3.121. Giả sử chuỗi s mảng có độ dài n (S[l n]) chuỗi mẫu p có độ dài m (P[l m]). Các Phần tử s p ký tự tập hữu hạn alphabet z. Ví dụ: z = {0,1} = {a,b,c .,z}. Mảng ký tự s p gọi chuỗi ký tự. 1.3.122. Khi toán so khớp chuỗi phát biểu sau: Cho chuỗi ban đàu s chuỗi mẫu p. So khớp chuỗi việc tìm chuỗi mẫu p chuỗi ban đầu s. Nếu chuỗi mẫu p tìm thấy chuỗi ban đầu s vị trí s mà chuỗi mẫu p tìm thấy. 1.3.123. Hay: Có thể nói chuỗi mẫu p tìm thấy với s lần dịch chuyển chuỗi ban đàu s. Điều tương đương với việc chuỗi mẫu p tìm thấy bắt đàu từ vị trí s +1 chuỗi ban đầu s thỏa mãn điều kiện < s < n - m S(s +1, ., s + m) = P(l .m) tức S(s + j) = P(j) với 1< j < m. 1.3.124. Nếu p tìm thấy s s gọi giá tri dịch chuyển. Còn trường hợp ngược lại (tức không tìm thấy mẫu p S) s gọi giá trị dịch chuyển không họp lệ. 1.3.125. Tóm lại: Bài toán so khớp chuỗi toán tìm giá trị dịch chuyển s cho sau số lần dịch chuyển tìm chuỗi mẫu p chuỗi ban đầu s. 2.1.2. Thuật toán so khớp chuỗi thô 1.3.126. Thuật toán so khớp chuỗi thô thuật toán tìm tất giá trị dịch chuyển, sử dụng vòng lặp để kiểm ừa điều kiện P[l .m] = S[s + 1.3.127. m] với giá tri (n - m + 1) s. a. Thuật toán so khớp chuỗi (S, P) int n = strlen(S); int m = strlen(P); 1.3.128. for (int s = 0, int p = s; s < n - m; S++, P++) if(P[p] = S[s]) 1.3.129. print (“Mau duoc tim thay sau %d lan dich chuyen”, s); + b. Mô tả thuật toán 1.3.130. Thuật toán so khớp chuỗi thô thực sau: Tiến hành so sánh phần tử thứ chuỗi mẫu p với phần tử thứ chuỗi ban đầu s. Nếu hai phần tử giống nhau, tiến hành so sánh tiếp phần tử thứ 2. Cứ tìm chuỗi p s phát vị trí mà phần tử s p khác nhau. 1.3.131. Trong trường hợp phát vị trí mà phần tử s p khác cần tiến hành dịch phải chuỗi p phần tử so với chuỗi s. Lặp lại thao tác so sánh đạt kết quả. c. Ví dụ minh họa cho thuật toán • •• 1.3.132. Giả sử chuỗi s = abcabaabcabac p = abaa 1.3.133. Tiến hành thực thuật toán so khớp chuỗi (S, P): 1.3.134. Bước 1: So sánh phàn tử S(l) P(l) 1.3.135. S: abcabaabcabac P: a b a a 1.3.136. Bước 2: Sau thấy hai phần tử S(l) = P(l) tiến hành so sánh tiếp phần tử S(2) P(2). 1.3.137. 1.3.139. S: abcabaabcabac 1.3.138. P: a b a a 1.3.140. Bước 3: So sánh phần tử S(3) P(3) S: 1.3.141. abcabaabcabac P: a b a 1.3.142. Tại vị trí hai phần tử S(3) P(3) không giống nhau, tiến hành dịch p sang phải vị trí lặp lại bước so sánh. 1.3.143. Bước 4: Dịch p sang phải vị trí, so sánh hai phần tử S(l) P(l) S: abcabaabcabac 1.3.144. 1.3.145. 1.3.146. P:aba a Cứ lặp lặp lại bước thuật toán so khớp chuỗi thô. Sau lần dịch phải chuỗi p thu kết sau: 1.3.147. S: abcabaabcabac 1.2.17. 1.3.148. 1.3.149. aP b a a d. Đánh giá thuật toán 1.3.150. Việc tiến hành theo bước thuật toán so khớp chuỗi thô trả cho kết có tìm thấy chuỗi mẫu p chuỗi ban đầu s hay không. Nếu chuỗi mẫu p tìm thấy tìm thấy vị trí phần tử 1.3.151. chuỗi s. 1.3.152. Tuy nhiên thuật toán so khớp chuỗi gặp nhược điểm lớn thời gian thực thuật toán sau: - Với n độ dài chuỗi ban đầu s, m độ dài chuỗi mẫu p thời gian so khớp hai chuỗi O(mn). Đây thời gian lớn làm cho thuật toán có tốc độ chậm. - Nguyên nhân việc chậm việc so sánh phàn tử chuỗi s thực lặp lặp lại lần so sánh tiếp theo. Trongví dụ nêu việc so sánh hai phần tử vị trí tương ứng hai chuỗi s p phát vị trí khác đàu tiên sau lần so sánh, tức S(3) P(3) khác nhau. Theo thuật toán chuỗi mẫu p dịch sang phải so với chuỗi s vị trí việc so sánh lại bắt đầu lại từ đầu. Mặc dù lần so sánh trước biết giá trị S(l) biết S(l) khác P(0). Đây việc làm lặp lặp lại S(l) lần so sánh tiếp theo, làm tăng thời gian thực thuật toán. 1.3.153. Như vậy, thuật toán so khớp chuỗi thô thuật toán tối ưu. Vì cần xem xét đến phương án tối ưu hơn, có thời gian thực thuật toán nhỏ hơn. 2.2. Thuật toán so khớp chuỗi KNUTH - MORRIS - PRATT (KMP) 1.3.154. Để khắc phục nhược điểm thòi gian thực thuật toán lớn, D.E.Knuth V.R.Pratt xây dựng thuật toán so khớp chuỗi tuyến tính. Thời gian thực thuật toán 0(n + m) dựa việc tính hàm tiền tố n[l, .,m] tính toán chuỗi mẫu p thời gian O(m). Mảng n giúp cho việc tính toán bước dịch chuyển cách hiệu quả. 2.2.1. Hàm tiền tổ n 1.3.155. Hàm tiền tố n chuỗi mẫu đưa cách làm để chuỗi so khớp dựa vào việc dịch chuyển nó. Giá trị hàm tiền tố sử dụng để ngăn ngừa việc kiểm tra lần dịch chuyển vô ích chuỗi mẫu p. a. Thuật toán để tính hàm tiền tố I I : 1.3.156. Giả sử có chuỗi mẫu p có độ dài m. Tính hàm tiền tố p theo thuật toán sau: 1.3.157. int m = strlen(P); 1.3.158. n ( l ) = 0; k = 0; 1.3.159. for (q = 2,q < m, q++) 1.3.160. 1.3.161. { k = n(k); while ((k>0) && (P[k+1] ! = P[q])) if(P[k+l]=P[q]) k = k+1; n(q) = k; 1.3.162. return II; b. Mô tả thuật toán tính hàm tiền tố n 1.3.163. Hàm tiền tố n chuỗi mẫu p có độ dài m tính sau: Gán giá trị n(l) = 0; k = 0. Cho q chạy từ đến m, thực hiện: - So sánh giá trị P[k + 1] P[q]. Nếu P[k + 1] ^ P[q] gán k = n(k) - So sánh tiếp giá trị P[k + 1] P[q] (Với k giá trị vừa tìm bước trên). Nếu P[k + 1] = P[q] gán k = k + - Gán n(q): = k Trả lại giá trị n(q) c. Ví dụ minh họa cho thuật toán tính hàm tiền tố: • ■• 1.3.164. Cho chuỗi mẫu p = ababaca. Khi m = 7; n(l) = 0; k = 0. Tính hàm tiến tố chuỗi p. - Bước 1: Với q = k = so sánh thấy: 1.3.165. - - - P(k + 1) = P(l) = a khác P(q) = P(2) = b => k = =>n(2) = Bước 2: Với q = k = so sánh thấy: 1.3.166. P(k + 1) = P(l) = a = P(q) = P(3) = a => k = 1.3.167. mặt khác P(k + 1) = P(2) = b * P(q) = P(3) = a =>n(3) = Bước 3: Với q = k = so sánh thấy: 1.3.168. P ( k + l ) = P(2) = b = P(q) = P(4) = b = > k = 1.3.169. mặt khác P(k + 1) = P(3) = a ^ P(q) = P(4) = b =>n(4) = Bước 4: Với q = k = so sánh thấy: 1.3.170. P(k + 1) = P(3) = a = P(q) = P(5) = a => k = 1.3.171. mặt khác P(k + 1) = P(4) = b * P(q) = P(5) = a =>n(5) = -Bước 5: Với q = k = so sánh thấy: 1.3.172. P(k + 1) = P(4) = b * P(q) = P(6) = c => k = n(k) = n(3) = mặt khác P(k + 1) = P(2) = b ^ P(q) = P(6) = c =>n(6) =1 -Bước 6: Với q = k = so sánh t h ấ y : 1.3.173. P(k + 1) = P(2) = b 56 P(q) = P(7) = a^k = n(k) = n(2) = mặt khác P(k + 1) = P(l) = a = P(q) = P(7) = a=>n(7) = Sau tính toán cụ thể, giá trị hàm tiền tố n chuỗi p = ababaca có độ dài (Bảng 2.1). 1.2.18. Bảng 2.1 Giá trị hàm tiền tố n 1.2.23. 1.2.26. 1.2.19. 1.2.20. 1.2.21. 1.2.22. 1.2.24. 1.2.25. q 11.2.28. 21.2.29. 31.2.30. 51.2.32. 61.2.33. 1.2.31. 1.2.34. 1.2.27. p a b a b a c a 1.2.41. 1.2.42. 1.2.35. 1.2.36. 1.2.37. 1.2.38. 1.2.39. 1.2.40. 1.3.174. 1.3.175. n Với chuỗi ban đầu s, chuỗi mẫu p hàm tiền tố n chuỗi p, tìm chuỗi mẫu p chuỗi ban đầu s trả số lần dịch chuyển p thời điểm tìm thấy. 2.2.2. Thuật toán KMP 1.3.176. Knuth - Morris - Pratt xây dựng thuật toán so khớp chuỗi với chuỗi mẫu p có độ dài m chuỗi ban đầu s có độ dài n dựa vào việc tính hàm tiến tố n chuỗi p so sánh phần tử chuỗi s p. 1.3.177. - Input: - Chuỗi ban đầu s Chuỗi mẫu p Output: - Số lần dịch chuyển để tìm thấy mẫu p. 1.3.178. Thuât toán Knuth - Morris - Pratt 1.3.179. • 1.3.180. int n = strlen(S); int m = strlen(P); 1.3.181. //Tính hàm tiến tố n i n t q = 0; 1.3.182. for (i = 1, i < n,i++) 1.3.183. { q = n[q]; 1.3.184. While ((q>0) && (P[q+1])) if P[q+1] = S[i] then q = q + 1; if q = m 1.3.185. then print “chuoi mau duoc tim thay sau”, “lan dich”, i - m); q = n[q]; 1.3.186. Mô tả thuật toán 1.3.187. Thuật toán so khớp chuỗi Knuứi - Morris - Pratt ứiực sau: - Gán n độ dài chuỗi ban đầu s. - Gán m độ dài chuỗi mẫu p. - Tính hàm tiền tố n chuỗi mẫu p theo thuật toán tìm hàm tiền tố trình bày trên. - Gán giá tri q = 0. - Cho i chạy từ đến n (tức duyệt ký tự s từ trái sang phải). So sánh P[q +1] S[i]. Nếu P[q +1] ^ S[i] gán q = n[q], không so sánh tiếp ký tự sau. - So sánh tiếp P[q +1] S[i]. Nếu P[q +1] = S[i] tăng q lên (q = q + 1) so sánh tiếp ký tự sau. - So sánh giá trị q m. Nếu q = m tức ký tự so khớp kết luận chuỗi mẫu p tìm thấy sau (m - i) lần dịch chuyển gán q = n[q] để tìm lần so khớp tiếp. • 1.3.188. •• Ví dụ minh họa cho thuật toán 1.3.189. So khớp chuỗi mẫu p = ababaca có m = với chuỗi ban đầu s = bacbabababacaab có n = 15. Theo ví dụ minh họa cho thuật toán tìm hàm tiền tố chuỗi mẫu p có kết bảng 2.1 1.2.43. 1.3.190. 1.3.191. P: ababaca 1.3.192. Thấy P [ l ] ^ S [ l ] = > q = 0, không so sánh tiếp dịch chuỗi p sang phải so với chuỗi s vị trí. - Bước 2: Với i = 2, q = 0, so sánh P[l] S[2]: 1.3.193. S: bacbabababacaab 1.3.194. P: ábabaca 1.3.195. Thấy P[l] = SỊa] => q = 1, không dịch chuỗi p mà so sánh tiếp ký tự tiếp theo. - Bước 3: Với i = 3, q = so sánh P[2] S[3]: S: bacbabababacaab 1.3.196. 1.3.197. P: ababaca 1.3.198. Thấy P[2] ^ S[3] => q = n ( l ) = 0, không so sánh tiếp dịch chuỗi p sang phải so với chuỗi s vị trí để so sánh bước so sánh P[l] S[4]. - Bước 4: Với i = 4, q = 0, so sánh P[l] S[4]: 1.3.199. S: bacbabababacaab P 1.3.201. 1.3.200. a b a b a c a Thấy P[l] ^ s[4] => q = 0, không so sánh tiếp dịch chuỗi p sang phải so với chuỗi s vị ừí. - Bước 5: Với q = 0; i = 5, so sánh P[l] S[5]: 1.3.204. S: bacbabababacaab 1.3.203. t P: ababaca 1.3.205. Thấy P[l] = S[5] => q = 1, không dịch chuỗi p mà so sánh ký 1.3.202. tự tiếp 1.3.206. - theo. Bước 6: Với q = 1; i = 6, so sánh P[2] S[6]: 1.3.209. S: bacbabababacaab 1.3.208. y P: ababaca 1.3.210. Thấy P[2] = s [6] => q = 2, không dịch chuỗi p mà so sánh 1.3.207. ký tự tiếp 1.3.211. - theo. Bước 7: Với q = 2; i = 7, so sánh P[3] S[7]: 1.3.212. S: bacbabababacaab P: ababaca 1.3.213. Thấy P[3] = s[7] => q = 3, không dịch chuỗi p mà so sánh ký tự tiếp 1.3.214. - theo. Bước 8: Với q = 3; i = 8, so sánh P[4] S[8]: 1.3.215. S: bacbabababacaab 1.3.216. ĩ P: ababaca 1.3.217. 1.3.218. Thấy P[4] = S[8] => q = 4, không dịch chuỗi p mà so sánh ký tự tiếp theo. - Bước 9: Với q = 4; i = 9, so sánh P[5] S[9]: 1.3.221. S: bacbabababacaab 1.3.220. Î P: ababaca 1.3.222. Thấy P[5] = s [9] => q = 5, không dịch chuỗi p mà so sánh 1.3.219. ký tự tiếp 1.3.223. theo. - Bước 10: Với q = 5; i = 10, so sánh P[6] S[10]: S: 1.3.224. bacbabababacaab P: ababaca 1.3.225. Thấy Р[6] Ф S[10] => q = П[6] = 3, không so sánh ký tự tiếp theo mà dịch p sang phải so với chuỗi s vị trí để so sánh P[4] S[10]. Mà P[4] = S[10] => q = - Bước 11: Với q = 4; i = 11, so sánh P[5] S[11]: 1.3.228. S: bacbabababacaab 1.3.227. I P: ababaca 1.3.229. Thấy P[5] = S[11] => q = 5, không dịch chuỗi p mà so sánh 1.3.226. ký tự tiếp 1.3.230. theo. - Bước 12: Với q = 5; i = 12, so sánh P[6] S[12]: 1.3.231. S: bacbabababacaab P: ababaca 1.3.232. ký tự tiếp Thấy P[6] = S [ l l ] = > q = 6, không dịch chuỗi p mà so sánh 1.3.233. theo. - Bước 13: Với q = 6; i = 13, so sánh P[7] S[13]: 1.3.234. S: bacbabababacaab P: ababaca 1.3.235. Thấy P[7] = S[13] => q = = m, hoàn ứiành việc khớp 1.3.236. Vậy việc so khớp chuỗi mẫu p chuỗi ban đầu s cần số chuỗi. lần dịch c h u y ể n l s = i - m = - = l ầ n . - Đối với thuật toán tìm hàm tiền tố chuỗi, vòng lặp for phải thực m lần (bằng chiều dài chuỗi mẫu). Việc gán giá tri trước thực lần. Bởi thời gian để tính hàm tiền tố chuỗi O(m). - Đối với thuật toán so khớp chuỗi Knutìi - Morris - Pratt vòng lặp for thuật toán phải thực tối đa n lần (bằng chiều dài chuỗi ban đầu). Thời gian để thực việc so khớp hai chuỗi O(n). Việc gán giá tn trước thực lần, tính hàm tiền tố chuỗi mẫu thực lần. Bởi thời gian để thực trọn vẹn thuật toán đến kết cuối tối đa 0(m + n). 2.3. Thuật toán so khớp chuỗi BOYER-MOORE (BM) 2.3.1. Ý tưởng thuật toán 1.3.237. Sử dụng ý tưởng thuật toán Brute - Force: Thử kiểm tra tất vị trí chuỗi văn từ n-m+1, sau lần thử thuật toán Brute - Force dịch mẫu sang phải ký tự kiểm tra hết kí tự chuỗi. Tuy nhiên, thuật toán Boyer - Moore có sử dụng thêm số kỹ thuật khác để cải tiến tốc độ tìm kiếm. Thay so sánh ký tự chuỗi văn với chuỗi mẫu, thực bỏ qua nhiều ký tự không càn thiết so sánh dựa không so khớp ký tự cuối so sánh. 2.3.2. Mô tả thuật toán 1.3.238. Thuật toán Boyer - Moore dựa hai kỹ thuật: Kỹ thuật soi gương kỹ thuật nhảy ký tự. - Kỹ thuật soi gương: Tìm p T cách dịch chuyển lùi thông qua p, bắt đầu đầu cuối p. - Kỹ thuật nhảy ký tự: 1.3.239. + Khi xuất không trùng khớp xảy T[i] = X + Ký tự mẫu P[j] không giống T[i] 1.3.240. 1.3.241. 1.3.242. * Trường hợp I Hình 2.1 Kỹ thuật nhảy ký tự Có trường hợp xảy ra: 1.3.243. Nếu chuỗi mẫu p chứa X đâu đó, sau thử dịch p sang phải để lề xuất cuối X p với T[i]. ị 1.3.244. 1.3.245. 1.3.246. 1.3.247. 1.3.248. 1.3.249. ị X X a 1.3.250. 1.3.251. c b a i m Chuyển i, j sang phải j chuyển đến ị 1.3.252. J J 1.3.253.mới 1.3.254.Hình 2.2 Kỹ thuật nhảy ký tự mẫu p chứa X đầu * Trường hợp 1.3.255. Nếu p chứa X đâu đó, việc dịch chuyển sang phải đến xuất cuối không thể, cần dịch chuyển p sang phải ký tự tới T[i+1]. 1.3.257. 1.3.256. 1.2.44.X a 1.2.45. 1.2.47. 1.2.48. X 1.2.46. 1.3.258. 1.2.50. 1.2.52. 1.2.49. X 1.2.51. X ? a 1.2.54. 1.2.55. 1.3.259. 1.3.260. ị 1.2.53. Chuyển i, j sang phải j chuyển đến ký tự cuối p cwa \ ký tự X nằm sau [...]... Với chuỗi ban đầu s, chuỗi mẫu p và hàm tiền tố n của chuỗi p, sẽ tìm ra chuỗi mẫu p trong chuỗi ban đầu s và trả về số lần dịch chuyển của p cho đến thời điểm tìm thấy 2.2.2 Thuật toán KMP 1.3.176 Knuth - Morris - Pratt đã xây dựng thuật toán so khớp chuỗi với chuỗi mẫu p có độ dài là m và chuỗi ban đầu s có độ dài là n dựa vào việc tính hàm tiến tố n của chuỗi p và so sánh các phần tử của chuỗi s và. .. n]) và một chuỗi mẫu p có độ dài là m (P[l m]) Các Phần tử của s và p là các ký tự trong tập hữu hạn alphabet z Ví dụ: z = {0,1} hoặc 2 = {a,b,c ,z} Mảng ký tự s và p được gọi là chuỗi ký tự 1.3.122 Khi đó bài toán so khớp chuỗi được phát biểu như sau: Cho một chuỗi ban đàu s và một chuỗi mẫu p So khớp chuỗi chính là việc tìm chuỗi mẫu p trong chuỗi ban đầu s Nếu chuỗi mẫu p được tìm thấy trong chuỗi. .. ngược lại (tức là không tìm thấy mẫu p trong S) s được gọi là giá trị dịch chuyển không họp lệ 1.3.125 Tóm lại: Bài toán so khớp chuỗi là bài toán tìm giá trị dịch chuyển s sao cho sau số lần dịch chuyển đó tìm được chuỗi mẫu p trong chuỗi ban đầu s 2.1.2 Thuật toán so khớp chuỗi thô 1.3.126 Thuật toán so khớp chuỗi thô là thuật toán tìm tất cả các giá trị dịch chuyển, sử dụng một vòng lặp để kiểm ừa... cần xem xét đến một phương án tối ưu hơn, có thời gian thực hiện thuật toán nhỏ hơn 2.2 Thuật toán so khớp chuỗi KNUTH - MORRIS - PRATT (KMP) 1.3.154 Để khắc phục nhược điểm thòi gian thực hiện thuật toán lớn, D.E.Knuth và V.R.Pratt đã xây dựng một thuật toán so khớp chuỗi tuyến tính Thời gian thực hiện thuật toán là 0(n + m) dựa trên việc tính hàm tiền tố n[l, ,m] được tính toán trên chuỗi mẫu p trong... Các thuật toán điển hình bao gồm Knuth - Morris - Pratt, Boyer - Moore Horspool, 1.3.68 Thuật toán bit song song: Là các thuật toán khai thác bản chất song song của dữ liệu bit để thực hiện các thao tác cùng lúc Các thuật toán điển hình bao gồm Shift - Or, 1.3.69 Thuật toán băm: Là các thuật toán sử dụng kĩ thuật băm Thuật toán điển hình là thuật toán Karp - RaBin 1.3.70 Độ phức tạp tính toán: Trên... dụng ý tưởng của thuật toán Brute - Force: Thử kiểm tra tất cả các vị trí trên chuỗi văn bản từ 1 cho đến n-m+1, sau mỗi lần thử thuật toán Brute - Force dịch mẫu sang phải một ký tự cho đến khi kiểm tra hết các kí tự trong chuỗi Tuy nhiên, thuật toán Boyer - Moore có sử dụng thêm một số kỹ thuật khác để cải tiến tốc độ tìm kiếm Thay vì so sánh từng ký tự một của chuỗi văn bản với chuỗi mẫu, thực hiện... đúng các bước của thuật toán so khớp chuỗi thô như trên sẽ trả cho kết quả có tìm thấy chuỗi mẫu p trong chuỗi ban đầu s hay không Nếu chuỗi mẫu p được tìm thấy thì tìm thấy ở vị trí phần tử nào trên 1.3.151 chuỗi s 1.3.152 Tuy nhiên thuật toán so khớp chuỗi này còn gặp nhược điểm lớn về thời gian thực hiện thuật toán như sau: - Với n là độ dài của chuỗi ban đầu s, m là độ dài của chuỗi mẫu p thì thời... không giới thiệu thuật này 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 1.3.60.Tháng 6 - 1975, Alữed V Aho và Margret J Corasick đã giới thiệu thuật toán so khớp chuỗi đa mẫu Aho Corasick trong tài liệu “Communications of the ACM 18” 1.3.61.Năm 1980, Nigel Horspool đã giới thiệu thuật toán so khớp chuỗi tương tự thuật toán KMP, nhưng... 1.3.41 Có thể hình thức hóa bài toán so khớp chuỗi như sau: Coi văn bản là một mảng S[l n] có chiều dài n và khuôn mẫu là một mảng P[l m] có chiều 1.3.42.dài m, các thành phần của s và p là các ký tự được rút từ một bảng chữ cái hữu hạn 1.3.43 Cho một chuỗi văn bản S[l n] và một chuỗi mẫu P[l m], tìm sự xuất hiện của p trong s chính là sự so khớp chuỗi giữa p và s Cả p và s đều thuộc X, z là tập hữu... tử như ừong tìm kiếm các mẫu trong DNA, protein, - lìm kiếm cơ sở dữ liệu như trong GenBank - Trong nhiễu kênh vói cho phép chấp nhận được - Trong tìm kiếm mẫu hoặc vết của tấn công, đột nhập và các phần mềm độc hại trong lĩnh vực an toàn mạng và an toàn thông tin 1.3.120 CHƯƠNG 2: MỘT SỔ THUẬT TOÁN TÌM CHUỖI 2.1 Thuật toán so khớp chuỗi 2.1.1 Phát biểu bài toán 1.3.121 Giả sử chuỗi s là một mảng có . là thuật toán Boyer - Moore. 1.3.7. Chính vì các lý do trên nên em đã chọn đề tài Một số thuật toán tìm chuỗi và xây dựng chương trình minh họa thuật toán Boyer - Moore làm khóa luận tốt nghiệp. ANH MỘT SÓ THUẬT TOÁN TÌM CHUỖI VÀ XÂY DựNG CHƯƠNG TRÌNH MINH HỌA THUẬT TOÁN BOYER - MOORE KHÓA LUẬN TÓT NGHIỆP ĐẠI HỌC • • • • Chuyên ngành: Khoa học máy tính NGUYỄN THỊ NGỌC ANH MỘT SÓ THUẬT. thử nghiệm và đánh giá kết quả. 3. Đối tượng và phạm vi nghiên cứu 1.3.10. Khóa luận đi sâu nghiên cứu một số thuật toán tìm chuỗi và xây dựng chương trình minh họa thuật toán Boyer - Moore cải

Ngày đăng: 24/09/2015, 08:09

Từ khóa liên quan

Mục lục

  • 1. Lý do lựa chọn đề tài

  • 2. Mục tiều và nhiệm vụ nghiên cứu

  • 3. Đối tượng và phạm vi nghiên cứu

  • 5. Phương pháp nghiên cứu

  • a. Phương pháp nghiên cứu lý luận

  • b. Phương pháp chuyên gia

  • c. Phương pháp thực nghiệm

  • 6. Ý nghĩa khoa học và thực tiễn

  • 7. Cấu trúc khóa luận

  • 1.2.5. Các dạng so khớp chuỗi

  • a. So khớp đơn mẫu

  • b. So khớp đa mẫu

  • c. So mẫu mở rộng

  • d. So khớp chính xác

  • 1.2.6. ứng dụng

  • b. Mô tả thuật toán

  • c. Ví dụ minh họa cho thuật toán

  • 1.3.135. S: abcabaabcabac P: a b a a

  • 1.3.137. S: abcabaabcabac

  • 1.3.139. P: a b a a

Trích đoạn

Tài liệu cùng người dùng

Tài liệu liên quan