[近似匹配] 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 }

 

posted on 2012-07-24 22:52  unhealthy  阅读(366)  评论(0编辑  收藏  举报