字符串匹配-BNDM算法

时间:2021-10-09 21:26:36

1、BNDM算法与BDM相似,它维护一个集合,即位向量D=Dm....D1,用这个位向量的位记录u在P的反转串中的所有出现位置(因为D的构造是从Dm到D1,不是从D1到Dm,所以用反转),用这种并行算法代替后缀自动机来识别模式串的子串。如果子串Pj....P(j+|u|+1)等于u,那么D的第m-j+1位是1,表示p的位置j是一个活动状态。

2、当读入一个新的文本字符σ时,要从D更新到D',D'的活动状态j对应于σu在模式串的起始位置:
1)u出现在模式串的位置j+1,D的j+1位活动
2)σ在模式串的j位出现.
3、BNDM方法预先计算表B,B的每个元素代表了每个字符的位向量。
D的更新方式分以下2步:
1)D1'<-D&B[σ]
2)D'<-D1<<1
以上方法先检查匹配,再移位,因为D预置为每位全是1
3、代码
  字符串匹配-BNDM算法
4、例子
模式串P=ATATA,文本串=AGATACGATATATAC
1)P的反转串=ATATA
2)表B
A :10101 (如右边的A在右边起第1位,所以在最左边的第1位)
T :01010
* :00000
D = 11111
3)在窗口中从后向前读入文本中的字符
[AGATA]CGATATATAC:
(last=5,j>0)
11111&10101->10101
(Dm=1=>last=4,j>0)
01010&01010->01010
10100&10101->10100
(Dm=1=>last=2,j>0)
01000&00000->00000
4)D全0=>pos=pos+last=pos+2,D全置1
AG[ATACG]ATATATAC:
(last=5,j>0)
11111&00000->00000
5)D全0=>pos=pos+last=pos+5,D全置1
AGATACG[ATATA]TAC:
(last=5,j>0)
11111&10101->10101
(Dm=1=>last=4,j>0)
01010&01010->01010
10100&10101->10100
(Dm=1=>last=2,j>0)
01000&01010->01000
10000&10101->10000
(Dm=1,j=0=>匹配成功)
6)D全0=>pos=pos+last=pos+2,D全置1
AGATACGAT[ATATA]C:
(last=5,j>0)
11111&10101->10101
(last=4,j>0)
01010&01010->01010
10100&10101->10100
(last=2,j>0)
010000&01010->01000
10000&10101->10000
(Dm=1,j=0=>匹配成功)
7)pos>n-m,结束