1. Trang chủ
  2. » Tất cả

Báo cáo chuyên đề công nghệ phần mềm pattern searching

20 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Báo cáo chuyên đề công nghệ phần mềm Pattern Searching
Tác giả Nguyễn Duy Phương
Trường học Học viện Công nghệ Bưu chính Viễn thông
Chuyên ngành Công nghệ Thông tin
Thể loại Báo cáo môn học
Năm xuất bản 2021
Thành phố Hà Nội
Định dạng
Số trang 20
Dung lượng 803,29 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

H 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 2

Hà N i, 3/7/2021 ộ

Trang 3

Muc luc̣ ̣

I. Tim kiêm mâu t  trai qua phaì ́ ̃ ừ ́ ̉

1. Thu t toán ậ Brute­Force

2. Thu t toán ậ Knuth­Morris­Pratt

3. Thu t toán ậ Karp­ Rabin

4. Thu t toán ậ Morris­Pratt

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 ậ Boyer­Moore

2. Thu t toán ậ Turbo­ Boyer­ Moore

3. Zhu­Takaota

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 ậ Galil­Giancarlo

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 4

I. 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à n­m, 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<=n­m ; 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==m­1){

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   Knuth­Morris­Pratt

Đ 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 ự ư ậ Morris­Pratt 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 6

so 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[len­1];

} Else{

kmpNext[i] =0; 

i++;

} }

} }

Trang 7

Code  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í i­j>;ấ ẫ ở ị

       else if (i <n && X[j] != Y[i] ) {

          if (j !=0) j = kmpNext[ j­1];

}       }

}

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 8

4 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 9

S  d ng hàm bămử ụ

Đô ph c tap thuât toan O((n­m+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+m­1]) và hash(y[j+m]):   

 hash(y[j+1   j+m])= rehash(y[j], y[j+m], hash(y[j   j+m­1]). 

V i t  w có đ  dài m có hash(w) là:   ớ ừ ộ

 hash(w[0   m­1])=(w[0]*2m­1+ w[1]*2m­2+∙∙∙+ w[m­

1]*20) mod q

V i q là m t s  l n. ớ ộ ố ớ

 Sau đó rehash(a,b,h)= ((h­a*2m­1)*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+m­1]) ự ớ

v i 0<= j<=n­m. 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+m­1] ằ

Code 

void RK(char *x, int m, char *y, int n,int prime) {

Trang 10

int 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 11

Tiê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   Morris­Pratt

Đ 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 2n­1 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 15

­1

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 16

5. 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 Knuth­Morris­Pratt ậ ầ ố ậ 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[i­1][x[i­1]];   

for(int j = 0; j < ASIZE ; j++){    

aut[i][s[j]] = aut[vt][s[j]];    } 

aut[i­1][x[i­1]] = i;  

}    } 

void AUT(){  

int state = 0;  

for(int i = 0; i < n ; i++){   

Trang 19

if(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 20

at

e

Ngày đăng: 24/02/2023, 22:21

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w