Strings and Pattern Matching Dương Anh Đức Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 2 Strings and Pattern Matching Brute Fo
Trang 1Strings and Pattern Matching
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 2
Strings and
Pattern Matching
Brute Force,
Rabin
Rabin Karp, Karp,
Knuth
Knuth MorrisMorris PrattPratt
RegularRegular ExpressionsExpressions
Trang 2Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 3
Bài
Bài tốn tốn tìm tìm kiếm kiếm chuỗi chuỗi ký ký tự
ĐốiĐối tượngtượng củacủa bàibài tốntốn stringstring searchingsearching làlà tìmtìm
kiếm
kiếm vịvị trítrí củacủa mộtmột mẫu mẫu văn văn bản bản (text (text pattern) pattern)
trong
trong nội nội dung dung một một văn văn bản bản lớn lớn hơn hơn (một (một câu,
một
một đoạn đoạn hay hay một một quyển quyển sách, sách, … …))
CũngCũng nhưnhư phầnphần lớnlớn cáccác thuậtthuật tốntốn khác,khác, quanquan tâmtâm
chính
chính củacủa stringstring searchingsearching làlà tốc tốc độ độ và và hiệu hiệu quả quả
CĩCĩ nhiềunhiều thuậtthuật tốntốn tìmtìm kiễmkiễm chuỗichuỗi kýký tựtự kháckhác
nhau
nhau TuyTuy nhiênnhiên,, chúngchúng tata sẽsẽ chỉchỉ khảokhảo sátsát baba thuậtthuật
tốn
tốn làlà:: BruteBrute ForceForce,, RabinRabin KarpKarp và Knuth
Knuth Morris
Morris PrattPratt
Thuật
Thuật tốn tốn Brute Force Brute Force
ThuậtThuật tốntốn BruteBrute ForceForce soso sánhsánh mẫumẫu tìmtìm kiếmkiếm vớivới
văn
văn bản,bản, mỗimỗi lầnlần 11 kýký tự,tự, chocho đếnđến khikhi cáccác kýký tựtự
khơng
khơng khớpkhớp đượcđược tìmtìm thấythấy::
ThuậtThuật tốntốn cĩcĩ thểthể đượcđược thiếtthiết kếkế saosao chocho nĩnĩ sẽsẽ dừngdừng
khi
khi gặpgặp sựsự xuấtxuất hiệnhiện đầuđầu tiêntiên củacủa mẫumẫu trongtrong texttext
hoặc
hoặc chocho đếnđến khikhi đãđã xétxét đếnđến cuốicuối texttext
Trang 3Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 5
Thuật
Thuật tốn tốn Brute Force Brute Force
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 6
Thuật
Thuật tốn tốn Brute Force Brute Force
Algorithm Brute Brute Force Force (P) (P);;
Input Input:: String String mẫumẫu P P với với m m ký ký tự tự
Ouput Ouput:: Vị Vị trí trí chuỗi chuỗi mẫu mẫu P P trong trong T T hoặc hoặc báo báo khơng khơng cĩ cĩ
do
if
if (text (text letter letter == == pattern pattern letter) letter)
so so sánh sánh text text letter letter kế kế với với pattern pattern letter letter kế kế
else
chuyển chuyển pattern pattern dịch dịch sang sang phải phải 1 1 letter letter
until until (tìm (tìm thấy thấy tồn tồn bộ bộ pattern pattern hoặc hoặc đến đến cuối cuối text) text)
Trang 4Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 7
Thuật toán Brute Force
Thuật toán Brute Force
Độ Độ phức phức tạp tạp của của thuật thuật tốn tốn Brute Brute Force Force:: Giả Giả
sử
sử kích kích thước thước của của mẫu mẫu là là M M ký ký tự tự và và text text cĩ cĩ
N
N ký ký tự tự
TrườngTrường hợphợp xấuxấu nhấtnhất:: soso sánhsánh mẫumẫu vớivới mọimọi
chuỗi
chuỗi concon chiềuchiều dàidài MM trongtrong texttext
TổngTổng sốsố phépphép soso sánhsánh:: M M (N (N M+ M+1 1))
Độ Độ phức phức tạp tạp trong trong trường trường hợp hợp xấu xấu nhất nhất ::
O(MN)
Trang 5Dương
Dương Anh Anh Đức Đức – – Nhập Nhập môn môn Cấu Cấu trúc trúc Dữ Dữ liệu liệu và và Giải Giải thuật thuật 9
Thuật toán Brute Force
Độ Độ phức phức tạp tạp của của thuật thuật tốn tốn Brute Brute Force Force:: Giả Giả sử sử
kích
kích thước thước của của mẫu mẫu là là M M ký ký tự tự và và text text cĩ cĩ N N ký ký
tự
Trường Trường hợp hợp tốt tốt nhất nhất 1 1:: mẫu mẫu xuất xuất hiện hiện ngay ngay đầu đầu
text
Độ Độ phức phức tạp tạp trong trong trường trường hợp hợp tốt tốt nhất nhất 1 1:: O(M)
Trường Trường hợp hợp tốt tốt nhất nhất 2 2:: mẫu khơng khơng xuất xuất hiện hiện
trong
trong text text
Độ Độ phức phức tạp tạp trong trong trường trường hợp hợp tốt tốt nhất nhất 2 2:: O(N)
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 10
Ví
Ví dụdụ, , vớivới M=5 M=5 tata cĩcĩ víví dụdụ sausau: :
Trang 6Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 11
Thuật
Thuật tốn tốn Rabin Rabin Karp Karp
n ThuậtThuật tốntốn Rabin Rabin Karp Karp tính tính các các giá giá trị trị băm băm
(hash
(hash value) value) của của mẫu mẫu tìm tìm kiếm kiếm và và của của chuỗi chuỗi
con
con M M ký ký tự tự cần cần so so sánh sánh trong trong văn văn bản bản
n NếuNếu cáccác giágiá trịtrị bămbăm khơngkhơng bằngbằng nhau,nhau, thuậtthuật tốntốn
sẽ
sẽ tínhtính giágiá trịtrị bămbăm chocho chuỗichuỗi concon MM kýký tựtự kếkế tiếptiếp
Thuật
Thuật tốn tốn Rabin Rabin Karp Karp
NếuNếu cáccác giágiá trịtrị bămbăm bằngbằng nhau,nhau, thuậtthuật tốntốn thựcthực
hiện
hiện phépphép soso sánhsánh Brute Brute Force Force giữa giữa mẫu mẫu và
chuỗi này này
TheoTheo cáchcách này,này, sẽsẽ chỉchỉ cĩcĩ mộtmột phépphép soso sánhsánh ứngứng vớivới
mỗi
mỗi chuỗichuỗi concon trongtrong vănvăn bản,bản, vàvà Brute Brute Force Force sẽ
chỉ
chỉ cần cần đến đến khi khi các các giá giá trị trị băm băm bằng bằng nhau nhau
Trang 7Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 13
Thuật
Thuật tốn tốn Rabin Rabin Karp Karp
HãyHãy xemxem víví dụdụ dướidưới đâyđây đểđể rõrõ hơnhơn mộtmột chútchút::
GiáGiá trịtrị bămbăm củacủa “AAAAA”“AAAAA” làlà 100100
GiáGiá trịtrị bămbăm củacủa “AAAAH”“AAAAH” làlà 3737
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 14
Thuật toán Rabin
Thuật toán Rabin Karp Karp
Trang 8Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 15
Thuật toán Rabin
Thuật toán Rabin Karp Karp
MẫuMẫu cócó chiềuchiều dàidài MM kýký tựtự
hash_p=giágiá trịtrị bămbăm củacủa mẫumẫu
hash_t=giágiá trịtrị bămbăm củacủa MM kýký tựtự đầuđầu trongtrong texttext
do
ifif (( hash_p ==== hash_t ))
So
So sánh sánh brute brute force force giữa giữa mẫu mẫu và và chuỗi chuỗi con con
hash_t == giá giá trị trị băm băm của của M M ký ký tự tự kế kế trong trong text text
until
until (kết (kết thúc thúc text text hoặc hoặc kết kết quả quả soso sánh sánh ==== true) true)
Thuật
Thuật tốn tốn Rabin Rabin Karp Karp
NhữngNhững câucâu hỏihỏi chungchung củacủaRabin Rabin Karp Karp ::
ChọnChọn hàmhàm bămbăm nàonào đểđể tínhtính giágiá trịtrị băm?băm?
CĩCĩ tốntốn nhiềunhiều thờithời giangian đểđể “băm”“băm” cáccác chuỗichuỗi concon
hay
hay khơng?khơng?
ĐãĐã kếtkết thúcthúc quáquá trìnhtrình tìmtìm kiếmkiếm chưa?chưa?
ĐểĐể trảtrả lờilời nhữngnhững câucâu hỏihỏi trêntrên tata cầncần quayquay lạilại tốntốn
học
học mộtmột chútchút
Trang 9Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 17
Tốn
Tốn học học với với Rabin Rabin Karp Karp
XemXem chuỗichuỗi kýký MM tựtự nhưnhư làlà mộtmột sốsố MM chữchữ sốsố trongtrong
cơ
cơ sốsố b ,, với với b là là số số ký ký tự tự trong trong bảng bảng chữ chữ cái cái
Chuỗi ký ký tự tự con con t[i t[i … … i+M i+M 1 1]] được được ánh ánh xạ xạ thành
h(i)=t[i]× ×b b M M-1 +t[i+1]× ×b b M M-2 + +t[i+M + +t[i+M- -1] 1]
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 18
Tốn
Tốn học học với với Rabin Rabin Karp Karp
Hơn Hơn nữa, nữa, cĩ cĩ x(i) x(i) ta ta cĩ cĩ thể thể tính tính x(i+ x(i+1 1)) cho cho
chuỗi
chuỗi con con kế kế tiếp tiếp t[i+ t[i+1 1 i+M] i+M] với với chi chi phí phí cố cố
định
định (O( (O(1 1)) )) như như sau sau::
h(i+h(i+11)=t[i+)=t[i+11]]× ×b b M M-1 +t[i+ +t[i+2 2] ]× ×b b M M-
-2 + + +t[i+M] +t[i+M]
h(i+h(i+11)=h()=h(ii))× ×b b Shift Shift left left 1 1 digit digit
t[t[ii]]× ×b b M Trừ Trừ chữ chữ số số trái trái nhất
+t[+t[i+Mi+M]] CộngchữsốCộngchữsố phảiphải nhấtnhất
Trang 10Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 19
Tốn
Tốn học học với với Rabin Rabin Karp Karp
BằngBằng cáchcách này,này, tata khơngkhơng baobao giờgiờ thậtthật sựsự phảiphải tínhtính
một
một giágiá trịtrị mớimới ĐơnĐơn giản,giản, tata chỉchỉ phảiphải hiệuhiệu chỉnhchỉnh
giá
giá trịtrị sẵnsẵn cĩcĩ khikhi dịchdịch chuyểnchuyển sangsang phảiphải 11 kýký tựtự
Tốn
Tốn học học với với Rabin Rabin Karp Karp
n XétXét mộtmột víví dudu
¨¨ GiảGiả sửsử bộbộ chữchữ cáicái củacủa chúngchúng tata gồmgồm 1010 kýký tựtự [a,[a, b,b,
c,
c, d,d, e,e, f,f, g,g, h,h, ii,, j]j]
¨¨ GiảGiả sửsử “a”“a” tươngtương ứngứng vớivới 11,, “b”“b” tươngtương ứngứng vớivới 22,,
…
¨¨ GiáGiá trịtrị bămbăm củacủa chuỗichuỗi “cah”“cah” sẽsẽ làlà::
3*100 + 1*10 + 8*1 = 318
Trang 11Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 21
Tốn
Tốn học học với với Rabin Rabin Karp Karp
NếuNếu MM lớn,lớn, giágiá trịtrị kếtkết quảquả sẽsẽ rấtrất lớnlớn (~b(~bM)) ĐểĐể giảigiải
quyết
quyết vấnvấn đềđề này,này, tata sẽsẽ dùngdùng hàmhàmMOD ((% % trong trong
C)
C) để để chỉ chỉ lấy lấy phần phần dư dư sau sau khi khi chia chia cho cho một một số số
nguyên
nguyên tố tố p
HàmHàm MODMOD đượcđược dùngdùng vìvì mộtmột sốsố tínhtính chấtchất sausau củacủa
nĩ
nĩ::
[(x mod p)+(y mod p)]mod p = (
[(x mod p)+(y mod p)]mod p = (x+y x+y)mod p )mod p
(x mod p) mod p = x mod p
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 22
Tốn
Tốn học học với với Rabin Rabin Karp Karp
Do Do đó đó::
h(
h(i i)=((t[ )=((t[i i] ]× ×b b M M-1 mod mod p)+(t[i+ p)+(t[i+1 1] ]× ×b b M M-2 mod mod p) p)
+ + +(t[i+M +(t[i+M- -1 1]mod ]mod p))mod p))mod p p h(i+
h(i+1 1)=(h( )=(h(i i))× ×b b modmod p p // // ShiftShift left left 1 1 digit digit
t[ t[i i]]× ×b bM mod mod p p// // TrừTrừ chữ chữ số số trái trái nhất
+ + t[ t[i+M i+M] ] mod mod p) p)// // CộngCộng chữ chữ số số phải phải nhất nhất
mod mod p p
Trang 12Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 23
Tốn
Tốn học học với với Rabin Rabin Karp Karp
ĐộĐộ phứcphức tạptạp củacủa thuậtthuật tốntốnRabin Rabin Karp Karp
Nếu p làlà sốsố nguyênnguyên tốtố đủđủ lớn,lớn, giágiá trịtrị bămbăm nĩinĩi
chung
chung sẽsẽ kháckhác nhaunhau vớivới cáccác chuỗichuỗi kháckhác nhaunhau
TrongTrong trườngtrường hợphợp này,này, việcviệc tìmtìm kiếmkiếm tốntốn chichi
phí O(N),, trongtrong đĩđĩ NN làlà sốsố kýký tựtự cĩcĩ trongtrong texttext
TaTa luơnluơn cĩcĩ thểthể tìmtìm đượcđược víví dụdụ trongtrong đĩ,đĩ, trongtrong
trường
trường hợphợp xấuxấu nhất,nhất, chichi phíphí sẽsẽ làlà O(MN)) TuyTuy
nhiên,
nhiên, trườngtrường hợphợp nàynày cĩcĩ lẽlẽ sẽsẽ chỉchỉ xảyxảy rara khikhi p
quá
quá nhỏnhỏ
Thuật
Thuật tốn tốn Knuth Knuth Morris Morris Pratt Pratt
ThuậtThuật tốntốn KnuthKnuth MorrisMorris PrattPratt (KMP(KMP)) kháckhác vớivới
thuật
thuật tốntốn brutebrute forceforceởở chỗchỗ nĩnĩ lưulưu lạilại thơngthơng tintin vềvề
những
những lầnlần soso sánhsánh trướctrước đểđể dùngdùng chocho lầnlần soso sánhsánh
kế
kế tiếptiếp
MộtMột hàmhàm••failurefailure function(f)function(f) đượcđược dùngdùng đểđể tínhtính baobao
nhiêu
nhiêu thơngthơng tintin ởở bướcbước trướctrước cĩcĩ thểthể đượcđược dùngdùng lạilại
ĐặcĐặc biệt,biệt, ff cĩ cĩ thể thể định định nghĩa nghĩa như như prefix prefix dài dài nhất nhất
của
của mẫu mẫu P[ P[0 0,, ,j] ,j] đồng đồng thời thời là là suffix suffix của của P[ P[1 1,, ,j] ,j]
(( chú chú ý, ý, khơng khơng phải phải của của P[ P[0 0,, ,j] ,j] ))
Trang 13Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 25
VíVí dụdụ::
GiáGiá trịtrị củacủa KPMKPM failurefailure functionfunction::
HàmHàm nàynày chocho biếtbiết baobao nhiêunhiêu kýký tựtự ởở đầuđầu củacủa
mẫu
mẫu tínhtính đếnđến nơinơi xảyxảy rara sựsự kháckhác biệtbiệt khớpkhớp vớivới
text
text
NếuNếu sựsự kháckhác biệtbiệt xảyxảy rara ởở vịvị trítrí 44,, tata sẽsẽ biếtbiết a,a,
b
b ởở vịvị trítrí 22,, 33 tươngtương ứngứng vớivới a,a, bb ởở vịvị trítrí 00,, 11
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 26
Thuật
Thuật tốn tốn so so khớp khớp KPM KPM((mãmã giảgiả):):
return ““KhongKhong co co P P trong trong T T””
Algorithm KMPMatc h (T,P)
Input Input: : StringString T T (text) (text) với với n n ký ký tự tự và và mẫu mẫu P P với với m m ký ký tự tự
Output Output: : Chỉ Chỉ số số đầu đầu của của chuỗi chuỗi con con đầu đầu tiên tiên trongtrong T T khớp khớp với với P, P, hoặc hoặc cho cho biết
P P khơng khơng phải phải là là chuỗi chuỗi con con của của T T
f ¬ KMPFailureFunction (P) (P); ; // //xây xây dựng dựng failure failure function function
i ¬ ¬ 0 0; ; j j ¬ ¬ 0 0; ;
while i i < < n n do
if P[j] P[j] = = T[ T[i i] ] then
if j j = = m m - - 1 1 then
return i i - - m m - - 1 1 //tìm được được một một chuỗi chuỗi con con khớp
i ¬ ¬ i i + + 1 1
j ¬ ¬ j j + + 1 1
else else if if j j > > 0 0 then //khơng khớp, khớp, nhưng nhưng cịn cịn dữ dữ liệu liệu
j ¬ ¬ f(j f(j- -1) //j chỉ chỉ đến đến ngay ngay sau sau matching matching prefix prefix trong trong P P
i ¬ ¬ i i + + 1 1
return ““KhongKhong co co P P trong trong T T””
Trang 14Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 27
Thuật toán KPM failure function
ii ¬ ¬ ii + + 1 1
Algorithm KMPFailureFunction (P) (P); ;
Input Input: :String mẫumẫu P P với với m m ký ký tự
Output Output: :Failure Failure functionfunction ff ứng ứng với với P, P, sẽ sẽ ánh ánh xạ xạ jj với với chiều chiều dài dài của của longest longest
prefix của của P P là là suffix suffix của của P[ P[1 1,, ,j] ,j]
i ¬ ¬ 1 1; ; j j ¬ ¬ 0 0; ;
while i £ £ m m-1 do
if P[j] P[j] = = T[j] T[j] then // //ta ta cĩcĩ jj + + 1 1 ký ký tự tự khớp khớp nhau nhau
f( f(i i) ) ¬¬ j j + + 1 1
i ¬ ¬ i i + + 1 1
j ¬ ¬ j j + + 1 1
else else if if j j > > 0 0 then // // jj chỉ chỉ đến đến ngay ngay sau sau matching matching prefix prefix trong trong P P
j ¬ ¬ f(j f(j- -1)
else // //khơng khơng khớp
f( f(i i) ) ¬ ¬ 0 0
ii ¬ ¬ ii + + 1 1
Thuật
Thuật tốn tốn Knuth Knuth Morris Morris Pratt Pratt
Trang 15Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 29
PhânPhân tíchtích độđộ phứcphức tạptạp củacủa thuậtthuật tốntốn
ĐịnhĐịnh nghĩanghĩa kk = = ii jj
TrongTrong mỗimỗi lầnlần lặplặp củacủa vịngvịng lặplặp whilewhile mộtmột trongtrong
3
3 điềuđiều sausau sẽsẽ xảyxảy rara::
NếuNếu T[i]T[i] == P[j],P[j], thìthì ii tăng tăng lên lên 1 1,, jj cũng cũng vậy, vậy, kk
khơng khơng đổi đổi
NếuNếu T[i]T[i] !=!= P[j]P[j] vàvà jj > > 0 0,, thì thì ii khơng khơng đổi đổi và và kk
tăng tăng lên lên ít ít nhất nhất 1 1,, vì vì kk thay thay đổi đổi trong trong khoảng khoảng từ
từ ii jj đến đến ii f(j f(j 1 1))
NếuNếu T[i]!=P[j]T[i]!=P[j] vàvà jj = = 0 0,, thì thì ii tăng tăng lên lên 1 1 và và kk
tăng tăng lên lên 1 1 vì vì jj khơng khơng đổi đổi
Thuật
Thuật tốn tốn Knuth Knuth Morris Morris Pratt Pratt
Dương Anh Đức
Dương Anh Đức – – Nhập môn Cấu trúc Dữ liệu và Giải thuật Nhập môn Cấu trúc Dữ liệu và Giải thuật 30
Thuật
Thuật tốn tốn Knuth Knuth Morris Morris Pratt Pratt
NhưNhư vậy,vậy, mỗimỗi lầnlần lặp,lặp, ii hoặc hoặc k, k, tăng tăng lên lên ít ít nhất nhất 1 1
nên
nên số số lần lần lặp lặp tối tối đa đa là là 2 2n n
DĩDĩ nhiênnhiên tata đangđang giảgiả thiếtthiết ff đã đã được được tính tính trước trước
TuyTuy nhiên,nhiên, cáchcách tínhtính ff gần gần giống giống như như KMPMatch KMPMatch
nên
nên chi chi phí phí tính tính ff hồn hồn tồn tồn tương tương tự tự = = O(m) O(m)
TổngTổng chichi phíphí:: O(O(n n + + m) m)