Tải bản đầy đủ (.pdf) (54 trang)

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 (733.88 KB, 54 trang )




KHOA CÔNG NGH THÔNG TIN
*************




TH NGC ANH




MT S THUT TOÁN TÌM CHUI
VÀ XÂY DA
THUT TOÁN BOYER - MOORE


KHÓA LUN TT NGHII HC







2015







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A
THUT TOÁN BOYER - MOORE


KHÓA LUN TT NGHII HC



ng dn khoa hc
TS. TR



2015






LI C
Để 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




LI CAM 
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
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


2.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

1



1. Lý do la ch tài
Với sự bùng nổ và phát triển của công nghệ thông tin trong 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ữ 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.
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 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.
2

2. Mc tiêu và nhim v nghiên cu

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.
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ả.
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. u
a.  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.
3

b. 
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. c nghim
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ả.
c và thc tin
c
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.
c tin
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
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

4



1.1.1. 
Ngày nay, máy tính đƣợc sử dụng trong 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 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.
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
5

“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.

Để 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:
- Tì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 đó.

- Tì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
- 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
đồ thị.
- Tìm kiếm đối kháng: Trong các trò chơi nhƣ cờ vua hay cờ tƣớng, có
một cây trò 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ả.
- 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ể.


1.2.1
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.
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
6

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.
Ví dụ:
S
V
I
E

T
N
A
M
i
0
1
2
3
4
5
6

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

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.
Cho một chuỗi văn bản S[1 n] và một chuỗi mẫu P[1 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
∑, ∑ 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”
8


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.
1.2.3. 
Các thuật toán so khớp chuỗi thƣờng đƣợc thực hiện theo 2 bƣớc xử lý
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ó 4 cách tiếp cận chính của các thuật toán so khớp chuỗi :
9

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 thuật toán điển hình bao gốm Brute Force, Naïve,…
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,…
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,…
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ự.
1.2.5. 
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u
Cho xâu mẫu P độ dài m, P = P
1
P
2
…P

m
, và xâu mẫu S độ dài n, S =
S
1
S
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.
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.
10

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u
Cho một mẫu P gồm tập các từ khóa {w
1,
w
2
,…,w
k
} và xâu vào S =
S
1
S
2
…S
n
trên cùng bảng chữ A. Tìm sự xuất hiện của các từ khóa w
i
trong S.
11


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.
12


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.
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 toá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. 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).
Dƣới đây là thủ tục đặc tả của phƣơng pháp này:
Naïve string search
n ← length [T]
m ← length [P]
for s ← 1 to n-m+1 do
j ← 1
while j ≤ m and T[s + j] = P[j] do
j ← j +1
if j > m then
return s// s là vị trí tìm đƣợc.
13


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à
14


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
15


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, …
  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ự.

16

- 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. 
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….


17



2.1.1. 
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.
2.1.2.
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 tra điều kiện P[1 m] = S[s + 1, ,s +
m] với mọi giá trị (n - m + 1) có thể của s.
a.i (S, P)
int n = strlen(S);
int m = strlen(P);
18


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);

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ả.

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
19

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:
S: a b c a b a a b c a b a c
P: a b a a

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
chuỗi S.
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

×