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

Bài toán đối sánh mẫu sử dụng giải thuật di truyền

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 (526.39 KB, 17 trang )

ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CNTT VÀ TRUYỀN THÔNG

NGÂN HOÀNG MỸ LINH

BÀI TOÁN ĐỐI SÁNH MẪU SỬ DỤNG
GIẢI THUẬT DI TRUYỀN

LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH

THÁI NGUYÊN - 2015


ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC CNTT VÀ TRUYỀN THÔNG

NGÂN HOÀNG MỸ LINH

BÀI TOÁN ĐỐI SÁNH MẪU SỬ DỤNG
GIẢI THUẬT DI TRUYỀN
Chuyên ngành: KHOA HỌC MÁY TÍNH
Mã số: 60 48 01 01

LUẬN VĂN THẠC SĨ KHOA HỌC MÁY TÍNH

Người hướng dẫn khoa học: TS. VŨ MẠNH XUÂN

THÁI NGUYÊN - 2015


i



LỜI CAM ĐOAN
Tôi xin cam đoan luận văn này của tự bản thân tôi tìm hiểu, nghiên cứu dưới
sự hướng dẫn của TS Vũ Mạnh Xuân. Các chương trình thực nghiệm do chính bản
thân tôi lập trình, các kết quả là hoàn toàn trung thực. Các tài liệu tham khảo được
trích dẫn và chú thích đầy đủ.

TÁC GIẢ LUẬN VĂN

Ngân Hoàng Mỹ Linh


ii

LỜI CẢM ƠN
Tôi xin bày tỏ lời cảm ơn chân thành tới tập thể các thầy cô giáo Viện công
nghệ thông tin – Viện Hàn lâm Khoa học và Công nghệ Việt Nam, các thầy cô giáo
Trường Đại học Công nghệ thông tin và truyền thông - Đại học Thái Nguyên đã dạy
dỗ chúng tôi trong suốt quá trình học tập chương trình cao học tại trường.
Đặc biệt tôi xin bày tỏ lòng biết ơn sâu sắc tới thầy giáo TS Vũ Mạnh Xuân
đã quan tâm, định hướng và đưa ra những góp ý, gợi ý, chỉnh sửa quý báu cho tôi
trong quá trình làm luận văn tốt nghiệp.
Cuối cùng, tôi xin chân thành cảm ơn các bạn bè đồng nghiệp, gia đình và
người thân đã quan tâm, giúp đỡ và chia sẻ với tôi trong suốt quá trình làm luận văn
tốt nghiệp.

Thái Nguyên, tháng 08 năm 2015

Ngân Hoàng Mỹ Linh



iii

MỤC LỤC
MỞ ĐẦU ................................................................................................................ 1
CHƯƠNG 1 MỘT SỐ THUẬT TOÁN ĐỐI SÁNH MẪU ...................................... 3
1.1. Giới thiệu về bài toán đối sánh mẫu .................................................................. 3
1.2. Phát biểu bài toán ............................................................................................. 3
1.3. Một số thuật toán đối sánh mẫu cơ bản ............................................................. 4
1.3.1. Thuật toán Brute Force .................................................................................. 4
1.3.2. Thuật toán Knuth-Morris-Pratt....................................................................... 4
1.3.3. Thuật toán Automat hữu hạn .......................................................................... 5
1.3.4. Thuật toán Boyer-Moore ................................................................................ 7
1.3.5. Thuật toán Karp-Rabin ................................................................................ 10
1.3.6. Một số thuật toán khác ................................................................................. 10
CHƯƠNG 2 GIỚI THIỆU VỀ GIẢI THUẬT DI TRUYỀN.................................. 13
2.1. Tổng quan chung về giải thuật di truyền (GA) ................................................ 13
2.1.1. Giới thiệu..................................................................................................... 13
2.1.2. Các vấn đề cơ bản của GA ........................................................................... 15
2.1.3. Sự khác biệt của GA với các giải thuật khác ................................................ 18
2.2. Giải thuật di truyền kinh điển.......................................................................... 20
2.2.1. Giới thiệu..................................................................................................... 20
2.2.2. Các toán tử di truyền .................................................................................... 21
2.2.3. Các bước quan trọng trong việc áp dụng giải thuật di truyền kinh điển. ....... 26
2.2.4. Ví dụ............................................................................................................ 27
CHƯƠNG 3 BÀI TOÁN ĐỐI SÁNH MẪU SỬ DỤNG GIẢI THUẬT DI
TRUYỀN .............................................................................................................. 29
3.1. Bài toán đối sánh mẫu trên một file văn bản. .................................................. 29
3.1.1. Phân tích thuật toán ..................................................................................... 30
3.1.2. Các quá trình hoạt động của chương trình .................................................... 35

3.1.3. Kết quả và đánh giá ..................................................................................... 39
3.2. Bài toán đối sánh mẫu trên nhiều file văn bản ................................................. 53
3.2.1. Phát biểu bài toán ........................................................................................ 53
3.2.2. Kết quả thử nghiệm...................................................................................... 55


iv

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN.............................................................. 60
*) Kết luận............................................................................................................. 60
*) Hướng nghiên cứu phát triển ............................................................................. 60
TÀI LIỆU THAM KHẢO ..................................................................................... 61

DANH MỤC THUẬT NGỮ, TỪ VIẾT TẮT, KÍ HIỆU
GA

Giải thuật di truyền

NST

Nhiễm sắc thể

Population

Quần thể

Pattern matching

Đối sánh mẫu


TSP

Bài toán người bán hàng


v

DANH MỤC CÁC HÌNH VẼ
Hình 1.1 : Sơ đồ automat ......................................................................................... 6
Hình 1.2. Mis-match trong khi đang so sánh tại vị trí j ............................................ 7
Hình 1.3. Good-suffix shift, trường hợp u lại xuất hiện trong x................................ 8
Hình 1.4. Good-suffix shift, trường hợp chỉ có suffix của u xuất hiện trong x .......... 8
Hình 1.5. Bad-character shift ................................................................................... 8
Hình 1.6. ................................................................................................................. 9
Hình 2.1. Sơ đồ giải thuật GA ............................................................................... 14
Hình 3.1. Giao diện chương trình .......................................................................... 39
Hình 3.2. Giao diện chương trình mở rộng ............................................................ 55

DANH MỤC BẢNG BIỂU
Bảng 2.1. Bảng quần thể khởi tạo ban đầu ............................................................. 27
Bảng 3.1. Ví dụ về biểu diễn cá thể ....................................................................... 35
Bảng 3.2. Kết quả chương trình với độ chính xác 100% ........................................ 41
Bảng 3.3. Kết quả chương trình với độ chính xác 90% .......................................... 42
Bảng 3.4. Kết quả chương trình với độ chính xác 80% .......................................... 43
Bảng 3.5. Kết quả chương trình với tỉ lệ a – b: 0.5 – 0.5 ........................................ 44
Bảng 3.6. Kết quả chương trình với tỉ lệ a – b: 0.6 – 0.4 ........................................ 45
Bảng 3.7. Kết quả chương trình với tỉ lệ a – b: 0.8 – 0.2 ........................................ 46
Bảng 3.8. Kết quả chương trình với tỉ lệ a – b: 0.9 – 0.1 ........................................ 47
Bảng 3.9. Kết quả chương trình mở rộng với độ chính xác 100% .......................... 56
Bảng 3.10. Kết quả chương trình mở rộng với độ chính xác 90% .......................... 57

Bảng 3.11. Kết quả chương trình mở rộng với độ chính xác 80% .......................... 58


1

MỞ ĐẦU
Hiện nay, cùng với sự phát triển không ngừng của ngành khoa học máy tính
chính là việc hệ thống thông tin được lưu trữ ngày càng đồ sộ. Đối với một kho
thông tin lớn như vậy, việc người dùng muốn tra cứu, truy vấn dữ liệu cũng ngày
càng khó khăn hơn. Bên cạnh đó, khi lượng thông tin phát triển quá nhiều, việc tổ
chức, quản lí chúng để làm sao kiểm soát được việc bùng nổ thông tin cũng là một
trong những vấn đề cần quan tâm của các nhà quản lí. Hiện nay đã có rất nhiều công
cụ truy vấn có thể hỗ trợ cho người dùng phần nào trong việc tìm kiếm:
* Công cụ tìm kiếm của wikipedia: Chỉ tìm ra tên tựa bài của văn bản nào
trùng hợp với từ khóa.
* Công cụ tìm kiếm của phần mềm ứng dụng Microsoft word: Công cụ
FIND cho phép người dùng tìm kiếm cụm từ nội bên trong một hồ sơ, văn bản.
* Công cụ tìm kiếm của hệ điều hành Microsoft Windows và Adobe Reader:
Cả hai công cụ này cho phép tìm kiếm các hồ sơ có chứa từ khóa trong một hồ sơ,
một thư mục hay trong các ổ đĩa của máy tính.
Tuy nhiên, các công cụ trên vẫn tồn tại những hạn chế nhất định.Trong khi
đó, công việc tìm kiếm, truy vấn dữ liệu làm sao để nhanh chóng và hiệu quả vẫn
đang là một vấn đề cấp thiết đang được rất nhiều người dùng quan tâm. Các thông
tin được lưu trữ trên máy tính tuy lớn nhưng đa số đều được lưu dưới dạng văn bản,
và mặc dù có rất nhiều công cụ tìm kiếm nhưng cơ chế chung của chúng vẫn là dựa
trên phương pháp sử dụng chuỗi. Đối sánh mẫu (pattern matching) là một bài toán
quan trọng trong việc hỗ trợ tìm kiếm văn bản được áp dụng để tìm một xâu khớp
với mẫu trong văn bản hoặc tìm các văn bản có chứa mẫu.
Giải thuật di truyền (GA – Genetic Algorithms) là một kỹ thuật cơ bản của
tính toán mềm nhằm tìm kiếm giải pháp thích hợp cho các bài toán tối ưu tổ hợp, nó

vận dụng các nguyên lý của tiến hóa như lai ghép, đột biến, chọn lọc. Ngày nay,
giải thuật di truyền được ứng dụng rộng rãi trên mọi lĩnh vực như tin sinh học, khoa
học máy tính, trí tuệ nhân tạo, tài chính và một số ngành khác.


2

Đề tài “Bài toán đối sánh mẫu sử dụng giải thuật di truyền” nhằm mục
đích nghiên cứu bài toán đối sánh mẫu, giải thuật di truyền và ứng dụng của giải
thuật di truyền trong đối sánh mẫu và tìm kiếm văn bản.
Ngoài phần mở đầu và kết luận, luận văn gồm có 3 chương:
- Chương 1: Một số thuật toán đối sánh mẫu
- Chương 2: Giới thiệu về giải thuật di truyền
- Chương 3: Bài toán đối sánh mẫu sử dụng giải thuật di truyền
Phương pháp nghiên cứu
Trong luận văn, học viên đã sử dụng các phương pháp nghiên cứu chính sau:
- Phương pháp nghiên cứu lý thuyết: Tìm tòi, tổng hợp tài liệu, hệ thống lại
các kiến thức, tìm hiểu các khái niệm, thuật toán sử dụng trong luận văn.
- Lập trình thử nghiệm: Luận văn sử dụng ngôn ngữ lập trình là Visual
Studio C# 2012 để viết chương trình thử nghiệm.
- Các phương pháp so sánh.


3

CHƯƠNG 1
MỘT SỐ THUẬT TOÁN ĐỐI SÁNH MẪU
Chương này giới thiệu và phát biểu bài toán đối sánh mẫu, tìm hiểu một số
thuật toán đã và đang được sử dụng để giải bài toán đối sánh mẫu.
1.1. Giới thiệu về bài toán đối sánh mẫu

Trong khoa học máy tính, đối sánh mẫu là hành động kiểm tra xem một trình
tự các kí tự có hiện diện trong một xâu cho trước hay không. Ngược lại với nhận
dạng mẫu, đối sánh mẫu thường có sự chính xác hơn. Dạng phổ biến nhất của bài
toán đối sánh mẫu là: Cho trước nguồn tìm kiếm là một tập D các văn bản, cho một
câu hỏi dạng văn bản q (thường là một từ, một xâu văn bản 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) 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 văn bản truy vấn q, hệ thống
tìm kiếm cần phải kiểm tra văn bản truy vấn q có là một xâu con của các văn bản
thuộc tập D hay không (sánh mẫu) 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 xâu 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 văn
bản kết quả có thể không cần chứa q mà chỉ cần “liên quan” tới q, nghĩa là có xâu
con trong văn bản 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 xác văn
bản truy vấn .[6]
1.2. Phát biểu bài toán
Đối sánh mẫu là một bài toán cơ bản trong xử lý văn bản, bài toán yêu cầu
tìm ra một hoặc nhiều vị trí xuất hiện của mẫu q trên một văn bản S. Mẫu q và văn
bản S là các chuỗi có độ dài M và N (M ≤ N); q và S là các xâu ký tự trên cùng một
bảng chữ cái Σ có δ ký tự. Bài toán sánh mẫu tổng quát được phát biểu như sau:
“Cho mẫu q độ dài M và văn bản S độ dài N trên cùng bảng chữ Σ. Tìm
một (hoặc tất cả) các lần xuất hiện của mẫu q trong S”.


4

Trong bài toán tìm kiếm văn bản trên tập văn bản D, bài toán sánh mẫu được
thực hiện đối với mọi cặp gồm mẫu q và mọi văn bản d  D. Trong trường hợp độ
dài N của d rất lớn và số lượng văn bản trong D rất nhiều thì thời gian tìm kiếm văn

bản phù hợp với truy vấn q sẽ là rất tốn kém.
1.3. Một số thuật toán đối sánh mẫu cơ bản
1.3.1. Thuật toán Brute Force
Thuật toán Brute Force là dạng thuật toán tìm kiếm tuần tự, nó thử kiểm tra
tất cả các vị trí trên văn bản từ 1 cho đến n – m + 1. Sau mỗi lần thử, thuật toán
Brute Force dịch mẫu sang phải một ký tự cho đến khi kiểm tra hết văn bản.
Thuật toán Brute Force không cần công việc chuẩn bị cũng như các mảng
phụ cho quá trình tìm kiếm. Độ phức tạp tính toán của thuật toán này là O(n*m).
Thuật toán được xây dựng đơn giản, nhưng với văn bản lớn thì thuật toán
này tỏ ra không hiệu quả.
1.3.2. Thuật toán Knuth-Morris-Pratt
Thuật toán được phát minh năm 1977 bởi hai giáo sư của ĐH Stanford, Hoa
Kỳ (một trong số ít các trường đại học xếp hàng số một về khoa học máy tính trên
thế giới, cùng với trường MIT, CMU cũng của Hoa Kỳ và Cambrige của Anh) là
Donal Knuth và Vaughan Ronald Pratt. Giáo sư Knuth (giải Turing năm 1971) còn
rất nổi tiếng với cuốn sách “Nghệ thuật lập trình” (The Art of Computer
Programming), hiện nay đã có đến tập 6. Ba tập đầu tiên đã xuất bản ở Việt Nam, là
một trong những cuốn sách gối đầu giường cho bất kì lập trình viên nói riêng và
những ai yêu thích lập trình máy tính nói chung trên toàn thế giới. Thuật toán này
còn có tên là KMP, tức là lấy tên viết của ba người đồng phát minh ra nó, chữ “M”
là chỉ giáo sư J.H.Morris, cũng là một giáo sư rất nổi tiếng trong ngành khoa học
máy tính.
Ý tưởng chính của phương pháp này như sau: Trong quá trình tìm kiếm vị trí
của mẫu P trong xâu gốc T, nếu tìm thấy một vị trí sai, ta chuyển sang vị trí tìm


5

kiếm tiếp theo và quá trình tìm kiếm này sẽ được tận dụng thông tin từ quá trình tìm
kiếm trước để tránh việc phải xét lại các trường hợp không cần thiết.

Thuật toán Knuth-Morris-Pratt là thuật toán có độ phức tạp tuyến tính đầu
tiên được phát hiện ra, nó dựa trên thuật toán Brute force với ý tưởng lợi dụng lại
những thông tin của lần thử trước cho lần sau. Trong thuật toán Brute force vì chỉ
dịch cửa sổ đi một ký tự nên có đến m-1 ký tự của cửa sổ mới là những ký tự của
cửa sổ vừa xét. Trong đó có thể có rất nhiều ký tự đã được so sánh giống với mẫu
và bây giờ lại nằm trên cửa sổ mới nhưng được dịch đi về vị trí so sánh với mẫu.
Việc xử lý những ký tự này có thể được tính toán trước rồi lưu lại kết quả. Nhờ đó
lần thử sau có thể dịch đi được nhiều hơn một ký tự, và giảm số ký tự phải so sánh
lại.
Xét lần thử tại vị trí j, khi đó cửa sổ đang xét bao gồm các ký tự y[j…j+m-1],
giả sử sự khác biệt đầu tiên xảy ra giữa hai ký tự x[i] và y[j+i-1].
Khi đó x[1…i] = y[j…i+j-1] = u và a = x[i] y[i+j] = b. Với trường hợp
này, dịch cửa sổ phải thỏa mãn v là phần đầu của xâu x khớp với phần đuôi của xâu
u trên văn bản. Hơn nữa ký tự c ở ngay sau v trên mẫu phải khác với ký tự a. Trong
những đoạn như v thoả mãn các tính chất trên ta chỉ quan tâm đến đoạn có độ dài
lớn nhất.
Thuật toán Knuth-Morris-Prath sử dụng mảng Next để lưu trữ độ dài lớn
nhất của xâu v trong trường hợp xâu u=x[1…i-1]. Mảng này có thể tính trước với
chi phí về thời gian là O(m).
Thuật toán này có chi phí về thời gian là O(m+n) với nhiều nhất là 2n-1 lần
số lần so sánh kí tự trong quá trình tìm kiếm.
1.3.3. Thuật toán Automat hữu hạn
Trong thuật toán này, quá trình tìm kiếm được đưa về một quá trình biến đổi
trạng thái automat. Hệ thống automat trong thuật toán DFA sẽ được xây dựng dựa
trên xâu mẫu. Mỗi trạng thái (nút) của automat lúc sẽ đại diện cho số ký tự đang
khớp của mẫu với văn bản. Các ký tự của văn bản sẽ làm thay đổi các trạng thái. Và
khi đạt được trạng cuối cùng có nghĩa là đã tìm được một vị trí xuất hiện ở mẫu.


6


Thuật toán này có phần giống thuật toán Knuth-Morris-Pratt trong việc nhảy
về trạng thái trước khi gặp một ký tự không khớp, nhưng thuật toán DFA có sự
đánh giá chính xác hơn vì việc xác định vị trí nhảy về dựa trên ký tự không khớp
của văn bản (trong khi thuật toán KMP lùi về chỉ dựa trên vị trí không khớp).
Ví dụ: Ta có xâu mẫu là GCAGAGAG với hệ automat sau :

Hình 1.1 : Sơ đồ automat

Với ví dụ ở trên ta có:
Nếu đang ở trạng thái 2 gặp ký tự A trên văn bản sẽ chuyển sang trạng thái 3.
Nếu đang ở trạng thái 6 gặp ký tự C trên văn bản sẽ chuyển sang trạng thái 2.
Trạng thái 8 là trạng thái cuối cùng, nếu đạt được trạng thái này có nghĩa là
đã tìm thấy một xuất hiện của mẫu trên văn bản.
Trạng thái 0 là trạng thái mặc định (các liên kết không được biểu thị đều chỉ
về trạng thái này), ví dụ ở nút 5 nếu gặp bất kỳ ký tự nào khác G thì đều chuyển về
trạng thái 0.
Việc xây dựng hệ automat khá đơn giản khi được cài đặt trên ma trận kề. Khi
đó thuật toán có thời gian xử lý là O(n); thời gian và bộ nhớ để tạo ra hệ automat là
O(m*) (tùy cách cài đặt).


7

1.3.4. Thuật toán Boyer-Moore
Thuật toán Boyer Moore là thuật toán tìm kiếm chuỗi rất có hiệu quả trong
thực tiễn, các dạng khác nhau của thuật toán này thường được cài đặt trong các
chương trình soạn thảo văn bản.
Các đặc điểm chính của nó:
-


Thực hiện việc so sánh từ phải sang trái.

-

Giai đoạn tiền xử lý (preprocessing) có độ phức tạp thời gian và không gian
là O(m + ).

-

Giai đoạn tìm kiếm có độ phức tạp O(m*n).

-

So sánh tối đa 3n kí tự trong trường hợp xấu nhất đối với mẫu không có chu
kỳ (non periodic pattern).

-

Độ phức tạp O(m/n) trong trường hợp tốt nhất.
Trong cài đặt ta dùng mảng bmGs để lưu cách dịch 1, mảng bmBc để lưu

phép dịch thứ 2 (ký tự không khớp).
Thuật toán sẽ quét các kí tự của mẫu (pattern) từ phải sang trái, bắt đầu từ
phần tử cuối cùng.
Trong trường hợp mis-match (hoặc là trường hợp đã tìm được 01 đoạn khớp
với mẫu), nó sẽ dùng 2 hàm được tính toán trước để dịch cửa sổ sang bên phải. Hai
hàm dịch chuyển này được gọi là good-suffix shift ( còn được biết với cái tên phép
dịch chuyển khớp) và bad-character shift (hay phép dịch chuyển xuất hiện).
Đối với mẫu x[0…m-1], ta dùng 01 biến số chỉ số i chạy từ cuối về đầu, đối

với chuỗi y[0…n-1], ta dùng 01 biến j để chốt ở phía đầu.
Giả sử trong quá trình so sánh, ta gặp 1 mis-match tại vị trí x[i] = a của mẫu
và y[i+j] = b trong khi đang thử khớp tại vị trí j.

Hình 1.2. Mis-match trong khi đang so sánh tại vị trí j


8

Khi đó, x[i+1...m-1] = y[j+i+1…j+m-1] = u và x[i] ≠ y[i+j]. Bây giờ ta đi xét
đối với từng trường hợp, 2 hàm trên sẽ thực hiện việc di chuyển như thế nào:
-

Phép dịch chuyển good-suffix shift sẽ dịch cửa sổ sang bên phải cho
đến khi gặp 1 kí tự khác với x[i] trong trường hợp đoạn u lại xuất hiện
trong x.

Hình 1.3. Good-suffix shift, trường hợp u lại xuất hiện trong x

-

Nếu đoạn u không xuất hiện lại trong x, mà chỉ có 1 phần cuối (suffix)
của u khớp với phần đầu (prefix) của x, thì ta sẽ dịch 1 đoạn sao cho
phần suffix dài nhất v của y[j+i+1…j+m-1] khớp với prefix của x.

Hình 1.4. Good-suffix shift, trường hợp chỉ có suffix của u xuất hiện trong x

-

Phép dịch chuyển bad-character shift sẽ khớp kí tự y[i+j] với 1 kí tự

(bên trái nhất) trong đoạn x[0…m-2].

Hình 1.5. Bad-character shift


9

-

Nếu y[i+j] không xuất hiện trong x, ta thấy ngay rằng không có xuất
hiện nào của x trong y mà chứa y[i+j], do đó ta có thể đặt cửa sổ ngay
sau y[i+j], tức là y[j+i+1].

Hình 1.6.

Thuật toán Boyer-Moore sẽ chọn đoạn dịch chuyển dài nhất trong 2 hàm
dịch chuyển good-suffix và bad-character shift. Hai hàm này được định nghĩa như
sau: Hàm good-suffix shift được lưu trong bảng bmGs có kích thước m+1. Ta định
nghĩa 2 điều kiện sau:
+ Cs(i,s): với mỗi k mà i < k < m, s ≥ k hoặc x[k-s] = x[k]
+ Co(i,s): nếu s < i thì x[i-s] ≠ x[i].
Khi đó, với 0 ≤ i < m: bmGs[i+1] = min{s>0: Cs(i,s) and Co(i,s) hold}
Và chúng ta định nghĩa bmGs[0] là độ dài chu kỳ của x. Việc tính toán bảng
bmGs sử dụng 1 bảng suff được định nghĩa như sau:
Với 1 ≤ i < m, suff[i] = max{k: x[i-k+1…i] = x[m-k…m-1]}
Hàm bad-character shift được lưu trong bảng bmBc có kích thước . Cho c
trong ∑: bmBc[c] = min{i: 1 ≤ i ngược lại.
Bảng bmGs và bmBc được tính toán trong thời gian O(m+ ) trước khi thực
hiện tìm kiếm và cần 1 không gian phụ là O(m+ ). Giai đoạn tìm kiếm có độ phức

tạp thời gian bậc 2 nhưng lại chỉ có 3n phép so sánh khi tìm kiếm 1 chuỗi không có
chu kì. Đối với việc tìm kiếm trong một khối lượng lớn các chữ cái, thuật toán có
thể thực hiện với một tốc độ rất nhanh. Khi tìm kiếm chuỗi am-1 trong bn chuỗi, thuật
toán chỉ sử dụng O(m/n) phép so sánh, là chi phí thấp nhất của các thuật toán tìm
kiếm hiện đại có thể đạt được [2].


10

1.3.5. Thuật toán Karp-Rabin
Thuật toán mang tên hai nhà khoa học phát minh ra nó là Richard M.Karp
(sinh năm 1931,người Mỹ) và Michael O.Rabin (sinh năm 1931,người Đức). Tư
tưởng chính của phương pháp này là sử dụng phương pháp băm (hashing). Tức là
mỗi một xâu sẽ được gán với một giá trị của hàm băm (hash function). Ví dụ, có
xâu “hello” được gán với giá trị bằng 5, và hai xâu được gọi là bằng nhau nếu giá trị
hàm băm của nó bằng nhau.Như vậy, thay vì việc phải đối sánh các xâu con của T
với mẫu P, ta chỉ cần so sánh giá trị hàm băm của chúng và đưa ra kết luận.
Trong thuật toán này, hàm băm phải thỏa mãn một số tính chất như phải dễ
dàng tính được trên chuỗi, và đặc biệt công việc tính lại phải đơn giản để ít ảnh
hưởng đến thời gian thực hiện của thuật toán. Chẳng hạn hàm băm được chọn ở đây
là: hash(w[i…i+m-1]) = h = (w[i]*dm-1 + w[i+1]*dm-2 + … w[i+m-1]*d0) mod q.
Việc tính lại hàm băm sau khi dịch cửa sổ đi một ký tự chỉ đơn giản như sau:
h = ((h – w[i]*dm-1)*d + w[i+m]
Trong bài toán này ta có thể chọn d = 2 để tiện cho việc tính toán a*2 tương
đương a shl 1. Và không chỉ thế ta chọn q = MaxLongint khi đó phép mod q không
cần thiết phải thực hiện vì sự tràn số trong tính toán chính là một phép mod có tốc
độ rất nhanh.
Thuật toán Karp-Rabin sử dụng hàm băm tính toán nhanh, không phụ thuộc
vào chiều dài chuỗi cần tìm kiếm; tiết kiệm bộ nhớ vì không lưu trữ nhiều kết quả
tìm kiếm trước đó; không sử dụng các phương pháp nhận biết, loại trừ các kết quả

xấu cho các bước tiếp theo.
1.3.6. Một số thuật toán khác
Một số thuật toán nêu trên chưa phải là tất cả các thuật toán đối sánh mẫu
hiện có. Nhưng chúng đã đại diện cho đa số các tư tưởng dùng để giải bài toán đối
sánh.
Các thuật toán so sánh mẫu lần lượt từ trái sang phải thường là các dạng của
thuật toán Knuth-Morris-Pratt và thuật toán sử dụng Automat như: Forward Dawg
Matching, Apostolico-Crochemore, Not So Naive, …



×