Tải bản đầy đủ (.docx) (36 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (268.59 KB, 36 trang )

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
• • • •
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

9
TRƯỜNG ĐẠI HỌC sư PHẠM HÀ NỘI 2
KHOA CÔNG NGHỆ THÔNG TIN
HÀ NỘI -2015
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
Ngưòi hướng dẫn khoa học TS. TRỊNH ĐÌNH VINH
TRƯỜNG ĐẠI HỌC sư PHẠM HÀ NỘI 2
KHOA CÔNG NGHỆ THÔNG TIN
HÀ NỘI -2015
LỜ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. Trinh Đì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 ữong 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 ữong ữong 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 ừá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
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 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
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ý do lựa chọn đề tài
1.3.4. Với sự bùng nổ và phát triển của công nghệ thông tin ữong
những năm gần đây, đã mang lại nhiều hiệu quả đối với khoa học cũng như các
hoạt động thực tế, sự phát triển mạnh mẽ của công nghệ thông tin đã làm cho
khả năng thu thập và lưu trữ thông tin của các hệ thống thông tin tăng lên một
cách nhanh chóng, lượng dữ liệu lưu trữ ữở nên quá nhiều. Vì vậy việc xử lý
thông tin gặp phải nhiều khó khăn, đặc biệt là công tác tìm kiếm.
1.3.5. Dữ 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 ữong 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.
1.3.6. Để 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.
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 của mình.
2. Mục tiều và nhiệm vụ nghiên cứu
1.3.8. Mục tiêu

6
- Á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 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
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 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 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.
1.3.12. Chương trình được xây dựng nếu đưa vào thực tiễn sẽ ượ
giúp đắc lực cho người sử dụng ưong 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. 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 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.
7
b. Phương pháp chuyên gia
1.3.14. Tham khảo ý kiến của các chuyên gia, tìm hiểu những quan

điểm, kinh nghiệm của họ để có thể 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 cứ vào quan sát thực tiễn, yêu càu của cơ sở, căn cứ vào lý
luận được nghiên cứu và kết quả đã đạt được để có được sự tương tác giữa
người dùng và chương trình, từ đó yêu cầu thiết kế hiệu quả.
6. Ý nghĩa khoa học và thực tiễn
1.3.16.Ý nghĩa khoa học
1.3.17.Nội dung nghiên cứu của khóa luận góp phần làm rõ hơn về công
tác tìm kiếm và một 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 nếu thành
công sẽ góp phần phát triển công tác tìm kiếm và ứng dụng trong tìm kiếm
chuỗi văn bản, sinh học phân tử và trong lĩnh vực an toàn mạng, an toàn thông
tin, Giúp con người có thể tìm kiếm thông tin chính xác một 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 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:
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 và hướng giải quyết
1.1.1. Bài toán tìm kiếm
1.3.25.Ngày nay, máy tính được sử dụng ữong mọi lĩnh vực của đời
sống, theo đó kho thông tin trong 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 đã được áp dụng, bao gồm các
8
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ó gặp phải 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. 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.
1.3.26.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
1.3.27. “xấp xỉ” q). Có thể thấy, các máy tìm kiếm sử dụng cả cơ chế tìm
kiếm xấp xỉ khi mà văn bản kết quả tìm kiếm không chứa hoàn toàn chính
chuỗi truy vấn.
1.1.2. Hướng giải quyết
1.3.28. Để giải quyết bài toán tìm kiếm có nhiều phương pháp, giải thuật
đã được nghiên cứu:
9
- lìm kiếm trên danh sách: Là giải thuật đơn giản, tìm trong một tập hợp
một phần tử chứa một khóa nào đó.

- lìm kiếm trên cây: Là trung tâm của kĩ thuật tìm kiếm, các thuật toán này
tìm kiếm trên cây gồm các nút, cây này có thể là cây tường minh hoặc
được xây dựng dần trong quá trình tìm kiếm
- lì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 đồ
thị.
- lìm kiếm đối kháng: Trong các trò chơi như cờ vua hay cờ tướng, có một
cây ừò chơi bao gồm tất cả các nước đi có thể của cả hai đấu thủ và các
cấu hình bàn cờ là kết quả của các nước đi đó. Ta có thể tìm kiếm trên
cây này để có được một chiến lược chơi hiệu quả.
- lì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.
1.3.29. 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ể.
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 là một nhóm các ký tự, số, khoảng trắng, dấu ngắt được
đặt trong các dấu nháy.
1.3.31. Giả sử s là một chuỗi ký tự có kích thước m. Một chuỗi con
S[i j] của chuỗi s là phân đoạn chuỗi có chỉ số giữa i và j. Một chuỗi tiền tố
của chuỗi s
1.3.32. là chuỗi con S[0 i]. Một chuỗi hậu tố của chuỗi s là chuỗi con
S[i m-1], i là chỉ số bất kỳ giữa 0 và m-1.
1.3.33.Ví dụ:
1
1.3.34.
1.3.35. + Chuỗi con S[1 3] = “IET”.
1.3.36. + Tất cả các chuỗi tiền tố của s là:“VIETNAM”,“VIETNA”,
“VIETN”, “VIET”, “VIE”, “VI”, “V”.

1.3.37. + Tất cả các chuỗi hậu tố của s là:“VIETNAM”,
“IETNAM’V‘ETNAM’V‘TNAM”, “NAM”, “AM”, “M”.
I.2.I.2. So khớp chuỗi
1.3.38. 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 ữong 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 ưên hầu hết các hệ điều hành.
1.3.39. 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ả.
1.3.40. 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 Pattem) 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.
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.2.1. s
1.2.2.V
1.2.3.I
1.2.4.E 1.2.5.T 1.2.6. N 1.2.7.A 1.2.8. M
1.2.9. i 1.2.10.
0
1.2.11.
1

1.2.12.
2
1.2.13.
3
1.2.14.
4
1.2.15.
5
1.2.16.
6
1
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 hạn các mẫu tự trong bảng chữ cái.
1.3.44. p xuất hiện với độ dịch s (bắt đầu tại S+1):
1.3.45. P[l] = S[s+1], P[2] = S[s+2], , P[m] = T[s+m].
1.3.46. Do đó, s là giá trị dịch, ngược lại là không có giá trị dịch.
1.3.47. Ví dụ:
1.3.48. p = “abab”, s = “abcabababbc”, p x u ấ t hiện tại s = 3 và s = 5.
1.3.49. Theo tính chính xác của phép so khớp, có 2 loại so khớp chuỗi:
1.3.50. + So khớp chuỗi chính xác (Exact string matching):
1.3.51. 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”
1.3.52. + So khớp chuỗi gần đúng (Approximate string matching):
1.3.53. 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.
1.3.54. 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.

1.3.55. Sự sai khác cho phép được ở đây có thể là:
- Thêm (ran —► rain)
- Bớt (brain —►rain)
- Thay thế (brain —► train)
1.3.56. Ví dụ: s = “braỉnaaranastraindshanb”—p = “ran”
1.2.2. Lịch sử phát triển.
1.3.57.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.
1
1.3.58.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.
1.3.59.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.
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 đảo ngược thứ tự so sánh trong tài liệu
Software -Practice & Experience, 10(6):501-506.
1.3.62.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 - voi 31 no.2.
1.2.3. Các bước xử lý
1.3.63.Các thuật toán so khớp chuỗi thường được thực hiện theo 2 bước
xử lý
1.3.64. sau:
- Bước tiền xử lý (Preprocessing phase): Bao gồm xử lý mẫu và khỏi

tạo cấu trúc dữ liệu.
- Bước tìm kiếm (Searching phase): Thực hiện việc tìm kiếm mẫu trong
văn bản.
1.2.4. Các cách tiếp cận
1.3.65.Có 4 cách tiếp cận chính của các thuật toán so khớp chuỗi:
1.3.66. Thuật toán cổ điển: Là các thuật toán chủ yếu dựa vào sự so sánh
giữa các kí tự. Các t h u ậ t toán điển hình bao gốm Brute Force, Naïve,
1
1.3.67. Thuật toán máy tự động hậu tố: Là các thuật toán sử dụng cấu
trúc dữ liệu hậu tố tự động để nhận ra tất cả các hậu tố của mẫu. 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 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ự.
1.2.5. Các dạng so khớp chuỗi
1.3.71. Phân loại các thuật toán so khớp dựa trên các đặc tính của mẫu
có các dạng: So khớp đơn mẫu, so khớp đa mẫu (mẫu là tập các xâu), so khớp
mẫu mở rộng, so khớp biểu thức chính qui với hai hướng tiếp cận là so khớp
chính xác và xấp xỉ.
a. So khớp đơn mẫu
1.3.72. Cho xâu mẫu p độ dài m, p = PiP
2
P
m

, và xâu mẫu s độ dài n, s =
SiS
2
.s
n
(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.
1.3.73. 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.
1.3.74. 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ừ yị 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ý
1
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.
1.3.75. 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.
1.3.76. 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 ữên kích cỡ của mẫu p và bảng chữ A.
1.3.77. 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.
1.3.78. 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.
1.3.79. 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 đa mẫu
1.3.80. Cho một mẫu p gồm tập các từ khóa {wi w
2
, ,w
k
} và xâu vào s =
S1S2 .s„ trên cùng bảng chữ A. lìm sự xuất hiện của các từ khóa W i trong s.
1.3.81. Một cách đơn giản để tìm nhiều từ khóa ưong 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.
1.3.82. 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 -
1
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ỏ.
1.3.83. 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.
1.3.84. 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
1.3.85. 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:
1.3.86. 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.
1.3.87. 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.
1.3.88. 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.
1.3.89. 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 toá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.
1
d. So khớp chính xác
1.3.90. lì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[l n], m < n. Ví dụ: Có thể tìm thấy vị trí của xâu “abc” ừong
xâu “abcababc” là 1 và 6.
1.3.91. Phát biểu hình thức bài toán như sau: Gọi X 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 X- Tập X 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à (X = {0,1}) hay có thể là tập các kí tự DNA ừong sinh học (X
= {A, c, G, T}).
1.3.92. 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-l)] vói P[l m] bằng cách xét từng
cặp ký tự một và đưa ra kết quả so khớp. Ngoài ra còn gọi phương pháp này là
cách tiếp cận ngây thơ (Naïve string search).
1.3.93.Dưới đây là thủ tục đặc tả của phương pháp này:
1.3.94. Naïve string
search n «— length
[T] m <— length [P]
for s <— 1 to n-m+1
do j«-l
1.3.95. while j < m and T[s + j] =
P[j] do if j > m then
1.3.96. return s// s là vị trí tìm được.
1.3.97. return false. // không có vị trí nào thỏa mãn.
1.3.98. Độ phức tạp trung bình của thuật toán là 0(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”.
1
e. So khớp xấp xỉ
1.3.99. Phát biểu bài toán
1.3.100. 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, ừong đó 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ể ừánh được các “lỗi” nên vấn đề so khớp xấp xỉ càng trở nên quan
trọng.
1.3.101. Đặ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
1.3.102. 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”.
1.3.103. Vì yậ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à xâu mẫu p độ dài m ữê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 к lỗi.
1.3.104. Thuật toán so khớp xấp xỉ hiện nay chia thành 4 loại:
1.3.105. 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.
1
1.3.106. 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).
1.3.107. 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.
1.3.108. 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 к + 1 đoạn và sắp xếp để so khớp đa
mẫu trên các đoạn này, YÌ í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, ừong
đó 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
1
1.3.109. 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.
1.3.110. Đố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 к = 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.
1.3.111. 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,
1.3.112. Độ tương tự giữa hai xâu

1.3.113. Để 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 eưors), chẳng hạn “Việt Nam” và
“ViệtNan” 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.
1.3.114. Khoảng cách soạn thảo: Đối vói hai xâu X , у 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 у (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ự.
1.3.115. 15
- 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ự.
1.3.116. 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 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 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.
1.3.117. 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:
1.3.118.LevDistance (x,y) = m + n - 2 length(LCS( x,y))
1.2.6. ứng dụng
1.3.119. 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 ưong 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ư ừ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ó độ dài là n (S[l 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 ban đầu
s hãy chỉ ra vị trí trong s mà tại đó chuỗi mẫu p được tìm thấy.
1.3.123. 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(l m) tức là S(s + j) = P(j) với 1< j < m.
1.3.124. Nếu p được tìm thấy trong s thì s được gọi là giá tri 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ệ.
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 điều kiện P[l m] = S[s + +
1.3.127. m] với mọi giá tri (n - m + 1) có thể của 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 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.
1.3.131. 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ả.
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 hiện 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) và P(l)

1.3.135. S :
a b c a b a a b c a b a c P :
a b a a
1.3.136. Bước 2: Sau khi thấy hai phần tử S(l) = P(l) tiến hành so
sánh tiếp phần tử S(2) và P(2).
1.3.137. S : a b c a b a a b c a b a c
1.3.138. 1
1.3.139. P : a b a a
1.3.140. Bước 3: So sánh phần tử S(3) và P(3)
1.3.141. S :
a b c a b a a b c a b a c P :
a b 1 a
1.3.142. 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.
1.3.143. Bước 4: Dịch p sang phải 1 vị trí, so sánh hai phần tử S(l) và
P(l)
1.3.144. S : a b c a b a a b c a b a c
1.3.145.P : a b a a
1.3.146. 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:
1.3.147. S : a b c a b a a b c a b a c
1.3.148.
1.3.149. a b a a
d. Đánh giá thuật toán
1.3.150. Việc tiến hành theo đú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:

1.2.17.
P
- 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.

×