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

các thuật toán đối sánh chuỗi

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 (282.98 KB, 20 trang )

1
Data Structures & Algorithms
Các thuật toán đối sánh chuỗi
(String Searching)
Nguyễn Tri Tuấn
Khoa CNTT – ĐH.KHTN.Tp.HCM
Email: nttuan@ fit.hcmuns.edu.vn
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM2
String Searching
Giới thiệu
Các bước xử lý
Các cách tiếp cận
Brute-Force
Knuth-Morris-Pratt
2
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM3
Giới thiệu
ªCác thuật ngữ thường dùng:
String searching
Pattern matching
String matching
Text searching
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM4
Giới thiệu (tt)
ª“Đối sánh chuỗi”làgì?
Cho một chuỗi T vàmột chuỗi P, hãy xác định P có
xuất hiện trong T hay không ?
Tương tự như lệnh:
strstr(T, P) [trong C++]
Pos(P, T) [trong Pascal]
Pattern (P)


Text (T)
m
n
3
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM5
Giới thiệu (tt)
ªĐối sánh chuỗi làmột trong những bài toán cơ
bản và“tự nhiên”nhất của ngành Tin Học
ªCông dụng:
Chức năng search trong các trình soạn thảo văn bản
vàWeb browser
Các công cụ search (vd. Google)
Sinh học phân tử (tìm kiếm các mẫu trong DNA /
protein)

Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM6
Giới thiệu (tt)
ªLịch sử phát triển:
Brute Force:
Trong trường hợp xấu nhất thời gian thực hiện tỷ lệ với m*n
Trong nhiều ứng dụng thực tế thời gian xử lý thực sự tỉ lệ với
m+n
Thích hợp với hầu hết các hệ máy tính
Trong năm 1970, S.A.Cook đã chứng minh một kết
quả lý thuyết giúp suy ra sự tồn tại của một thuật toán
để giải bài toán đối sánh mẫu, cóthời gian tỷ lệ với
M+N trong trường hợp xấu nhất
4
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM7
Giới thiệu (tt)

ªLịch sử phát triển:
D.E.Knuth và V.R.Pratt đã kiên trì theo đuổi kiến trúc
mà Cook đã dùng để chứng minh cho cho định lý của
ông vànhận được một thuật toán tương đối đơn giản.
Đồng thời J.H.Morris cũng khám phára thuật toán
này
Knuth, Morris, Pratt đã không giới thiệu thuật toán
của họ cho đến năm 1976, vàtrong thời gian này
R.S.Boyer và J.S.Moore đã khám phára một thuật
toán nhanh hơn nhiều
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM8
Giới thiệu (tt)
ªLịch sử phát triển:
Trong năm 1980, R.M.Karp và M.O.Rabin đã đi đến
thuật toán đơn giản gần như thuật toán Brute Force,
cóthời gian thi hành thường tỉ lệ với m+n
5
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM9
Giới thiệu (tt)
ªCác thuật toán tiêu biểu:
Brute Force
Karp-Rabin
Morris-Pratt
Knuth-Morris-Pratt
Boyer-Moore
Boyer-Moore-Horspool
Apostolico-Giancarlo
Aho-Corasick
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM10
Các bước xử lý

ªCác thuật toán đối sánh chuỗi thường có 2 bước
xử lý sau:
Bước tiền xử lý (Preprocessing Phase):
Xử lý Pattern
Khởi tạo cấu trúc dữ liệu
Bước tìm kiếm (Searching Phase)
Tìm kiếm Pattern trong Text
6
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM11
Các cách tiếp cận
ª Có4 cách tiếp cận chính để làm tăng tốc độ thuật toán:
Classical Algorithms
Thuật toán chủ yếu dựa vào phép so sánh giữa các ký tự
Thuật toán: Quick Search, Brute Force…
Suffix Automata Algorithms
Sử dụng Suffix Automaton Data Structure để nhận ra tất cả các
hậu tố của Pattern
Thuật toán: Knuth –Morris –Pratt…
Bit-Parallelism Algorithms
Khai thác bản chất song song của các dữ liệu bit để thực hiện các
thao tác cùng lúc
Thuật toán: Shift-Or…
Hashing Algorithms
Sử dụng kỹ thuật băm, tránh việc so sánh các ký tự có độ phức tạp
bậc 2
Thuật toán: Karp-Rabin
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM12
Độ phức tạp
ªĐộ phức tạp của thuật toán phụ thuộc vào 3 yếu
tố sau:

Chiều dài của Pattern
Chiều dài của Text
Độ lớn của tập các ký tự: Binary, DNA, Alphabets…
7
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM13
String Searching
Giới thiệu
Các bước xử lý
Các cách tiếp cận
Brute-Force
Knuth-Morris-Pratt
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM14
Brute-Force
ªÝ tưởng:
Đối với vị tríthứ i của văn bản T (i=0…n-m), ta so sánh
các ký tự của P tương ứng từ trái sang phải:
P[0] với T[i], P[1] với T[i+1],…, P[m-1] với T[i+m-1]
P[j] với T[i+j] (j = 0 m-1)
ªVídụ:
T = “TWO RED ROADS CROSSING”
n = length(T) = 22
P = “ROADS”
m = length(P) = 5
8
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM15
Brute-Force (tt)
ªVídụ:
Bước 1: TWO RED ROADS CROSSING
ROADS
Bước 2: TWO RED ROADS CROSSING

ROADS

Bước 5: TWO RED ROADS CROSSING
ROADS

Bước 9: TWO RED ROADS CROSSING
ROADS
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM16
Brute-Force (tt)
ªCài đặt bằng C:
int stringSearchBF (char *P, char *T);
Kết quả:
-1 : nếu P không nằm trong T, hoặc
>=0: vị trícủa P trong T
9
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM17
Brute-Force (tt)
int stringSearchBF(char *P, char *T)
{
for (int i=0; i<=strlen(T)-strlen(P); i++)
{
int j = 0;
while (j < strlen(P))
if (T[i+j]==P[j]) j++;
else break;
if(j==strlen(P))return i; // tìm thấy
}
return -1 ; // khôngtìm thấy
}
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM18

Brute-Force (tt)
ªĐánh giá:
Trường hợp xấu nhất O(m*n) – tự chứng minh
10
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM19
Brute-Force (tt)
ªĐánh giá:
Trường hợp tốt nhất O(n) – tự chứng minh
Trường hợp trung bình O(n+m) – tự chứng minh
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM20
String Searching
Giới thiệu
Các bước xử lý
Các cách tiếp cận
Brute-Force
Knuth-Morris-Pratt
11
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM21
Đặt vấn đề
ª Trong thuật toán Brute-Force: khi xảy ra không so khớp
tại một ký tự, ta đã xóa bỏ tất cả thông tin có được bởi
các phép so sánh trước đóvàbắt đầu lại việc so sánh từ
ký tự đầu tiên của mẫu P [i=i+1; j=0]
ª Vídụ:
T = 101010100111; P = 10100
101010100111
10100 (không so khớp tại i=0, j=4)
101010100111
10100(Brute-Force: bắt đầu lại từ i=1; j=0)
Dịch chuyển i và j ra sao cho cólợi ?

101010100111
10100 (bắt đầu lại từ i=2; j=2)
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM22
Morris-Pratt
ªHướng giải quyết của Morris-Pratt:
Lợi dụng thông tin đã biết về các ký tự đã so sánh
Biến j thể hiện số ký tự đã được so khớp giữa mẫu
(P) và văn bản (T). Khi gặp vị tríkhông so khớp, thay
vìgán j = 0 để quay lại từ đầu chuỗi P, ta sẽ gán cho
j một giátrị thích hợp
12
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM23
Morris-Pratt (tt)
// Tư tưởng chính của thuật toán Morris-Pratt
// giai đoạn tìm kiếm
i = j = 0;
while (i+j < n) {
if (p[j]==t[i+j]) {
j++;
//khi đã đi hết độ dài của chuỗi P
// à đã tìm đượcP à trả về vị trítìm được
if (j==m) return i;
}
else {
//khi không so khớp, dịch chuyển về vị
// tríNEXT[j]
i = i + j –NEXT[j];
if (j > 0) j = NEXT[j];
}
return -1; // không tìm thấy

Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM24
Morris-Pratt (tt)
ªGiai đoạn tiền xử lý –xây dựng bảng NEXT
Xây dựng mảng NEXT[0 m-1] (có m phần tử)
NEXT[j] chứa giátrị dùng để dịch chuyển con trỏ j khi
xảy ra sự không khớp tại vị trí j
13
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM25
Morris-Pratt (tt)
ª Vídụ:
T = AATAAAATA
P = AAATA
i=0 AATAAAATA
j=0 AAATA
i=0 AATAAAATA
j=1 AAATA
i=0 AATAAAATA
j=2 AAATA (không so khớp à i=i+j–NEXT[2]=1
j=NEXT[2]=1)
0210-1NEXT
43210
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM26
Morris-Pratt (tt)
ª Vídụ:
i=1 AATAAAATA
j=1 AAATA (không so khớp à i=i+j–NEXT[1]=2
j=NEXT[1]=0)
i=2AATAAAATA
j=0 AAATA (không so khớp à i=i+j–NEXT[0]=3
j=0)

i=3AATAAAATA
j=0 AAATA(tiếp tục…)
i=3AATAAAATA
j=3 AAATA
(không so khớp à i=i+j–NEXT[3]=4
j=NEXT[3]=2)
i=4AATAAAATA
j=2 AAATA(tiếp tục…)
i=4AATAAAATA
j=4 AAATA
à so khớp !
14
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM27
Morris-Pratt (tt)
ª Xét trạng thái không so khớp tại vị tríthứ j trên mẫu P
Phần đã so khớp (u), từ P[0] đến P[0 j-1]
Nếu tồn tại v = đoạn so khớp giữa phần đầu P với
phần cuối của P[0 j-1]
à v là đoạn dịch chuyển của j
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM28
Morris-Pratt (tt)
ªCách xây dựng bảng NEXT:
NEXT[0] = -1
Với j>0, giátrị của NEXT[j] làsốk lớn nhất nhỏ hơn j
sao cho k ký tự đầu tiên của mẫu P khớp với k ký tự
cuối của P[0 j-1]
Vídụ: P = AAATA
NEXT[1] = 0
(j=1)
NEXT[2] = 1

(j=2)
A
AA
AA
15
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM29
Morris-Pratt (tt)
NEXT[3] = 2
NEXT[4] = 0
AAA
AAA
TAAA
ATAA
0210-1NEXT
43210
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM30
Morris-Pratt (tt)
// Hàm tạo lập bảng NEXT (Morris-Pratt)
void initNEXT_MP(char *p, int NEXT[]) {
int i, j;
int m = strlen(p);
i = 0;
j = NEXT[0] = -1;
while (i < m) {
if (j == -1 || p[i] == p[j]) {
i++; j++;
NEXT[i] = j;
}
else j = NEXT[j];
}

}
16
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM31
Morris-Pratt (tt)
ª Cài đặt bằng C:
// Thuật toán đối sánh Morris-Pratt
// Kết quả:
// -1 : nếu P không nằm trong T, hoặc
// >=0 : vị trícủa P trong T
int stringSearchMP (char *P,char *T) {
int n = strlen(T);
int m = strlen(P);
int *NEXT = new int[m];
// Tiền xử lý -Tạo lập bảng NEXT
initNEXT_MP(p, NEXT);
// Thực hiện tỉm kiếm
…(xem slide #23)
}
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM32
Morris-Pratt (tt)
ªVídụ:
Xây dựng bảng NEXT cho P = 10100
Xây dựng bảng NEXT cho P = ABACAB
Xây dựng bảng NEXT cho P = GCAGAGAG
Xây dựng bảng NEXT cho P = AABAABA
17
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM33
Morris-Pratt (tt)
2100-1NEXT
43210P = 10100

0
4
1100-1NEXT
53210P = ABACAB
0
5
1
6
1
4
0000-1NEXT
73210P = GCAGAGAG
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM34
Morris-Pratt (tt)
ªĐộ phức tạp:
Giai đoạn tiền xử lý: O(m) (tính NEXT)
Giai đoạn tìm kiếm: O(n)
Tổng: O(n+m)
Số phép so sánh lớn nhất của một ký tự <= m
18
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM35
Knuth-Morris-Pratt
ªCải tiến của KMP so với Morris-Pratt
Khi xây dựng bảng NEXT, Knuth bổ sung kiểm tra
điều kiện c ≠ a để tránh trường hợp “mis-match”ngay
vị trí đầu tiên sau khi dịch chuyển j
Giải thích: nếu a == c, tức làc ≠ b (vìa ≠ b) à sẽ “mis-
match”ngay lần so sánh đầu tiên sau khi dịchchuyển j
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM36
Knuth-Morris-Pratt (tt)

ªTóm lại: thuật toán KMP
Giai đoạn tiền xử lý cómột cải tiến nhỏ:
Tính độ dịch chuyển tốt hơn à tránh so sánh cùng một ký tự
trong T hai lần
Giai đoạn tìm kiếm: hoàn toàn giống thuật toán
Morris-Pratt
19
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM37
Knuth-Morris-Pratt (tt)
// Hàm tạo lập bảng NEXT (KMP)
void initNEXT_KMP(char *p, int NEXT[]) {
int i, j;
int m = strlen(p);
i = 0;
j = NEXT[0] = -1;
while (i < m) {
if (j == -1 || p[i] == p[j]) {
i++; j++;
if (p[i] != p[j]) NEXT[i] = j;
else NEXT[i] = NEXT[j];
}
else j = NEXT[j];
}
}
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM38
Knuth-Morris-Pratt (tt)
ªĐộ phức tạp:
Giai đoạn tiền xử lý: O(m) (tính NEXT)
Giai đoạn tìm kiếm: O(n)
Tổng: O(n+m)

Số phép so sánh lớn nhất của một ký tự <= log
a
m
với a =
1+√5
2
20
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM39
Thank you
Thank you
for your attention
for your attention
Autumn 2008Data Structures & Algorithms -String Searching -Nguyen Tri Tuan, DH.KHTN Tp.HCM40
Q & A
Q & A

×