String matchingBài toán: - Tìm vị trí xuất hiện đầu tiên của chuỗi con trong 1 đoạn text - Tìm vị trí xuất hiện tiếp theo bằng cách thay đổi giá trị đầu của đoạn text - Thuật toán thông
Trang 1Please purchase a personal license.
Trang 2THU Ậ T TOÁN
KNUTT-MORRIS-PRATT
Trang 3String matching
Bài toán:
- Tìm vị trí xuất hiện đầu tiên của chuỗi con trong 1
đoạn text
- Tìm vị trí xuất hiện tiếp theo bằng cách thay đổi giá trị đầu của đoạn text
- Thuật toán thông thường:
- So sánh kí tự đầu của đoạn text và kí tự đầu của chuỗi con
- Quá trình tiếp diễn cho đến khi hết chuỗi con
Trang 4String matching
Thuật toán:
isub= 0; itext = 0; //ví trị hiện tại của chuỗi và đoạn text
while (itext <= strlen(text) && isub<=strlen(sub)
else
}
if (isub > strlen(sub)
Trang 5String matching
Đánh giá thuật toán:
- m – strlength của substring
- n - strlength của đoạn text
Số lần so sánh trong trường hợp xấu nhất: m*(t-m+1)
Ví dụ: substring (AA….AAB), text(AA…AAA)
Substring có m-1 A, text có n A Dẫn đến trường hợp xấu nhất
Trang 6Ý tưởng:
– Để dễ mô tả,ta coi các xâu đánh số từ 1
– Xâu W gọi là tiền tố(prefix) của xâu X nếu X có dạng WY (Y là 1 xâu nào đó)
– Xâu W gọi là hậu tố(suffix) của xâu X nếu X có dạng YW (Y là 1 xâu nào đó)
– Nếu có thêm W# X thì W gọi là prefix(hay suffic) thực sự của X
Trang 7Ý tưởng:
– Hàm int Prefix(int q): trả độ dài của prefix dài nhất của P[1 m] đồng thời là suffix thực sự của
P[1 q]
Trang 8Ví dụ:
Trang 9Thuật toán tính Prefix:
PI [1]= 0 ; k=0;
for (q=2;q<=m;q++)
{ while (k>0 && P[k+1] <>P[q])
k=PI[k];
if(P[k+1]==P[q])
k++;
PI[q]=k;
}
Trang 10Thuật toán tính KMP:
– Xác định độ dài q của xâu vừa là prefix của P,vừa là suffix của T[1 i] với i = 1->n
– Nếu q=m thì vị trí khớp chính là i-m+1
Cách tính q gần như cách tính Prefix
q=0
for (i=1;i<=n;i++)
q=PI[q];
if (P[q+1]==T[i]) q++;
}