[近似匹配] BPD算法
BPD算法是对角式位并行算法,我是真没搞懂这个算法的原理是什么。但是根据伪代码我写出来了BPD算法的c++版实现。当容错率在0.1以上的时候,用BPD算法的效率要更高一些。
1 void BPD(char *p, char *t,int k) 2 { 3 int Pstr_len,Tstr_len,j,i,pos,D,x; 4 int B[128],BB[128]; 5 Pstr_len = strlen(p); 6 Tstr_len = strlen(t); 7 8 //Preprocessing 9 for(j=0;j<128;j++) 10 { 11 B[j] = ~0; 12 } 13 for(j=0;j<Pstr_len;j++) 14 { 15 B[p[j]] = B[p[j]] & (~(1<<j)); 16 } 17 for(j=0;j<128;j++) 18 { 19 BB[j] = 0; 20 for(i=0;i<Pstr_len-k;i++) 21 { 22 BB[j] = (BB[j]) | ((B[j]>>i) & (int) ( pow(2.0,k+1)-1)); 23 BB[j] = BB[j]<<(k+2); 24 } 25 BB[j] = BB[j] >> (k+2); 26 } 27 28 //Searching 29 int mask1,mask2,mask3; 30 mask1 = mask2 = mask3 =0; 31 D = 0; 32 for(i=0;i<Pstr_len-k;i++) 33 { 34 D = D | (int)(pow(2.0,k+1)-1); 35 D = D << (k+2); 36 } 37 D = D >> (k+2); 38 mask1 = D; 39 for(i=0;i<Pstr_len-k;i++) 40 { 41 mask2 = mask2 | 1; 42 mask2 = mask2 << (k+2); 43 } 44 mask2 = mask2 >> (k+2); 45 for(i=0;i<Pstr_len-k-1;i++) 46 { 47 mask3 = mask3 | 1; 48 mask3 = mask3 << (k+2); 49 } 50 mask3 = mask3 |(int) (pow(2.0,k+1)-1); 51 for(pos = 0;pos<Tstr_len;pos++) 52 { 53 x = (D>>(k+2)) | BB[t[pos]]; 54 D = ((D<<1) | mask2 ) & ((D<<(k+3))|mask3) & (((x + mask2)^x)>>1) & mask1; 55 if((D & (1<<k)) == 0) 56 { 57 cout<<"matching at "<< pos<<endl; 58 D = D | (int) ( pow(2.0,k+1)) ; 59 } 60 } 61 }