Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 2Strings and Pattern Matching ̈ Brute Force, Rabin-Karp, Knuth-Morris-Pratt... Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải
Trang 1Strings and
Pattern Matching
Trang 2Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 2
Strings and
Pattern Matching
̈ Brute Force,
Rabin-Karp, Knuth-Morris-Pratt
Trang 3Bài toán tìm kiếm chuỗi ký tự
kiếm vị trí của một mẫu văn bản (text pattern)
một đoạn hay một quyển sách, …)
tâm chính của string searching là tốc độ và hiệu quả
Trang 4Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 4
với văn bản, mỗi lần 1 ký tự, cho đến khi các kýtự không khớp được tìm thấy:
̈ Thuật toán có thể được thiết kế sao cho nó sẽ
trong text hoặc cho đến khi đã xét đến cuối text
Trang 5Thuật toán Brute Force
Trang 6Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 6
Algorithm Brute Force(P);
Input:String mẫu P với m ký tự
Ouput:Vị trí chuỗi mẫu P trong T hoặc báo không có do
if (text letter == pattern letter)
so sánh text letter kế với pattern letter kế else
chuyển pattern dịch sang phải 1 letter until (tìm thấy toàn bộ pattern hoặc đến cuối text)
Trang 7Thuật toán Brute Force
Trang 8Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 8
̈ Độ phức tạp của thuật toán Brute Force: Giả sử
kích thước của mẫu là M ký tự và text có N ký tự
̊ Trường hợp xấu nhất: so sánh mẫu với mọi chuỗi con chiều dài M trong text
̊ Tổng số phép so sánh: M (N-M+1)
Trang 9Thuật toán Brute Force
̈ Độ phức tạp của thuật toán Brute Force: Giả sử
kích thước của mẫu là M ký tự và text có N ký tự
text
Trang 10Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 10
Ví dụ, với M=5 ta có ví dụ sau:
Trang 11Thuật toán Rabin-Karp
(hash value) của mẫu tìm kiếm và của chuỗi con
M ký tự cần so sánh trong văn bản
̈ Nếu các giá trị băm không bằng nhau, thuật toán
sẽ tính giá trị băm cho chuỗi con M ký tự kế tiếp
Trang 12Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 12
̈ Nếu các giá trị băm bằng nhau, thuật toán thực
chuỗi này
̈ Theo cách này, sẽ chỉ có một phép so sánh ứng
Force sẽ chỉ cần đến khi các giá trị băm bằng nhau
Trang 13Thuật toán Rabin-Karp
̈ Hãy xem ví dụ dưới đây để rõ hơn một chút:
Trang 14Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 14
Trang 15Thuật toán Rabin-Karp
̈ Mẫu có chiều dài M ký tự
̈ hash_p = giá trị băm của mẫu
̈ hash_t = giá trị băm của M ký tự đầu trong text
do
if (hash_p == hash_t)
So sánh brute force giữa mẫu và chuỗi con
Trang 16Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 16
̊ Chọn hàm băm nào để tính giá trị băm?
con hay không?
̊ Đã kết thúc quá trình tìm kiếm chưa?
̈ Để trả lời những câu hỏi trên ta cần quay lại toán
học một chút
Trang 17Toán học với Rabin Rabin -Karp
̈ Xem chuỗi ký M tự như là một số M chữ số trong
cơ số b, với b là số ký tự trong bảng chữ cái
Chuỗi ký tự con t[i … i+M-1] được ánh xạ thành
h(i)=t[i]× bM-1+t[i+1]× bM-2+ +t[i+M-1]
Trang 18Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 18
Toán học với Rabin Rabin -Karp
̈ Hơn nữa,• có x(i) ta có thể tính x(i+1) cho chuỗi
h(i+1)=t[i+1]×bM-1+t[i+2]×bM-2+ +t[i+M]
h(i+1)=h(i)×b Shift left 1 digit
-t[i]×bM Trừ chữ số trái nhất +t[i+M] Cộng chữ số phải nhất
Trang 19Toán học với Rabin Rabin -Karp
tính một giá trị mới Đơn giản, ta chỉ phải hiệu chỉnh giá trị sẵn có khi dịch chuyển sang phải 1ký tự
Trang 20Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 20
Toán học với Rabin Rabin -Karp
Trang 21Toán học với Rabin Rabin -Karp
̈ Nếu M lớn, giá trị kết quả sẽ rất lớn (~bM) Để
giải quyết vấn đề này, ta sẽ dùng hàm MOD (%
số nguyên tố p
của nó:
Trang 22Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 22
Toán học với Rabin Rabin -Karp
h(i)=((t[i]×bM-1mod p)+(t[i+1]×bM-2mod p)
+ +(t[i+M-1]mod p))mod p h(i+1)=(h(i)×b mod p //Shift left 1 digit
- t[i]×bM mod p //Trừ chữ số trái nhất
+ t[i+M] mod p) //Cộng chữ số phải nhất
mod p
Trang 23Toán học với Rabin Rabin -Karp
̊ Nếu p là số nguyên tố đủ lớn, giá trị băm nói chung sẽ khác nhau với các chuỗi khác nhau
phí O(N), trong đó N là số ký tự có trong text
̊ Ta luôn có thể tìm được ví dụ trong đó, trong trường hợp xấu nhất, chi phí sẽ là O(MN) Tuy
Trang 24Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 24
Thuật toán Knuth-Morris-Pratt
thuật toán brute-force ở chỗ nó lưu lại thông tinvề những lần so sánh trước để dùng cho lần sosánh kế tiếp
bao nhiêu thông tin ở bước trước có thể được dùng lại
̈ Đặc biệt, f có thể định nghĩa như prefix dài nhất
của mẫu P[0, ,j] đồng thời là suffix của P[1, ,j]
(chú ý, không phải của P[0, ,j])
Trang 25Thuật toán Knuth-Morris-Pratt
̈ Ví dụ:
̈ Hàm này cho biết bao nhiêu ký tự ở đầu của mẫu
Trang 26Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 26
Algorithm KMPMatch(T,P) Input:String T (text) với n ký tự và mẫu P với m ký tự.
Output:Chỉ số đầu của chuỗi con đầu tiên trong T khớp với P, hoặc cho biết
else if j > 0 then //không khớp, nhưng còn dữ liệu
else
return “Khong co P trong T”
Algorithm KMPMatch(T,P) Input:String T (text) với n ký tự và mẫu P với m ký tự.
Output:Chỉ số đầu của chuỗi con đầu tiên trong T khớp với P, hoặc cho biết
P không phải là chuỗi con của T.
f ← KMPFailureFunction(P); //xây dựng failure function
while i < n do
if P[j] = T[i] then
if j = m - 1 then return i - m - 1 //tìm được một chuỗi con khớp
else if j > 0 then //không khớp, nhưng còn dữ liệu
j ← f(j-1) //j chỉ đến ngay sau matching prefix trong P else
return “Khong co P trong T”
Trang 27Thuật toán KPM failure function
Trang 28Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 28
Thuật toán Knuth-Morris-Pratt
Trang 29Thuật toán Knuth-Morris-Pratt
̈ Phân tích độ phức tạp của thuật toán
Trang 30Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 30
Thuật toán Knuth-Morris-Pratt
̈ Như vậy, mỗi lần lặp, i hoặc k, tăng lên ít nhất 1
nên số lần lặp tối đa là 2n
̈ Dĩ nhiên ta đang giả thiết f đã được tính trước
nên chi phí tính f hoàn toàn tương tự = O(m)
̈ Tổng chi phí: O(n + m)
Trang 31Regular Expressions
̈ Ký hiệu cho phép ta mô tả các chuõi ký tự, có
thể dài vô hạn
̊ ε ký hiệu chuỗi rỗng
̊ ab + c ký hiệu tập hợp {ab, c}
̊ a* ký hiệu tập hợp {ε, a, aa, aaa, }
Trang 32Dương Anh Đức – Nhập môn Cấu trúc Dữ liệu và Giải thuật 32