Youtube com/PoppinKhiem H C VI N CÔNG NGH B U CHÍNH VI N Ọ Ệ Ệ Ư Ễ THÔNG KHOA CÔNG NGH THÔNG TIN 1Ệ BÁO CÁO MÔN CHUYÊN Đ CÔNG NGH PH N M MỀ Ệ Ầ Ề CH Đ PATTERN SEARCHINGỦ Ề Gi ng viên Nguy n Duy Ph ngả[.]
Trang 1H C VI N CÔNG NGH B U CHÍNH VI N Ọ Ệ Ệ Ư Ễ THÔNG
BÁO CÁO
Gi ng viên: Nguy n Duy Ph ả ễ ươ ng Sinh viên:
Mã SV: B52 Nhóm MH:
Trang 2Hà N i, 3/7/2021 ộ
Trang 3Muc luc̣ ̣
I. Tim kiêm mâu t trai qua phaì ́ ̃ ừ ́ ̉
1. Thu t toán ậ BruteForce
2. Thu t toán ậ KnuthMorrisPratt
3. Thu t toán ậ Karp Rabin
4. Thu t toán ậ MorrisPratt
5. Thu t toán ậ Search with an automaton
II. Tìm kiêm mâu t phai qua traí ̃ ừ ̉ ́ 1. Thu t toán ậ BoyerMoore
2. Thu t toán ậ Turbo Boyer Moore
3. ZhuTakaota
4. Thu t toán ậ Berry Ravindran
5. Thu t toán ậ Apostollico giancarlo
6. Thu t toán ậ Colussi
III. Tim kiêm mâu t vi tri cu thề ́ ̃ ư ̣̀ ́ ̣ ̉ 1. Thu t toán ậ Skip Search
2. Thu t toán ậ GalilGiancarlo
IV. Tim kiề ́m mâu t vi tri bât kĩ ư ̣̀ ́ ́ ̀ 1. Thu t toán ậ Quick Search
2. Thu t toán ậ Smith
3. Thu t toán ậ Raita
4. Thu t toán ậ HorsePool
Trang 4I. Tìm ki m m u t trái qua ph i ế ẫ ừ ả
1. Thu t toán Brute Forceậ
Đ c đi mặ ể
Không có giai đo n ti n x lýạ ề ử
B nh c n dùng c đ nh ộ ớ ầ ố ị Luôn luôn d ch 1 bị ước sang ph i ả
Vi c so sánh có th ph i dùng trong các trệ ể ả ường h p ợ
Đ ph c t p pha th c thi là O(m x n)ộ ứ ạ ự
So sánh kho ng 2n ký tả ự Trình bày thu t toánậ
Thu t toán Brute Force ki m traậ ể ở t t c các v trí trong đo n văn b n ấ ả ị ạ ả
gi a 0 và nm, không c n quan tâm li u m u này có t n t i v trí đó ữ ầ ệ ẫ ồ ạ ở ị hay không. Sau đó, sau m i l n ki m tra m u s d ch sang ph i m t v ỗ ầ ể ẫ ẽ ị ả ộ ị trí
Thu t toán Brute Force không c n giai đo n ti n x lý cũng nhậ ầ ạ ề ử ư các m ng ph cho quá trình tìm ki m. Đ ph c t p tính toán c a thu tả ụ ế ộ ứ ạ ủ ậ toán này là O(m.n)
Code void BruteForce(char *x,int m,char *y,int n){
for(int i=0 ; i<=nm ; i++){
for(int j=0 ; j<m && x[j]==y[j+i] ; j++){ // Kiểm tra t iạ j trong X
có = i+j trong Y
if(j==m1){
printf("FOUND AT %i \n",i);
} }
Trang 5} }
Ki m nghi m thu t toánể ệ ậ
Xâu X=”AB”
Xâu Y=”ABDAAB”
2. Thu t toán ậ KnuthMorrisPratt
Đ c đi mặ ể
Th c hi n t trái qua ph iự ệ ừ ả
Pha ti n x lý PreKMP có đ ph c t p không gian và th i gian làề ử ộ ứ ạ ờ O(m)
Pha tìm ki m có đ ph c t p th i gian O(m+n)ế ộ ứ ạ ờ Trình bày thu t toánậ
Thu t toán là b n đ n gi n và x lý tậ ả ơ ả ử ương t nh thu t toán ự ư ậ MorrisPratt khi c g ng d ch chuy n m t đo n dài nh t sao cho m t ố ắ ị ể ộ ạ ấ ộ
ti n t (prefix) ề ố v c a x trùng v i h u t (suffix) c a uủ ớ ậ ố ủ
Đi m khác nhau là KMP s th c hi n thêm so sánh ể ẽ ự ệ c và b, có
nghĩa KMP s th c hi n m t pha dòm trẽ ự ệ ộ ước ký t bên ph i đo n đangự ả ạ
Trang 6so kh p. Do đó m i bớ ỗ ước KMP s d ch chuy n thêm m t bẽ ị ể ộ ước sang
ph i so v i MP n u ả ớ ế c != b
Thu t toán ti n x lý PreKMPậ ề ử
PreMP(X,m,kmpNext){
i=1;
kmpNext[0]=0;
len=0;
while(i<m){
if(X[i] == X[len]){
len++;
kmpNext[i]=len;
i++;
} Else{
If(len!=0){
len = kmpNext[len1];
} Else{
kmpNext[i] =0;
i++;
} }
} }
Trang 7Code KMP(X,m,Y,n){
i = 0; j = 0;
while (i < n) {
if ( X[j] == Y[i] ) { i++; j ++; }
if ( j == m ) {
< Tìm th y m u v trí ij>;ấ ẫ ở ị
else if (i <n && X[j] != Y[i] ) {
if (j !=0) j = kmpNext[ j1];
} }
}
Ki m nghi m thu t toánể ệ ậ
Input:
xâu m u X=”ABABCABAB” đ dài m=9ẫ ộ Xâu văn b n Y=”ABADABABCABAB” đ dài n=13ả ộ B1: PreKMP(X,m,kmpNext[])
Trang 84 0 C!=A 0,0,1,2,0
kmpNext[]={0,0,1,2,0,1,2,3,4}
B2:KMP(X,m,Y,n,kmpNext[])
S
T
T
0 11 12 13 14 15 16 17
X A B A D A B A B C A B A B C A B A B
I=3
j
I
j
I
j
I
j
I
j
3. Thu t toán ậ Karp Rabin
Đ c đi mặ ể
Bi u di n xâu kí t b ng s nguyênể ễ ự ằ ố
Trang 9S d ng hàm bămử ụ
Đô ph c tap thuât toan O((nm+1)*m)̣ ứ ̣ ̣ ́ Trình bày thu t toánậ
Hàm băm cung c p phấ ương th c đ n gi n đ tránh nh ng con s ph c ứ ơ ả ể ữ ố ứ
t p trong vi c so sánh nh ng kí t trong h u h t các trạ ệ ữ ự ầ ế ường h p th c ợ ự
t ế Thay cho vi c ki m tra t ng v trí trong văn b n n u nh có m u xu t ệ ể ừ ị ả ế ư ẫ ấ
hi n, nó ch ph i ki m tra nh ng đo n “g n gi ng” xâu m u. ệ ỉ ả ể ữ ạ ầ ố ẫ
Đ ki m tra s gi ng nhau gi a 2 t s d ng hàm băm. ể ể ự ố ữ ừ ử ụ Giúp cho vi c đ i chi u xâu, hàm băm hash: ệ ố ế
Có kh năng tính toán đả ược Đánh giá xâu m c cao. ứ Hash(y[j+1…j+m]) được tính toán d h n d a trên hash(y[j…ễ ơ ự j+m1]) và hash(y[j+m]):
hash(y[j+1 j+m])= rehash(y[j], y[j+m], hash(y[j j+m1]).
V i t w có đ dài m có hash(w) là: ớ ừ ộ
hash(w[0 m1])=(w[0]*2m1+ w[1]*2m2+∙∙∙+ w[m
1]*20) mod q
V i q là m t s l n. ớ ộ ố ớ
Sau đó rehash(a,b,h)= ((ha*2m1)*2+b) mod q Pha chu n b c a Karp Rabin có hàm hash(x) có th tính toán ẩ ị ủ ể
được. nó được dùng l i không gian nh và có đ ph c t p O(m) ạ ớ ộ ứ ạ
Trong quá trình th c thi nó so sánh hash(x) v i hash([j j+m1]) ự ớ
v i 0<= j<=nm. n u so sánh đúng, nó ph i ki m tra l i xem các kí t ớ ế ả ể ạ ự trong x và y có đúng b ng nhau hay không x=y[j…j+m1] ằ
Code
void RK(char *x, int m, char *y, int n,int prime) {
Trang 10int hashY=0;
for(int i=0;i<m;i++){
hashX+= x[i]*(pow(prime,i));
hashY+= y[i]*(pow(prime,i));
} int i=0;
while(i<n){
if(hashY==hashX){
printf("FOUND AT %i\n",i);
} if(i<n){
hashY=(hashY y[i])/prime + y[i+m]*prime*prime; }
i++;
} }
Ki m nghi m thu t toánể ệ ậ
Input:
X=”ABC” m=3;
Y=”EABABCACD” n=9 Bang đinh nghia cac ki t :̉ ̣ ̃ ́ ́ự
Trang 11Tiên x ly:̀ ử ́ Hash(ABC)= 65*prime^0 + 66*prime^1 + 67*prime^2= 866 Hash(EAB) = 69 + 65*prime + 66*prime^2=858
B*prime^2=855
No
4. Thu t toán ậ MorrisPratt
Đ c đi mặ ể
Th c hi n vi c so sanh t trái qua ph iự ệ ệ ừ ả Pha ti n x lý có đ ph c t p không gian và th i gian là O(m)ề ử ộ ứ ạ ờ Pha ti n x lý có đ ph c t p th i gian là O(m+n)ề ử ộ ứ ạ ờ
Th c thi 2n1 thông tin thu th p đự ậ ược trong quá trình quét văn
b nả
Trang 12Đ tr m (s lộ ễ ố ượng t i đa các l n so sánh ký t đ n)ố ầ ự ơ Trình bày thu t toánậ
Thu t toán MP c i ti n thu t toán Brute Force, thay vì d chậ ả ế ậ ị chuy n t ng bể ừ ước m t, phí công các ký t đã so sánh trộ ự ước đó, ta tìm cách d ch x đi m t đo n xa h n.ị ộ ạ ơ
Gi s t i bả ử ạ ước so sánh b t k , ta có m t pattern “ấ ỳ ộ u” trùng nhau
gi a x và y, t i x[i] != y[j+i] ( ữ ạ a != b), thay vì d ch chuy n 1 bị ể ước sang
ph i, ta c g ng d ch chuy n dài h n sao cho m t ti n t (prefix) ả ố ắ ị ể ơ ộ ề ố v c a xủ trùng v i h u t (suffix) c a u.ớ ậ ố ủ
Ta có m ng mpNext[] đ tính trả ể ước đ dài trùng nhau l n nh tộ ớ ấ
gi a ti n t và h u t trong x, khi so sánh v i y t i v trí th i, x s trữ ề ố ậ ố ớ ạ ị ứ ẽ ượ t
m t kho ng = i – mpNext[i].ộ ả
Vi c tính toán m ng mpNext[] có đ ph c t p th i gian và khôngệ ả ộ ứ ạ ờ gian là O(n). Giai đo n tìm ki m sau đó có đ ph c t p th i gian làạ ế ộ ứ ạ ờ O(m+n).
Code
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define MAX 12 int mpNext[MAX];
void Init() {
for(int i = 0; i < MAX; i++)
Trang 13} void preMp(char *x, int m) {
i = 0; //mang mpNext the hien do dai trung nhau lon
j = mpNext[0] = 1; //nhat giua tien to va hau to while (i < m) {
while (j > 1 && x[i] != x[j]) {
j = mpNext[j]; //chay nguoc xet xem do dai lon nhat cua //vi tri giong voi x[i]
} i++;
j++;
mpNext[i] = j;
int a = 2;
} } void MP(char *x, int m, char *y, int n) { int i, j;// mpNext[m];
//int mpNext[8];
/* Preprocessing */
Init();
preMp(x, m);
for(int k =0;k<m;k++){
cout<<x[k]<<" "<<mpNext[k]<<endl;
Trang 14} /* Searching */
i = j = 0;
while (j < n) {
while (i > 1 && x[i] != y[j])
i = mpNext[i];
i++;
j++;
if (i >= m) {
cout<<j i;
i = mpNext[i];
} }
} void main() {
char *x = "GCAGAGAG"; //"ATCACATCATCA ";
int m = strlen(x);
char *y =
"GCATCGCAGAGAGTATACAGTACG"; //"AGTATCATCACATCATC AGA";
int n = strlen(y);
MP(x, m, y, n);
}
Ki m nghi m thu t toánể ệ ậ
Ki m nghi m pha ti n x lý( thu t toán preMp)ể ệ ề ử ậ
Trang 151
0
1
0
C
G
A A
0
1
1
C
G
A A
0
1
1
Ta được b ng mpNext[]ả
mpNext[i
]
Trang 165. Thu t toán ậ Search with an automaton
Đ c đi mặ ể
yêu c u xây d ng automation đ n đ nh (DFA) ầ ự ơ ị pha x lý có đ ph c t p tính toán là O(n∂) ử ộ ứ ạ quá trình tím ki m có đ ph c t p là O(n) ế ộ ứ ạ
trường h p DFA đợ ươc xây d ng b ng cây cân b ng thì đ ph cự ằ ằ ộ ứ
t p là O(nlog(∂))ạ Trình bày thu t toánậ
Trong thu t toán này, quá trình tìm ki m đậ ế ược đ a v m t quá ư ề ộ trình bi n đ i tr ng thái automat. H th ng automat trong thu t toán ế ổ ạ ệ ố ậ DFA s đẽ ược xây d ng d a trên xâu m u. M i tr ng thái (nút) c a ự ự ẫ ỗ ạ ủ automat lúc s đ i di n cho s ký t đang kh p c a m u v i văn b n. ẽ ạ ệ ố ự ớ ủ ẫ ớ ả Các ký t c a văn b n s làm thay đ i các tr ng thái. Và khi đ t đự ủ ả ẽ ổ ạ ạ ược
tr ng cu i cùng có nghĩa là đã tìm đạ ố ược m t v trí xu t hi n m u. ộ ị ấ ệ ở ẫ
Thu t toán này có ph n gi ng thu t toán KnuthMorrisPratt ậ ầ ố ậ trong vi c nh y v tr ng thái trệ ả ề ạ ước khi g p m t ký t không kh p, ặ ộ ự ớ
nh ng thu t toán DFA có s đánh giá chính xác h n vì vi c xác đ nh v ư ậ ự ơ ệ ị ị trí nh y v d a trên ký t không kh p c a văn b n (trong khi thu t toán ả ề ự ự ớ ủ ả ậ KMP lùi v ch d a trên v trí không kh p). ề ỉ ự ị ớ
Vi c xây d ng h automat khá đ n gi n khi đệ ự ệ ơ ả ược cài đ t trên maặ
tr n k Khi đó thu t toán có th i gian x lý là O(n) và th i gian và b ậ ề ậ ờ ử ờ ộ
nh đ t o ra h automat là O(m*d) (tùy cách cài đ t) . Nh ng ta nh n ớ ể ạ ệ ặ ư ậ
th y r ng trong DFA ch có nhi u nh t m cung thu n và m cung ngh ch, ấ ằ ỉ ề ấ ậ ị
vì v y vi c l u tr các cung không c n thi t ph i l u trên ma tr n k ậ ệ ư ữ ầ ế ả ư ậ ề
mà có th dùng c u trúc danh sách k Forward Star đ l u tr Nh v y ể ấ ề ể ư ữ ư ậ
th i gian chu n b và lờ ẩ ị ượng b nh ch là O(m). Tuy nhiên th i gian tìm ộ ớ ỉ ờ
ki m có th tăng lên m t chút so v i cách l u ma tr n k ế ể ộ ớ ư ậ ề Code
#include<iostream>
Trang 17#include<iomanip>
#include<cstdio>
#include<set>
#include<cstring>
#define For(i,a,b) for(long i = a;i<=b;i++) typedef int Graph[10001][256]; using namespace std;
Graph aut;
char x[10001],y[100001];
int m,n, ASIZE;
string s = "";
void nhap(){
printf("Nhap x: ");
gets(x);
m = strlen(x);
printf("Nhap y: ");
gets(y);
n = strlen(y);
ASIZE = 0;
set<char> se;
for(int i = 0 ; i < m; i++)
if(se.find(x[i]) == se.end()){
se.insert(x[i]);
s +=x[i];
Trang 18} for(int i = 0 ; i < n; i++)
if(se.find(y[i]) == se.end()){
se.insert(y[i]);
s +=y[i];
ASIZE++;
} }
void preAut(char *x, int m, Graph aut){
memset(aut,0,sizeof(aut));
aut[0][x[0]] = 1;
aut[1][x[0]] = 1;
For(i,2,m){
int vt = aut[i1][x[i1]];
for(int j = 0; j < ASIZE ; j++){
aut[i][s[j]] = aut[vt][s[j]]; }
aut[i1][x[i1]] = i;
} }
void AUT(){
int state = 0;
for(int i = 0; i < n ; i++){
Trang 19if(state == m)
printf("position is %d \n", i m +1); }
}
main(){
nhap();
preAut(x,m,aut);
AUT();
}
Ki m nghi m thu t toánể ệ ậ
Input:
X = “GCAGAGAG”
Y =”GCATCGCAGAGAGTATACAGTACG”
Pha ti n x lý xây d ng DFA:ề ử ự
Trang 20at
e