字符串匹配-BNDM算法

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、代码
 
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,结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值