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

Tiểu luận môn Thuật Toán và Phương Pháp Giải Quyết Vấn Đề TÌM HIỂU VẤN ĐỀ SO SÁNH CHUỖI VÀ MỘT SỐ PHƯƠNG PHÁP GIẢI QUYẾT

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 (516.39 KB, 18 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
PHÒNG ĐÀO TẠO SĐH – KHCN & QHĐN
BÀI TIỂU LUẬN
MÔN THUẬT TOÁN VÀ PHƯƠNG PHÁP GIẢI QUYẾT VẤN
ĐỀ
TÌM HIỂU VẤN ĐỀ SO SÁNH CHUỖI VÀ MỘT SỐ
PHƯƠNG PHÁP GIẢI QUYẾT
GVHD: PGS.TS ĐỖ VĂN NHƠN
HVTH: NGUYỄN HẢI TOÀN
MSHV: CH1301110
TPHCM, tháng 10 năm 2014
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
NHẬN XÉT CỦA GIẢNG VIÊN





























Nguyễn Hải Toàn – CH1301110 Trang 2
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
Mục lục
Nguyễn Hải Toàn – CH1301110 Trang 3
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
1. Phát biểu vấn đề
So sánh chuỗi là quá trình tìm kiếm tất cả các lần xuất hiện của một chuỗi mẫu
(pattern) trong một chuỗi khác. Quá trình so sánh chuỗi như thế này là hoạt động diễn ra
rất thường xuyên trong các chương trình chỉnh sửa văn bản, các trình duyệt web, các máy
tìm kiếm… Các giải thuật này còn được sử dụng trong việc tìm các mẫu trong chuỗi
ADN.
Cho T[1 n] là một chuỗi bao gồm n ký tự, trong đó các T[i], 1<=i<=n là từng ký
tự ở trong chuỗi. Cho P[1 m] là chuỗi mẫu bao gồm m ký tự, m<=n. Ta giả sử rằng P và
T chỉ chứa các ký tự có trong tập hữu hạn Σ. Ví dụ Σ={0, 1} hoặc Σ={a, b, c…, z}. Vấn
đề đặt ra là tìm xem P có xuất hiện trong T hay không. Hay nói cách khác là tìm số
nguyên s (0<s<n) sao cho T[s+1 s+m] = P[1 m]. Khi đó, ta nói P xuất hiện trong T với
độ dịch chuyển s. Nếu P thực sự xuất hiện trong T với độ dịch chuyển s, ta gọi s là độ
dịch chuyển hợp lệ, ngược lại ta gọi s là độ dịch chuyển không hợp lệ.
Cho chuỗi T[1 n], một chuỗi con của T được định nghĩa là T[i j] với 1<=i, j<=n.

Chuỗi con này chứa các ký tự từ chỉ số i đến chỉ số j của mảng các ký tự trong T. Lưu ý
rằng T cũng chính là một chuỗi con của T với i=1, j=n.
Một chuỗi con thực sự của chuỗi T[1 n] là chuỗi T[i j] với i<j và (i>0 hoặc j<n).
Trong trường hợp i > j thì T[i j] là một chuỗi rỗng. Tiền tố của một chuỗi T[1 n] là chuỗi
T[1 i] với 1<=i<=n. Hậu tố của một chuỗi T[1 n] là chuỗi T[j n] với 1<=j<=n.
Nguyễn Hải Toàn – CH1301110 Trang 4
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
2. Phương pháp giải quyết vấn đề so sánh chuỗi
Có rất nhiều giải thuật để thực hiện việc so sánh chuỗi. Trong bài tiểu luận này,
Chúng ta sẽ tìm hiểu về bốn giải thuật cơ bản nhất trong so sánh chuỗi đó là: Naïve,
Rabin-Karp, Finite Automaton và Knutt-Morris-Pratt. Ngoại trừ giải thuật Naïve, các giải
thuật còn lại đều thực hiện các bước tiền xử lý nhằm giảm thời gian cho việc tìm kiếm.
2.1 Thuật toán Naive
Đây là giải thuật cơ bản và đơn giản nhất, sử dụng nguyên lý vét cạn. Giải
thuật này kiểm tra tất cả các khả năng của chuỗi mẫu P[1 m] nằm trong chuỗi T[1 n]
bằng cách duyệt từ đầu tới cuối chuỗi T.
NAIVE-STRING-MATCHER(T, P)
1 n = T.length
2 m = P.length
3 for s = 0 to n-m do
4 j = 1
5 while (j <= m AND T[s+j] == P[j]) do
6 j = j+1
7 if (j > m)
8 “Tìm thấy mẫu với độ dịch chuyển s”
Minh họa giải thuật naïve-String-Matcher
Phân tích: Vòng lặp while bên trong chạy tối đa m lần, vòng lặp for bên ngoài chạy tối
đa n-m+1 lần. Do vậy, thời gian chạy của giải thuật này là T(n) = O((n-m+1)*m) =
O(n*m). Rõ ràng, giải thuật này không hiệu quả vì nó bỏ qua mọi thông tin hữu ích có
được trong quá trình so sánh chuỗi tại từng giá trị của s. Giải thuật Knutt-Morris-Pratt

được trình bày trong các phần sau tỏ ra tốt hơn nhiều so với Naïve vì tận dụng các thông
tin hữu ích khi tìm kiếm.
Nguyễn Hải Toàn – CH1301110 Trang 5
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
2.2 Thuật toán Rabin-Karp
Thuật toán này do Rabin và Karp đề xuất. Thuật toán tiêu tốn O(m) để tiền xử lý lí
các dữ liệu nhập, và thời gian chạy tệ nhất của nó là O((n-m+1)m). Mặc dù vậy trung
bình các trường hợp điều tiêu tốn thời gian ít hơn.
Ta nhận thấy rằng mỗi chuỗi S cấu tạo từ Σ điều có thể số hóa thành 1 số được . Ví
dụ Σ = {0,1,2 ,9} , S = “1234” thì ta sẽ có digit(S)=1,234. Gọi p là giá trị số hóa của P,
hay nói cách khác p là giá trị thập phân tương ứng của P. Gọi ts là giá trị thập phân tương
ứng của T[s+1,…,s+m] , s<n-m+1. Ta nhận thấy rằng tS =p khi và chỉ khi P = T[s+1,
…,s+m].
Mặt khác, ta có thể tính p và t
0
theo 2 công thức :
p = P[m] * 10
0
+ P[m-1]*10
1
+ ….+ P[1]*10
m-1
.
t
0
= T[1]*10
m-1
+T[2]*10
m-2
+….+T[m]*10

0
.
Ta nhận thấy rằng qua hai công thức trên ta sẽ phải tiêu tốn O(m) cho mỗi công
thức.
Sau khi tính t0 , việc tính các t1,t2,….tn-m-1 trở nên đơn giản hơn với và chỉ tiêu
tốn O(1) cho mỗi ti mà thôi. Ta tính các t1,t2,….tn-m-1 lần lượt theo công thức sau:
t
i
= 10*(t
i-1
– 10
m-1
*T[i]) + T[i+m].
Sau khi tính được tính được các giá trị của p và ti, bài toán so sánh chuỗi trở nên
đơn giản vô cùng khi được qui về bài toán “ tìm một số trong một mảng số các số
nguyên” – nghĩa là tìm sự xuất hiện của p trong ti .Hay nói cách khác, bài toán tìm chuỗi
qui về bài toán tim i với i ∈ [0,n-m-1] sao cho p=ti.
Vì vậy để tính được tất cả các giá trị p và ti , hay nói cách khác là tìm được chuỗi
P trong T, ta chỉ cần tiêu tốn thời gian O(m) + O(n-m-1) mà thôi. Và điều này cũng cho ta
1 kết quả khá đẹp với thuật toán Rabin-Karp với độ phức tạp là O(m) cho tiền xử lí và
O(n-m-1) để so sánh chuỗi. Thế nhưng vấn đề sẽ phát sinh khi ta cài đặt nó lên bộ nhớ
máy tính nơi mà p và ti bị giới hạn trong kiểu (long) chỉ có 16 chữ số ↔ Max(m) = 16.
Nguyễn Hải Toàn – CH1301110 Trang 6
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề

Cải tiến Rabin-Karp
Để giải quyết trường hợp m>16 , p và ti vượt quá các kiểu dữ liệu của máy tính ta
sử dụng mảng băm (hash). Điều này có nghĩa là thay vì tính p và ti ta sẽ tính p’ và ti’ mà
ở đó p’ = p mod q, ti’ = ti mod q, với q là một số nguyên tố lớn nằm trong khoảng mà
máy tính có thể biểu diễn được như là long, integer,…

Lúc này, Việc so sánh chuỗi sẽ qui về việc so sánh các số t’i và p’. nếu như t’i ≠
p’ thì điều này đồng nghĩa với việc P ≠ T[i+1,i+m].
Chú ý rằng:
- p’ = t’
i
không đồng nghĩa với việc P <>T[i+1,i+m] (hình vẽ)
- Số q càng lớn thì xác xuất trường hợp p’ = t’
i
và P <>T[i+1,i+m] càng thấp.
- Khi p’ =t
i
’ để kết luận ta cần phải kiểm tra lại việc P và T[i+1,i+m] có bằng
nhau hay không.


Tổng quát cho hệ cơ số d
Cũng phải chú ý 1 điều khác là không phải lúc nào Σ cũng là tập hợp các chữ số
trong cơ số 10. Xét trường hợp Σ là tập hợp cac chữ số của hệ cơ số d. Lúc này t’i cần
được tính lại như sau :
t’
i
= (d(t’
i-1
– T[i]h) + T[i+m]) mod q. Với h=d
m-1
mod q
Trong hệ cơ số d , p và t
0
cũng được tính lại :
p = P[m] * d

0
+ P[m-1]*d
1
+ ….+ P[1]*d
m-1
t
0
= T[1]*d
m-1
+T[2]*d
m-2
+….+T[m]*d
0
Sau khi tổng quát hóa ta viết lại thuật toán Rabin-Karp như sau :
RABIN-KARP-MATCHER(T, P, d, q)
1 n ← length[T ]
Nguyễn Hải Toàn – CH1301110 Trang 7
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
2 m ← length[P]
3 h ← d
m-1
mod q
4 p’ ← 0
5 t’
0
← 0
6 for i ← 1 to m // Tiền xử lý
7 p’ ← (dp’ + P[i ]) mod q
8 t’
0

← (dt’
0
+ T [i ]) mod q
9 for s ← 0 to n − m // so sánh
10 if p’ == t’
s
11 if P[1 . .m] == T [s + 1 . . s + m]
12 print “Mẫu xuất hiện với độ dịch chuyển” s
13 if (s < n – m)
14 t’s+1 ← (d(t’s − T [s + 1]h) + T [s + m + 1]) mod q
Phân tích:
- Quá trình tiền xử lý tiêu tốn Θ(m) thời gian với 1 vòng lặp for i =1 to n
- Quá trình so sánh trong trường hợp tốt nhất là p’!=t’
i
với mọi i thì việc so sánh
tiêu tốn O(n-m). Nhưng bù lại trong trường hợp xấu nhất khi p’==t’
I
thì việc so
sánh phải thực hiện thêm lệnh kiểm tra P[1 m] và T[i+1,i+m], điều này chỉ tiêu
tốn O(m) thời gian chạy.
Tóm lại: độ phức tạp của Rabin-Karp là O((n-m+1)m).
2.3 Thuật toán tìm kiếm chuỗi dùng finite automaton
Thuật toán tìm kiếm chuỗi finite automata xây dựng một finite automaton (máy
trạng thái hữu hạn) giúp tìm kiếm chuỗi P[1 m] trên chuỗi T[1 n] một cách nhanh chóng
chỉ với độ phức tạp O(n).
* Định nghĩa “finite automaton” (FA - máy trạng thái hữu hạn)
FA là một bộ gồm (Q, q
0
, A,Σ, δ) , trong đó :
- Q là tập các trạng thái.

- q
0
là trạng thái ban đầu.
- A là tập các trạng thái mà ở đó chuỗi được chấp nhận (accepting state)
- Σ tập hợp nguồn các kí tự trong T và P.
Nguyễn Hải Toàn – CH1301110 Trang 8
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
- δ là một hàm từ Q x Σ vào Q gọi là hàm chuyển đôi ( transition function)
của FA.
FA bắt đầu từ trạng thái q0, từ đó FA lần lượt đọc các kí tự của chuỗi input (ở đây
là chuỗi T), tại mỗi kí tự a của chuỗi input FA sẽ đổi trạng thái q của FA thành trạng thái
δ(q,a). Cho đến khi q ∈ A thì lúc này FA sẽ chấp nhận chuỗi input ( tìm thấy chuỗi P
trong T).
Hình trên biểu diễn các trạng thái biến đổi trạng thái của FA. Hình (a) là bảng mà
ở đó mỗi ô biểu diễn giá trị của δ(Cột,Dòng). (b) là sơ đồ biến đổi của FA. Trọng số cạnh
là các kí tự a mà FA lần lượt đọc được ở T chiều mũi tên là chiều thể hiện sự biến đổi
trạng thái của FA trước và sau khi đọc thấy giá trị của kí tự a.
Một chuỗi T được gọi là “accept” thì đồng nghĩa với việc tìm thấy chuỗi P trong
nó. Điều này có nghĩa là trong quá trình thay đổi trạng thái của FA trong khi đọc lần lượt
các kí tự a thuộc T có một điểm mà ở đó FA được chuyển trạng thái q ∈ A. Ngược lại,
nếu không tìm được điểm như vậy đồng nghĩa với việc chuỗi P không xuất hiện trong T,
lúc này ta gọi T “rejected”.
Một FA đòi hỏi 1 hàm φ gọi là hàm “trạng thái cuối cùng” ( final-state function)
là 1 hàm từ tập Σ* vào Q . Ở đó φ(w) là trạng thái cuối cùng của FA sau khi FA duyệt
qua chuỗi w. Hàm φ được định nghĩa như sau :
- φ(ε) = q
0
.
- φ(wa) = δ(φ(w), a) với w ∈ Σ* a ∈ Σ .
Nguyễn Hải Toàn – CH1301110 Trang 9

GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
* String-matching automata (SMA)
Với mỗi chuỗi P ta có một SMA riêng. Trước khi bước vào tìm chuỗi P trong
chuỗi T, ta cần phải xây dựng SMA cho P trước sau đó bạn mới có thể dùng nó để tìm
chuỗi P trong T được.
Ta xem Hình 3, ở đó chuỗi P = ababaca là chuỗi cần tìm kiếm trong chuỗi
T=abababacaba. Ta thấy rằng A={7}, q0 = 0. Ta đọc lần lượt các kí tự của T nếu thấy
xuất hiện kí tự a (kí tự đầu tiên của P) thì chuyển trạng thái từ 0  1 (chuỗi P trong T bắt
đầu có dấu hiệu xuất hiện). Sau đó lại xuất hiện kí T[2] = b =P[2], điều này cho thấy P đã
từ từ xuất hiện rõ hơn trong T, cứ như vậy ta đọc lần lượt và tra theo bảng (b) để có được
các trạng thái của FA. Cho đến khi trạng thái bằng 7 thì có nghĩa là ta đã tìm được chuỗi
P trong T.
Hình 3
Vậy là bảng (b) đã giải quyết toàn bộ vấn đề của bài toán, vấn đề đặt ra là làm sao
để ta xây dựng bảng (b)?
Nguyễn Hải Toàn – CH1301110 Trang 10
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
Ta xét hàm hỗ trợ σ là hàm hậu tố tương ứng với P, hàm σ là 1 ánh xạ tư tập Σ*
vào tập {0,1,2,…,m} mà ở đó σ(x) là độ dài của tiền tố dài nhất của P mà tiền tố đó cũng
là hậu tố của x.
σ(x) = max {k : Pk ⋊ x} . ⋊ là kí hiệu của hậu tố ( P
k
⋊ x nghĩa là P
k

hậu tố của x)
Ta định nghĩa hàm δ dựa theo hàm σ như sau : δ(q, a) = σ(Pqa) ∀ q ∈ [0,m]
Như vậy dựa vào σ ta sẽ xây dựng được hàm δ – chìa khóa để xây dựng nên bảng
b nói ở trên. Ta có được thuật toán tính δ như sau:
COMPUTE-TRANSITION-FUNCTION(P,

Σ
)
1 m ← length[P]
2 for q ← 0 to m
3 for each character a ∈
Σ
4 k ← min(m + 1, q + 2)
5 repeat k ← k − 1
6 until Pk ⋊ Pqa
7 δ(q, a) ← k
8 return δ
Thuật toán trên làm tiêu tốn của ta Θ((m+1)Σ) thời gian tính toán do 2 vòng lặp
for. Nhưng hiệu quả nó đem lại cho cả bài toán thật sự rất lớn. Vì chỉ sau khi có được
bảng δ ta sẽ thực hiện việc tìm kiếm trên chuỗi rất đơn giản theo thuật toán sau.
FINITE-AUTOMATON-MATCHER(T, δ,m)
1 n ← length[T ]
2 q ← 0
3 for i ← 1 to n do
4 q ← δ(q, T [i ])
5 if q == m then
6 print “Pattern occurs with shift” i – m
Nguyễn Hải Toàn – CH1301110 Trang 11
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
Rõ ràng, chỉ với tốn O(n) cho việc tìm kiếm khi có δ trong tay.Vậy tổng cộng ta đã
tiêu tốn hết O((m+1)|Σ|) +O(n) cho tất cả việc tìm kiếm.
2.4 Thuật toán Knuth-Morris-Pratt
Giải thuật độ phức tạp tuyến tính này được Knuth, Morris và Pratt phát hiện ra nhờ
việc phân tích chặt chẽ giải thuật Naive. Giả sử ta muốn tìm chuỗi mẫu P[1 m] trong
T[1 n], đến một lúc nào đó thì ta sẽ có P[i] != T[j].
Nguyễn Hải Toàn – CH1301110 Trang 12

GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
Nếu dùng thuật toán Naïve thì ta dịch P sang phải một vị trí. Nhưng vì ta đã so
sánh đến T[j] nên ta tìm cách dịch P đi càng xa càng tốt. Các tốt nhất là dịch P sang phải
một đoạn sao cho tiền tố của P[1…i] xếp trùng với một đoạn hậu tố của T[1 j]. Khi đó,
chỉ cần so sánh T[j] và P[k] (với P[1 k] là tiền tố của P trùng với hậu tố của T[1 j]) mà
không cần phải làm lại từ đầu. Ta gọi chuỗi vừa là tiền tố, vừa là hậu tố của chuỗi x là
biên của x.
Nếu gọi π[i] là độ dài của biên có độ dài lớn nhất của chuỗi P[1 i] thì khi đó tại vị
trí P[i] và T[j] khác nhau, ta sẽ dịch P sang phải một đoạn i-π[i]. Trong trường hợp tốt
nhất π[i] = 0 thì ta sẽ dịch chuyển P sang phải một đoạn m. Giá trị các π[i] sẽ được tính
toán trước. Hình bên liệt kê tất cả các giá trị π[i] trong chuỗi mẫu P=ababababca cho
trước.
* Cách xây dựng mảng
π
:
Định lý: Nếu r, s là biên của chuỗi x mà |r|
< |s| thì r là biên của s.
Định nghĩa: Cho x là một chuỗi và c là một
ký tự. Biên r của x có thể được mở rộng
thành rc nếu như rc là biên của xc.
Trong quá trình tiền xử lý chuỗi P, mỗi π[i], 1 ≤ i ≤ m, lưu lại độ dài của biên rộng
nhất của P[1 i]. Vì chuỗi rỗng không có biên nên ta gán: π[0] = -1. Giả sử các giá trị
π[0], …, π[i] đã biết, giá trị π[i+1] sẽ được tính bằng cách kiểm tra xem biên của chuỗi
P[1 i] có thể được mở rộng bằng ký tự P[i+1] hay không. Ta sử dụng biến k lưu trữ các
π[i]. Nếu P[i+1] = P[k] thì ta gán π[i+1] = k+1, ngược lại ta xét k = π[k] và quay lại các
bước so sánh P[i+1] với P[k] ở trên.
Giải thuật so khớp chuỗi KMP-Matcher được trình bày trong đoạn mã giả sau đây.
Giải thuật này gọi tới giải thuật tiền xử lý Compute-Prefix-Function để tính π.
KMP-MATCHER(T, P)
Nguyễn Hải Toàn – CH1301110 Trang 13

GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
1 n ← length[T ]
2 m ← length[P]
3 π ← COMPUTE-PREFIX-FUNCTION(P)
4 q ← 0 //Số lượng ký tự trùng nhau
5 for i ← 1 to n //Duyệt chuỗi T từ trái qua phải
6 do while q > 0 and P[q + 1] ≠ T [i ]
7 do q ← π[q] //Ký tự không trùng nhau
8 if P[q + 1] = T [i ]
9 then q ← q + 1 //Ký tự trùng nhau
10 if q = m //Nếu đã kiểm tra toàn bộ chuỗi P
11 then print “Mẫu xuất hiện với độ dịch chuyển” i − m
12 q ← π[q] //Tìm ký tự trùng nhau tiếp theo
COMPUTE-PREFIX-FUNCTION(P)
1 m ← length[P]
2 π[1] ← 0
3 k ← 0
4 for q ← 2 to m do
5 while k > 0 and P[k + 1] ≠ P[q]
6 do k ← π[k]
7 if P[k + 1] = P[q]
8 then k ← k + 1
9 π[q] ← k
10 return π
Đánh giá: Độ phức tạp của giải thuật tiền xử lý Compute-Prefix-Function là
O(m) bởi vì vòng lặp while bên trong sẽ không bao giờ thực hiện quá m lần. Tương tự,
giải thuật tìm kiếm KMP-Matcher cũng chỉ có độ phức tạp là O(n).
Bởi vì m ≤ n nên độ phức tạp cuối cùng của giải thuật Knutt-Morris-Pratt là O(n)
Nguyễn Hải Toàn – CH1301110 Trang 14
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề

3. Demo
Demo cho chúng ta kiểm nghiệm, so sánh về thời gian chạy của 4 thuật toán trên
trên cùng 1 số test để từ đó có thể chọn thuật toán String Matching phù hợp trong 1 số
trường hợp cụ thể để sử dụng:
Hình 3.1 Giao diện của chương trình
Thử nghiệm-1 : Tìm kiếm mẫu “cntt” trong chuỗi “vietnamcntthethongthongtin”
Nguyễn Hải Toàn – CH1301110 Trang 15
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
Hình 3.2 Kết quả thực hiện được
Trong hình vẽ trên ta thấy, thuật toán Naïve chạy nhanh nhất và tìm được chuỗi
cần tìm ở vị trí số 7.
Một số trường hợp khác:
Chương trình có tạo ra một số trường hợp để test. Chúng ta một mục trong cột
Test Cases sau đó nhấn Excute.
Nguyễn Hải Toàn – CH1301110 Trang 16
GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
Hình 3.3 Kết quả chạy các thuật toán khi so sánh các chuỗi có kích thước lớn
Đối với các chuỗi có kích thước lớn, thuật giải Rabin-Carp có thời gian chạy
nhanh nhất. Sau đó là thuật giải Finite Automaton.
4. Kết luận
- Qua những gì đã trình bày ở trên, chúng ta đã thấy được những ưu và nhược điểm
của một thuật giải so sánh chuỗi. Mỗi thuật giải có thời gian chạy khác nhau,tùy
thuộc vào kích thước của chuỗi và mẫu (pattern) của chuỗi. Mỗi thuật giải phù hợp
với những ứng dụng khác nhau.
- Vì lý do hạn chế, nên trong bài tiểu luận này chỉ trình bày một số thuật toán so
sánh chuỗi thông dụng, còn một số thuật toán cũng được sử dụng rất nhiều như:
Brute-Force, Boyer – Morre. Nếu cơ hội em xin được trình bày trong những bài
báo cáo lần sau.
Tài liệu tham khảo
Nguyễn Hải Toàn – CH1301110 Trang 17

GVHD : PGS.TS Đỗ Văn Nhơn Thuật toán và phương pháp giải quyết vấn đề
Ellard, Daniel J. String Searching. S-Q Course Book. [Online] [Cited: 06 10, 2011.]
/>Hưng, Ngô Quang. 2011. PM1: Thuật toán Knutt-Morris-Pratt. Blog Khoa học máy tính.
[Online] 4 2, 2011. [Cited: 06 10, 2011.] .
Muhammad, Rashid Bin. String Matching Agorithm. Design and Analysis of Computer
Algorithms. [Online] Kent State University.[Cited: 06 20, 2011.]
/>Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Cliford Stein. 2001.
String Matching Algorithms. Introduction to algorithms. 2nd. s.l. : MIT Press, 2001, pp.
906-932.
Nguyễn Hải Toàn – CH1301110 Trang 18

×