- Tìm kiếm trên đồ thị: Là thuật toán giải quyết các bài toán về lý thuyết - Tìm chuỗi: So sánh một hoặc nhiều chuỗi mẫu với văn bản để tìm vị trí số lần xuất hiện cửa chuỗi mẫu đó trong
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI 2 KHOA CÔNG NGHỆ THÔNG TIN
*************
NGU Ễ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ÁN BOYER - MOORE
KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC
C u n n n K o ọ m t n
HÀ NỘI –2015
Trang 2TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI 2 KHOA CÔNG NGHỆ THÔNG TIN
*************
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ÁN BOYER - MOORE
KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC
Trang 3LỜI CẢM ƠN
Để hoàn thành được khóa luận, ngoài sự nghiên cứu và cố gắng của bản thân, em xin gửi lời cảm ơn tới TS Trịnh Đình Vinh giáo viên trực tiếp hướng dẫn, tận tình chỉ bảo và định hướng cho em trong suốt quá trình thực hiện khóa luận
Em xin gửi lời cảm ơn chân thành cảm ơn tất cả các thầy, cô giáo trường Đại học Sư phạm Hà Nội 2 nói chung và các thầy, cô giáo khoa Công nghệ thông tin nói riêng đã giảng dạy và dìu dắt em trong trong suốt quá trình học tập tại trường
Cuối cùng, em xin gửi lời cảm ơn tới gia đình, bạn bè và những người
đã luôn ở bên cổ vũ tinh thần, tạo điều kiện thuận lợi cho em để em có thể học tập tốt và hoàn thiện khóa luận
Với điều kiện thời gian nghiên cứu và vốn kiến thức của bản thân em còn hạn chế nên chương trình không tránh khỏi những thiếu sót Em rất mong nhận được sự chỉ bảo quý báu của quý thầy, cô giáo và bạn bè để chương trình của em được 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 hiện
Nguyễn Thị Ngọc Anh
Trang 4LỜ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 và xây dựng chương trình minh họa thuật toán Boyer – Moore” là nghiên cứu của riêng
em
2 Kết quả nghiên cứu của em không trùng với bất cứ một kết quả nào của những 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 hiện
Nguyễn Thị Ngọc Anh
Trang 5MỤC LỤC
MỞ ĐẦU 1
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 4
1.1 Bài toán tìm kiếm và hướng giải quyết 4
1.1.1 Bài toán tìm kiếm 4
1.1.2 Hướng giải quyết 5
1.2 So khớp chuỗi 5
1.2.1 Khái niệm 5
1.2.1.1 Chuỗi 5
1.2.1.2.So khớp chuỗi 6
1.2.2 Lịch sử phát triển 8
1.2.3 Các bước xử lý 8
1.2.4 Các cách tiếp cận 8
1.2.5 Các dạng so khớp chuỗi 9
1.2.6 Ứng dụng 16
CHƯƠNG 2: MỘT SỐ THUẬT TOÁN TÌM CHUỖI 17
2.1 Thuật toán so khớp chuỗi 17
2.1.1 Phát biểu bài toán 17
2.1.2 Thuật toán so khớp chuỗi thô 17
2.2 Thuật toán so khớp chuỗi KNUTH – MORRIS - PRATT (KMP) 20
2.2.1 Hàm tiền tố 20
2.2.2 Thuật toán KMP 22
2.3 Thuật toán so khớp chuỗi BOYER-MOORE (BM) 27
2.3.1 Ý tưởng thuật toán 27
2.3.2 Mô tả thuật toán 28
2.3.3 Ví dụ về thuật toán Boyer-Moore 30
2.3.4 Hàm tìm vị trí xuất hiện cuối của một ký tự - Last 31
2.3.5 Ví dụ cụ thể vai trò của hàm Last trong thuật toán Boyer-Moore 32 2.3.6 Thuật toán Boyer-Moore viết bằng ngôn ngữ JAVA 32
2.3.7 Phân tích thuật toán 34
Trang 62.4.Thuật toán so khớp chuỗi FRANEK – JENNINGS – SMYTH (FJS) 35
2.4.1 Phát biểu bài toán 35
2.4.2 Thuật toán FJS 35
2.4.3 Tính toán tiền xử lý BM và KMP 37
2.5 So sánh các thuật toán so khớp chuỗi 40
CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH DEMO 42
3.1 Phát biểu bài toán 42
3.2 Thuật toán Boyer Moore cải tiến bằng bảng giá trị dịch chuyển hai chiều 42
3.3 Kết quả thực nghiệm 45
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 47
TÀI LIỆU THAM KHẢO 48
Trang 7Dữ liệu trong máy tính được lưu trữ dưới nhiều dạng khác nhau trong
đó dữ liệu dạng chuỗi là một trong những cách phổ biến nhất 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 Có thể thấy các dạng khác nhau của mỗi chuỗi như ở các file dữ liệu, các gói tin, trên biểu diễn của các gen hay chính văn bản chúng ta đang đọc Để tìm kiếm thông tin hữu ích nhiều giải pháp, đề xuất đã được áp dụng, bao gồm các giải pháp dựa trên phần cứng và phần mềm Tuy nhiên, hầu hết các hệ thống tìm kiếm thông tin hiện còn gặp phải nhiều vấn đề về hiệu năng do chúng phải phân tích, xử lý một lượng rất lớn các chuỗi dữ liệu Hơn nữa việc phân tích, tìm kiếm, so khớp chuỗi đòi hỏi chi phí tính toán và thời gian xử lý lớn Khi lượng dữ liệu lớn, nhiều thông tin có thể bị bỏ qua không được phân tích, không đáp ứng được nhu cầu của người sử dụng
Để tìm kiếm thông tin một cách chính xác mà không mất quá nhiều thời gian cần phải đi sâu nghiên cứu về các thuật toán so khớp chuỗi có hiệu năng cao Một trong những thuật toán so khớp chuỗi có hiệu năng cao đó là thuật toán Boyer – Moore
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 của mình
Trang 8- Tìm hiểu một số thuật toán so khớp chuỗi
- Xây dựng chương trình tìm kiếm văn bản mã unicode dựa trên thuật toán Boyer – Moor cải tiến bằng bảng giá trị dịch chuyển 2 chiều Cài đặt thử nghiệm và đánh giá kết quả
3 Đối tượng và phạm vi nghiên cứu
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 tiến để tìm kiếm chuỗi
mã Unicode
4 Giả thuyết khoa học
Tìm hiểu, nghiên cứu một số thuật toán tìm chuỗi sẽ giúp người lập trình hiểu rõ hơn về công tác tìm kiếm Từ đó, việc xây dựng các chương trình tìm kiếm văn bản, tìm kiếm thông tin và các chương trình tìm kiếm mẫu hoặc vết tấn công trong lĩnh vực an toàn mạng,… trở nên dễ dàng hơn
Chương trình được xây dựng nếu đưa vào thực tiễn sẽ trợ giúp đắc lực cho người sử dụng trong việc tìm kiếm thông tin một cách nhanh chóng, chính xác mà không mất quá nhiều thời gian
5 P ươn p p n i n ứu
a P ươn p p nghiên cứu lý luận
Nghiên cứu qua việc đọc sách, báo và các tài liệu liên quan nhằm xây dựng cơ sở lý thuyết của đề tài và biện pháp cần thiết để giải quyết các vấn đề của đề tài
Trang 97 Cấu trúc khóa luận
Ngoài phần mở đầu, kết luận và hướng phát triển, tài liệu tham khảo thì cấu trúc khóa luận bao gồm các chương sau:
Chương 1: Cơ sở lý thuyết
Chương 2: Một số thuật toán tìm chuỗi
Chương 3: Xây dựng chương trình demo
Trang 10xử lý một lượng rất lớn các chuỗi dữ liệu Vậy làm thế nào để một ngân hàng nắm giữ tất cả các thông tin của rất nhiều tài khoản khách hàng và cần tìm kiếm để kiểm tra các biến động, một hãng bảo hiểm hay một hệ thống trợ giúp bán vé xe, vé máy bay,… một cách chính xác, cần phải tìm hiểu sâu hơn
về bài toán tìm kiếm
Tìm kiếm là thao tác nền móng cho rất nhiều tác vụ tính toán Tìm kiếm nghĩa là tìm một hay nhiều mẩu thông tin đã được lưu trữ Dạng phổ biến nhất của bài toán tìm kiếm là: Cho trước nguồn tìm kiếm là một tập D các văn bản (hoặc là cơ sở dữ liệu văn bản, hoặc là tập các văn bản trên Internet) Cho một chuỗi mẫu q (thường là một từ, một chuỗi ký tự ngắn), hãy tìm tất cả các văn bả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) thì q còn được gọi là "truy vấn" và bài toán còn có tên gọi là "tìm kiếm theo truy vấn" Để tìm được các văn bả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ó là một chuỗi con của các văn bản thuộc tập D hay không (so khớp) và đưa ra các văn bản đáp ứng Trong nhiều trường hợp, bài toán còn đòi hỏi tìm tất cả các vị trí của các chuỗi con trong văn bản trùng với q Đồng thời, điều kiện tìm kiếm có thể được làm "xấp xỉ" theo nghĩa chuỗi kết quả có thể không cần chứa q (không cần có một chuỗi con của văn bản trùng một cách hoàn toàn chính xác với q) mà chỉ cần "liên quan" tới q (có chuỗi con trong văn bản
Trang 11- Tìm kiếm trên đồ thị: Là thuật toán giải quyết các bài toán về lý thuyết
- Tìm chuỗi: So sánh một hoặc nhiều chuỗi mẫu với văn bản để tìm vị trí
số lần xuất hiện cửa chuỗi mẫu đó trong văn bản
Tùy thuộc vào mục đích tìm kiếm khác nhau mà dựa trên các thuật toán, thuật giải khác nhau để giải quyết bài toán Từ đó xây dựng chương trình cài đặt cụ thể
Trang 12+ Chuỗi con S[1 3] = “IET”
+ Tất cả các chuỗi tiền tố của S là:“VIETNAM”,“VIETNA”, “VIETN”,
“VIET”, “VIE”, “VI”, “V”
+ Tất cả các chuỗi hậu tố của S là:“VIETNAM”,
“IETNAM”,“ETNAM”,“TNAM”, “NAM”, “AM”, “M”
1.2.1.2 So k ớp uỗi
So khớp chuỗi là một kỹ thuật đóng vai trò nền tảng trong kỹ thuật xử
lý văn bản Hầu như tất cả các trình soạn thảo và xử lý văn bản đều cần phải
có cơ chế để so khớp các chuỗi trong tài liệu hiện tại Việc tích hợp các thuật toán so khớp chuỗi là một trong những khâu cơ bản được sử dụng trong việc tiển khai phần mềm và được thực hiện trên hầu hết các hệ điều hành
Mặc dù hiện nay dữ liệu được lưu trữ dưới nhiều hình thức khác nhau, nhưng văn bản vẫn là hình thức chủ yếu để lưu trữ và trao đổi thông tin Trong nhiều lĩnh vực như so khớp, trích chọn thông tin, tin sinh học,…một lượng lớn dữ liệu thường được lưu trữ trong các tập tin tuyến tính Hơn nữa khối lượng dữ liệu thu thập được tăng lên rất nhanh nên đòi hỏi phải có các thuật toán xử lý và so khớp dữ liệu văn bản hiệu quả
So khớp chuỗi là việc so sánh một hoặc nhiều chuỗi (thường được gọi
là mãu hoặc Pattern) với văn bản để tìm vị trí và số lần xuất hiện của chuỗi đó trong văn bản
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[1 n] có chiều dài n và khuôn mẫu là một mảng P[1 m] có chiều
Trang 13∑, ∑ là tập hữu hạn các mẫu tự trong bảng chữ cái
P xuất hiện với độ dịch s (bắt đầu tại s+1):
P[1] = S[s+1], P[2] = S[s+2],… , P[m] = T[s+m]
Do đó, s là giá trị dịch, ngƣợc lại là không có giá trị dịch
Ví dụ:
P = “abab”, S = “abcabababbc”, P xuất hiện tại s = 3 và s = 5
Theo tính chính xác của phép so khớp, có 2 loại so khớp chuỗi:
+ So khớp chuỗi chính xác (Exact string matching):
Cho một chuỗi văn bản T có độ dài n, và một chuỗi mẫu P có độ dài m Bài toán so khớp chuỗi chính xác chính là việc tìm ra sự xuất hiện chính xác
của P trong S.Ví dụ: S = “DABCDEADBACABAD” -P = “AB”
+ So khớp chuỗi gần đúng (Approximate string matching):
Tìm một chuỗi phù hợp với mẫu gần đúng (chứ không phải là chính xác) mà sự so khớp là tốt nhất với mẫu Một vài sai khác có thể chấp nhận đƣợc
Hay đƣa một văn bản S, một mẫu P, và một hàm khoảng cách D Tìm tất cả các chuỗi con s của S sao cho D(s,P) < k
Sự sai khác cho phép đƣợc ở đây có thể là:
- Thêm (ran rain)
- Bớt (brain rain)
- Thay thế (brain train)
Ví dụ: S = “brainaaranastraindshanb” -P = “ran”
Trang 148
1.2.2 Lị sử p t triển
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 so khớp mẫu có thời gian thực hiện tỉ lệ với (m+n) trong trường hợp xấu nhất
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 đị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 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
Tháng 6 – 1975, Alfred 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”
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 đảo ngược thứ tự so sánh trong tài liệu Software -Practice & Experience, 10(6):501-506
Tháng 3 - 1987, R.M.Karp và M.O.Rabin đã giới thiệu thuật toán đơn giản gần như thuật toán Brute Force có thời gian thực hiện tỉ lệ với m+n trong tài liệu IBM J Res develop – vol 31 no.2
Trang 15Thuậ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,…
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
Độ phức tạp tính toán: Trên thực tế có nhiều loại kí tự khác nhau như: Binary, DNA, Alphabet, Numeric,… và mỗi loại kí tự có độ phức tạp khác nhau Độ phức tạp tính toán tỉ lệ thuận với chiều dài của mẫu, chiều dài của văn bản và độ lớn của tập các ký tự
Cho xâu mẫu P độ dài m, P = P1P2…Pm, và xâu mẫu S độ dài n, S =
S1S2…Sn (S thường dài, là một văn bản) trên cùng một bảng chữ A Tìm tất cả các xuất hiện của xâu P trong S
Trong các thuật toán so mẫu thường sử dụng các khái niệm: Khúc đầu, khúc cuối, khúc con hay xâu con của một xâu, được định nghĩa như sau: Cho
3 xâu x, y, z Có thể nói x là khúc đầu (prefix) của xâu xy, là khúc cuối (suffix) của xâu yx và là khúc con hay xâu con (factor) của xâu yxz
Trang 1610
Thuật toán “thô” nhất và đã được sử dụng rộng rãi là Brute – Force Phương pháp này đơn giản chỉ là lần lượt bắt đầu từ vị trí trong S để so khớp với mẫu P Mặc dù có tốc độ chậm, thời gian xấu nhất tỉ lệ với tích m.n, song nhiều ứng dụng thực tế các chuỗi phát sinh ra thường có thời gian xử lý thực
sự luôn tỉ lệ với m+n Ngoài ra, một ưu điểm khác là nó thích hợp với cấu trúc của hầu hết các hệ máy tính
Cho đến nay, rất nhiều thuật toán so đơn mẫu được đưa ra, trong đó kinh điển nhất là KMP
Có thể xem như có ba tiếp cận chung cho các thuật toán so mẫu, phụ thuộc vào cách duyệt tìm mẫu trong văn bản Việc đánh giá tốc độ của các thuật toán dựa trên kích cỡ của mẫu P và bảng chữ A
Tiếp cận thứ nhất, lần lượt từng ký tự của văn bản S được đọc và tại mỗi vị trí, sau khi so khớp với một kí tự của mẫu sẽ cập nhật sự thay đổi để nhận ra một khả năng xuất hiện mẫu Hai thuật toán điển hình theo tiếp cận này là KMP và Shift – Or
Tiếp cận thứ hai sử dụng một “cửa sổ trượt” trên xâu S và so khớp mẫu trong cửa sổ này Tại mỗi vị trí trong cửa sổ, cần tìm một khúc cuối của cửa
sổ mà là khúc cuối của xâu mẫu P Thuật toán BM là một điển hình cho tiếp cận này và một biến thể đơn giản hóa của nó là Horspool
Tiếp cận thứ ba mới xuất hiện gần đây cho ra đời các thuật toán hiệu quả về thực hành đối với mẫu P đủ dài Cũng tương tự như tiếp cận thứ hai, tuy nhiên tại mỗi thời điểm sẽ tìm khúc cuối dài nhất của cửa sổ mà là khúc con của mẫu Thuật toán đầu tiên theo tiếp cận này là BDM và khi P đủ ngắn, một phiên bản đơn giản hơn, hiệu quả hơn là BNDM Với những mẫu dài, thuật toán BOM được đánh giá là nhanh nhất
b So khớp đ mẫu
Cho một mẫu P gồm tập các từ khóa {w1, w2,…,wk} và xâu vào S =
S1S2…Sn trên cùng bảng chữ A Tìm sự xuất hiện của các từ khóa wi trong S
Trang 1711
Một cách đơn giản để tìm nhiều từ khóa trong một xâu đích là sử dụng thuật toán so đơn mẫu nhanh nhất đối với mỗi từ khóa Rõ ràng phương pháp này không hiệu quả khi số lượng từ khoá lớn
Cả ba tiếp cận tìm đơn mẫu ở trên đều được mở rộng cho tìm đa mẫu Hai điển hình theo tiếp cận thứ nhất là thuật toán nổi tiếng Aho – Corasisk, có tốc độ cải thiện đáng kể khi số từ khóa nhiều và thuật toán Multiple Shift – And, được sử dụng hiệu quả khi tổng độ dài của mẫu P rất nhỏ
Theo tiếp cận thứ hai có thuật toán nổi tiếng Commentz – Walter, kết hợp ý tưởng của Boyer – Moore và Aho – Corasisk, nhanh về lý thuyết, song lại không hiệu quả trong thực hành Một mở rộng của thuật toán Horspool là Set Horspool Cuối cùng là thuật toán Wu – Manber, một phương pháp pha trộn giữa tiếp cận so khớp hậu tố (suffix seach approach) và một kiểu hàm băm, được đánh giá là nhanh trong thực hành
Trong tiếp cận thứ ba đã có những mở rộng từ thuật toán BOM và SBOM, tương tự với Shift – Or BNDM là Multiple BNDM
c So mẫu mở rộng
Trong nhiều ứng dụng, so khớp mẫu không chỉ đơn giản là các dãy kí
tự Sau đây là một số mở rộng thường thấy trong các ứng dụng:
Mở rộng đơn giản nhất cho phép mẫu là một dãy các lớp hay các tập kí
tự, giả sử được đánh số thứ tự là 1, 2,…,m Bất kì thứ tự nào trong lớp thứ i cũng có thể được xem là kí tự thứ i của mẫu
Mở rộng thứ hai là giới hạn khoảng trên độ dài: Một số vị trí trên mẫu được ấn định để khớp với một dãy văn bản nào đó có độ dài nằm trong khoảng xác định trước Điều này thường được sử dụng trong các ứng dụng sinh – tin học, chẳng hạn tìm mẫu PROSITE
Mở rộng thứ ba sử dụng các kí tự tùy chọn và kí tự lặp Trong xuất hiện của mẫu trên văn bản, các kí tự tùy chọn có thể có hoặc không có, còn các kí
tự lặp có thể lặp một hoặc nhiều lần
Trang 1812
Các vấn đề nảy sinh từ ba hướng mở rộng trên và những kết hợp từ ba hướng này được giải quyết bằng cách điều chỉnh lại thuật tốn Shift – Or và BNDM, trong đĩ cĩ sử dụng cơ chế song song bit để mơ phỏng otomat đa định, cho phép tìm tất cả xuất hiện của mẫu
d So khớp chính xác
Tìm một (hoặc nhiều) vị trí xuất hiện chính xác của một xâu kí tự P[1 m] (mẫu so khớp – pattern) ở trong một xâu kí tự lớn hay trong một đoạn văn bản nào đĩ T[1 n], m ≤ n Ví dụ: Cĩ thể tìm thấy vị trí của xâu “abc” trong xâu “abcababc” là 1 và 6
Phát biểu hình thức bài tốn như sau: Gọi ∑ là một tập hữu hạn (finite set) các kí tự Thơng thường, các kí tự của mẫu so khớp và các văn bản gốc đều nằm trong ∑ Tập ∑ tùy từng ứng dụng cụ thể cĩ thể là bảng chữ cái tiếng Anh từ A đến Z thơng thường, cũng cĩ thể là một tập nhị phân chỉ gồm hai phần tử 0 và (∑ = {0,1}) hay cĩ thể là tập các kí tự DNA trong sinh học (∑ = {A, C, G, T})
Phương pháp đơn giản nhất là lần lượt xét từng vị trí I trong xâu ký tự gốc từ 1 đến n–m+1, so sánh T[i (i+m-1)] với P[1 m] bằng cách xét từng cặp
ký tự một và đưa ra kết quả so khớp Ngồi ra cịn gọi phương pháp này là cách tiếp cận ngây thơ (Nạve string search)
Dưới đây là thủ tục đặc tả của phương pháp này:
Nạve string search
Trang 1913
return false // không có vị trí nào thỏa mãn
Độ phức tạp trung bình của thuật toán là O(n + m) trong trường hợp
xấu nhất độ phức tạp là O(n.m), ví dụ như so khớp mẫu “aaaab” trong xâu
“aaaaaaaaab”
e So khớp xấp xỉ
Phát biểu bài toán
So mẫu xấp xỉ là bài toán tìm sự xuất hiện của một mẫu trong văn bản,
trong đó sự “khớp” giữa mẫu và xuất hiện của nó có thể chấp nhận k “lỗi” (k
là một giới hạn cho trước) Có thể kể ra một vài kiểu “lỗi”, như những lỗi
đánh máy hay lỗi chính tả trong hệ thống trích rút thông tin, những sự biến
đổi chuỗi gen hay các lỗi đo đạc trong sinh - tin học và những lỗi truyền dữ
liệu trong các hệ thống xử lý tín hiệu,… Vì trong các hệ thống tin học khó có
thể tránh được các “lỗi” nên vấn đề so khớp xấp xỉ càng trở nên quan trọng
Đặc biệt, khi sử dụng các hệ thống trích rút thông tin, người dùng ngày
nay còn đòi hỏi cả những kết quả gần giống hoặc có được kết quả phù hợp trả
về nếu có sự sai sót trong mẫu hay văn bản Trong trường hợp này “lỗi” có
thể do nhiều nguyên nhân khác nhau, có thể kể ra như sau:
- Câu truy vấn sai chính tả, xâu so khớp không đúng cú pháp so với văn
bản
- Lỗi in ấn, sai lỗi chính tả, sử dụng dấu chấm sai,…
- Do sự biến đổi hình thái từ trong một số ngôn ngữ
- Dữ liệu đưa vào cơ sở dữ liệu không chính xác, thường xảy ra với tên
người, địa chỉ…
- Thông tin người tìm đưa vào không chính xác, chỉ “đại loại”
Vì vậy, một vấn đề đặt ra cho các hệ thống trích rút thông tin ngày nay
là đáp ứng được nhu cầu so khớp “mềm dẻo” này của người sử dụng Bài toán
so mẫu xấp xỉ tổng quát được phát biểu như sau: Cho văn bản T độ dài n và
Trang 2014
xâu mẫu P độ dài m trên cùng một bảng chữ A Tìm các vị trí trong văn bản khớp với mẫu, cho phép nhiều nhất k lỗi
Thuật toán so khớp xấp xỉ hiện nay chia thành 4 loại:
- Các thuật toán dựa trên quy hoạch động: Đây là tiếp cận xuất hiện đầu tiên và đã được dùng để tính khoảng cách soạn thảo
- Các thuật toán sử dụng otomat so khớp: Trước tiên xây dựng một hàm của mẫu P và số lỗi k, sau đó tạo otomat đa định hữu hạn Đây là hướng tiếp cận được quan tâm nhiều vì có độ phức tạp thời gian trong trường hợp xấu nhất là O(n) (tuy nhiên đòi hỏi độ phức tạp không gian lớn hơn)
- Các thuật toán sử dụng cơ chế song song bit: Cách tiếp cận này cho
ra rất nhiều thuật toán hiệu quả nhờ khai thác bản chất song song của các phép toán bit trên một từ máy trong bộ vi xử lý Nói chung, song song bit được dùng để song song hoá các kỹ thuật khác, như tạo otomat
đa định, lập ma trận quy hoạch động Nói chung kỹ thuật này làm việc khá tốt với mẫu ngắn và tăng tốc đáng kể so với những cài đặt không tận dụng khả năng song song của thanh ghi Một số thuật toán dùng cơ chế song song bit là BPR và BPD để tái tạo một otomat đa định hữu hạn và BDM để tái tạo các thuật toán quy hoạch động
- Các thuật toán sử dụng cơ chế lọc: Cố gắng thu hẹp không gian so khớp của bài toán bằng cách loại đi các văn bản mà chắc chắn không chứa một đoạn nào “khớp” với mẫu Nói chung, phương pháp này đạt được bằng cách áp dụng kỹ thuật so mẫu chính xác cho các mẫu nhỏ của mẫu Hai thuật toán hiệu quả nhất theo tiếp cận này là PEX và ABNDM Trong PEX, mẫu được chia thành k + 1 đoạn và sắp xếp để
so khớp đa mẫu trên các đoạn này, vì ít nhất một đoạn phải có mặt trong một xuất hiện bất kỳ Thuật toán ABNDM là một mở rộng của thuật toán BNDM, trong đó tái tạo otomat đa định hữu hạn cho so khớp xấp xỉ Nói chung, các thuật toán sử dụng cơ chế lọc làm việc tốt
Trang 2115
hơn tỷ lệ k/m (với m là độ dài chuỗi mẫu ban đầu) nhỏ Đối với trường hợp tỷ lệ k/m lớn, các thuật toán sử dụng cơ chế song song bit được đánh giá tốt hơn
Đối với bài toán so khớp đa mẫu cũng đã có một số phát triển theo hướng xấp xỉ Thuật toán MultiHash chỉ làm việc với k = 1 song rất hiệu quả khi số lượng mẫu lớn; MultiPEX là thuật toán hiệu quả nhất khi tỷ lệ k/m nhỏ; MultiBP xây dựng các NFA của tất cả các mẫu và sử dụng kết quả này làm bộ lọc, đây là lựa chọn tốt nhất cho tỷ lệ k/m cỡ trung bình
Một vài tiếp cận xấp xỉ cho bài toán tìm mẫu mở rộng và tìm biểu thức chính qui có thể kể ra như: Thuật toán dựa trên quy hoạch động cho biểu thức chính qui, thuật toán sử dụng một otomat đa định hữu hạn cho phép có
“lỗi”, thuật toán song song bit dựa trên phương pháp của BPR, …
Độ tươn tự giữa hai xâu
Để so khớp xấp xỉ, cần sử dụng một hàm khoảng cách đo độ tương tự giữa hai xâu Tương tự ở đây được hiểu là giữa hai xâu ký tự có một vài sai khác ở những lỗi có thể nhận ra bằng mắt thường, không xét về khía cạnh ngữ nghĩa (OCR- optical character recognition errors), chẳng hạn “Việt Nam” và
“Việt Nan” hay “Việtt Nan”,… Có thể kể ra một số kỹ thuật phổ biến đo độ tương tự giữa hai xâu: Xâu con chung dài nhất, dãy con chung dài nhất, khoảng cách soạn thảo Nhiều ứng dụng sử dụng các biến thể của các hàm khoảng cách này
Khoảng cách soạn thảo: Đối với hai xâu x, y khoảng cách soạn thảo Edit distance(x,y) là số nhỏ nhất các phép sửa đổi về mặt soạn thảo để biến đổi xâu x thành xâu y (việc tính toán khá phức tạp) Khoảng cách soạn thảo càng lớn thì sự khác nhau giữa hai xâu càng nhiều (hay độ tương tự càng nhỏ) và ngược lại Khoảng cách soạn thảo thường để kiểm tra chính tả hay tiếng nói Tuỳ thuộc vào quy ước về các phép sửa đổi mà nhận được các loại khoảng cách soạn thảo khác nhau, chẳng hạn như:
- Khoảng cách Hamming: Phép sửa đổi chỉ là phép thay thế ký tự
Trang 2216
- Khoảng cách Levenshtein: Phép sửa đổi bao gồm chèn, xoá, và thay thế
ký tự
- Khoảng cách Damerau: Phép sửa đổi bao gồm chèn, xoá, thay thế và
hoán vị liền kề của các ký tự
Xâu con chung dài nhất (hay khúc con chung dài nhất): Một xâu w là
xâu con hay khúc con (substring or factor) của xâu x nếu x = uwv (u, v có thể rỗng) Xâu w là khúc con chung của hai xâu x, y nếu w đồng thời là khúc con
của x và y Khúc con chung dài nhất của hai xâu x và y, ký hiệu LCF(x,y), là
một khúc con có độ dài lớn nhất
Dãy con chung dài nhất: Một dãy con của xâu x là một dãy các ký tự
có đƣợc bằng cách xoá đi không, một hoặc nhiều ký tự từ x Dãy con chung
của hai xâu x, y là một dãy con của cả hai xâu x và y Dãy con chung của x và
y có độ dài lớn nhất đƣợc gọi là dãy con chung dài nhất LCS(x,y) Có thể
dùng độ dài dãy con chung của hai xâu x, y để tính khoảng cách Levenstein
giữa x và y theo công thức:
LevDistance (x,y) = m + n - 2 length(LCS( x,y))
1.2.6 Ứn dụn
So khớp 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 So khớp chuỗi đƣợc sử dụng rộng rãi trong nhiều ứng
dụng và lĩnh vực khác nhau nhƣ:
- 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ụ tìm kiếm nhƣ: Google Search, Yahoo Search,…
- Sinh học phân tử nhƣ trong tìm kiếm các mẫu trong DNA, protein,…
- Tì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…
Trang 2317
CHƯƠNG 2 MỘT SỐ THUẬT TOÁN TÌM CHUỖI
2.1 T uật to n so k ớp uỗi
2.1.1 P t biểu b i to n
Giả sử chuỗi S là một mảng có độ dài là n (S[1 n]) và một chuỗi mẫu P
có độ dài là m (P[1 m]) Các Phần tử của S và P là các ký tự trong tập hữu hạn alphabet Ví dụ: = {0,1} hoặc = {a,b,c ,z} Mảng ký tự S và P được gọi là chuỗi ký tự
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 ban đầu S hãy chỉ ra vị trí trong S mà tại đó chuỗi mẫu P được tìm thấy
Hay: Có thể nói rằng chuỗi mẫu P được tìm thấy với s lần dịch chuyển
trong chuỗi ban đầu S Điều này tương đương với việc chuỗi mẫu P được tìm
thấy bắt đầu từ vị trí s +1 trong chuỗi ban đầu S nếu thỏa mãn điều kiện 0 s
n - m và S(s +1, , s + m) = P(1 m) tức là S(s + j) = P(j) với 1 j m
Nếu P được tìm thấy trong S thì s được gọi là giá trị dịch chuyển Còn trong trường hợp 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ệ
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
Trang 2418
for ( int s = 0, int p = s; s < n - m; s++, p++)
if ( P[p] = S[s]) print (“Mau duoc tim thay sau %d lan dich chuyen”, s);
b M tả t uật to n
Thuật toán so khớp chuỗi thô thực hiện như sau: Tiến hành so sánh phần tử thứ nhất của chuỗi mẫu P với phần tử thứ nhất của chuỗi ban đầu S Nếu hai phần tử này giống nhau, tiến hành so sánh tiếp phần tử thứ 2 Cứ như vậy cho đến khi tìm được chuỗi P trong S hoặc phát hiện ra vị trí mà tại đó phần tử của S và P khác nhau
Trong trường hợp phát hiện ra vị trí mà tại đó phần tử của S và P khác nhau cần tiến hành dịch phải chuỗi P đi một phần tử so với chuỗi S Lặp lại thao tác so sánh như trên cho đến khi đạt được kết quả
V dụ min ọ o t uật to n
Giả sử chuỗi S = abcabaabcabac
P = abaa Tiến hành thực hiện thuật toán so khớp chuỗi (S, P):
Bước 1: So sánh phần tử S(1) và P(1)
S: a b c a b a a b c a b a c P: a b a a
Bước 2: Sau khi thấy hai phần tử S(1) = P(1) tiến hành so sánh tiếp phần tử S(2) và P(2)
S: a b c a b a a b c a b a c P: a b a a
Trang 2519
Bước 3: So sánh phần tử S(3) và P(3)
S: a b c a b a a b c a b a c P: a b a a
Tại vị trí này hai phần tử S(3) và P(3) không giống nhau, tiến hành dịch
P sang phải một vị trí và lặp lại các bước so sánh
Bước 4: Dịch P sang phải 1 vị trí, so sánh hai phần tử S(1) và P(1)
S: a b c a b a a b c a b a c P: a b a a
Cứ như vậy lặp đi lặp lại các bước của thuật toán so khớp chuỗi thô Sau 3 lần dịch phải chuỗi P thu được kết quả như sau:
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 gian so khớp hai chuỗi là O(mn) Đây là một thời gian lớn làm cho thuật toán có tốc độ chậm
- Nguyên nhân của việc chậm này là do việc so sánh các phần tử của chuỗi S được thực hiện lặp đi lặp lại trong những lần so sánh tiếp theo Trong
Trang 2620
ví dụ đã nêu ở trên việc so sánh hai phần tử ở vị trí tương ứng của hai chuỗi S
và P phát hiện ra vị trí khác nhau đầu tiên sau 3 lần so sánh, tức là S(3) và P(3) khác nhau Theo đúng thuật toán chuỗi mẫu P sẽ dịch sang phải so với chuỗi S một vị trí và việc so sánh lại bắt đầu lại từ đầu Mặc dù trong lần so sánh trước đã biết giá trị S(1) và biết S(1) khác P(0) Đây là việc làm lặp đi lặp lại đối với S(1) trong các lần so sánh tiếp theo, làm tăng thời gian thực hiện thuật toán
Như vậy, thuật toán so khớp chuỗi thô không phải là một thuật toán tối
ưu Vì vậy 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 T uật to n so k ớp uỗi KNUTH – MORRIS - PRATT (KMP)
Để 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à O(n + m) dựa trên việc tính hàm tiền tố
[1, ,m] được tính toán trên chuỗi mẫu P trong thời gian O(m) Mảng có thể giúp cho việc tính toán bước dịch chuyển một cách hiệu quả
2.2.1 H m tiền tố
Hàm tiền tố của một chuỗi mẫu đưa ra cách làm thế nào để chuỗi đó
có thể so khớp dựa vào việc dịch chuyển của chính nó Giá trị của hàm tiền tố này có thể được sử dụng để ngăn ngừa việc kiểm tra những lần dịch chuyển
vô ích của chuỗi mẫu P
Trang 27- So sánh giá trị của P[k + 1] và P[q] Nếu P[k + 1] P[q] gán k = (k)
- So sánh tiếp giá trị của P[k + 1] và P[q] (Với k là giá trị vừa tìm được
ở bước trên) Nếu P[k + 1] = P[q] thì gán k = k + 1
- Gán (q): = k
Trả lại giá trị (q)
c V dụ min ọ o t uật to n t n m tiền tố:
Cho một chuỗi mẫu P = ababaca Khi đó m = 7; (1) = 0; k = 0 Tính hàm tiến tố của chuỗi P