1 / 3
文档名称:

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

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

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

分享

预览

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

上传人:zxwziyou8 2022/3/15 文件大小:50 KB

下载得到文件列表

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

文档介绍

文档介绍:记得大学时自己也总结出了这种算法的,手动计算,数据结构的书都丢了,还好在网上找会了同样的算法
特记下:intget_nextval(SStringT,int &nextval[ ]){
           //求模式串T的next函数在进行模式匹配的过程中,将模式串“aaaab”与主串进行匹配的时候,如果第一位就没有吻合,即第一位就不是a,那么不用比较了,赶快挪到主串的下一位继续与模式串的第一位进行比较吧,这时,模式串并没有发生偏移,那么,模式串第一位a的nextval值为0。
      ,到第二位才发生不匹配现象,那么主串的第一位必定是a,而第二位必定不为a,既然知道第二位一定不为a,那么主串的第一、二两位就没有再进行比较的必要,直接跳到第三位来与模式串的第一位进行比较吧,同样,模式串也没有发生偏移,第二位的nextval值仍然为0。
       、第四位类似2的过程,均为0。      ,直到第五位才发生不匹配现象,那么主串的第一位到第四位必定为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的nextval值为4。
       我们可以利用第一个例子“abaabcac”对这种方法进行验证。
      a的nextval值为0,因为如果主串的第一位不是a,那么没有再比较下去的必要,直接比较主串的第二位是否为a。如果比较到主串的第二位才发生错误,则主串第一位肯定为a,第二位肯定不为b,此时不能直接跳到第三位进行比较,因为第二位还可能是a,所以对主串的第二位再进行一次比较,偏移了1位,故模式串第二位的nextval值为1。以此类推,nextval值分别为:01021302。其中第六位的nextval之所以为3,是因为,如果主串比较到第六位才发生不匹配现象,那么主串的前五位必定为“abaab”且第六位必定不是“c”,但第六位如果为“a”的话,那么我们就可以从模式串的第四位继续比较下去。所以,这次比较为:
1
2
3
4
5
6
7
8
9
10
11
12
a
b
a
a
b
*
*
*
*
*
*
*
1 x! e6 O. a. d4 M( W7 T: N, Q
- b( z1 e, d) O5 X! s4 H0 ]+ n
a
b
a
a
b
c
a
c
, T" x+ L& H% S
       而不是:
1
2
3
4
5
6
7
8