1 / 3
文档名称:

数据结构模式匹配算法.docx

格式:docx   大小:57KB   页数:3页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数据结构模式匹配算法.docx

上传人:xiaobaizhua 2022/6/17 文件大小:57 KB

下载得到文件列表

数据结构模式匹配算法.docx

相关文档

文档介绍

文档介绍:记得大学时自己也总结出了这种算法的,手动计算,数据结构的书都丢了,还好在网上找会了同样的算法 特记下:
int get_nextval(SString T,int &nextval[ ]){
//求模式串T的next函数修正值并存入数组应的值与第五位相同。
6•计算第七位的时候,看第六位c的next值,为3,则把c和3对应的a进行比较,不同,则再把 第3位a的next
值1对应的a与第六位c比较,仍然不同,则第七位的next值为1。
7•计算第八位的时候,看第七位a的next值,为1,则把a和1对应的a进行比较,相同,则第八 位c的next值为第七位a的next值加上1,为2,因为是在第七位和实现了其next值对应的值与第七位相同。
在计算nex tval之前要先弄明白,nex tval是为了弥补next函数在某些情况下的缺陷而产生的,例如 主串为“aaabaaaab”、模式串为“aaaab”那么,比较的时候就会发生一些浪费的情况:比较到主串以及模式串 的第四位时,发现其值并不相等,据我们观察,我们可以直接从主串的第五位开始与模式串进行比较,而事实上, 却进行了几次多余的比较。使用nextval可以去除那些不必要的比较次数。
求nextva 1数组值有两种方法,一种是不依赖next数组值直接用观察法求得,一种方法是根据next 数组值进行推理,两种方法均可使用,视更喜欢哪种方法而定。
我们使用例子“ aaaab ”来考查第一种方法
1•试想,在进行模式匹配的过程中,将模式串“ aaaab ”与主串进行匹配的时候,如果第一位就没有吻 合,即第一位就不是a,那么不用比较了,赶快挪到主串的下一位继续与模式串的第一位进行比较吧,这时,模 式串并没有发生偏移,那么,模式串第一位a的nextval值为0。
如果在匹配过程中,到第二位才发生不匹配现象,那么主串的第一位必定是a,而第二位必定不为a, 既然知道第二位一定不为a,那么主串的第一、二两位就没有再进行比较的必要,直接跳到第三位来与模式串的 第一位进行比较吧,同样,模式串也没有发生偏移,第二位的nex tv al值仍然为0。
第三位、第四位类似2的过程,均为0。
4•如果在匹配过程中,直到第五位才发生不匹配现象,那么主串的第一位到第四位必定为a,并且第 五位必定不为b,可是第五位仍然有可能等于a。如果万一第五位为a,那么既然前面四位均为a,所以,只要第 六位为b,第一个字符串就匹配成功了。所以,现在的情况下,就是看第五位究竟是不是a了。所以发生了下面 的比较:
1
2
3
4
5
6
a
a
a
a
*
*
a
a
a
a
b
a
a
a
a
b
前面的三个a都不需要进行比较,只要确定主串中不等于b的那个位是否为a,即可以进行如下的比 较:如果为a,则继续比较主串后面一位是否为b;如果不为a,则此次比较结束,继续将模式串的第一位去与主 串的下一位进行比较。由此看来,在模式串的第五位上,进行的比较偏移了4位(不进行偏移,直接比较下一位 为0),故第五位b的nex tv al值为4。
我们可以利用第一个例子“abaabcac”对这种方法进行验证。
a的nextval值为0,因为如果主串的第一位不是a,那么没有再比较下去的必要,直