数据结构 串的模式匹配

实验三

1. 实验目的:

掌握串的模式匹配算法(即BF和KMP算法)设计

2. 仪器与材料:

装有Windows操作系统和VC++6.0编程环境的PC机一台。

3. 实验内容:

编写一个程序exp4-3.cpp,实现顺序串的各种模式匹配运算,并在此基础上完成以下功能

  1. 建立目标串s=”abcabcdabcdeabcdefabcdefg”和模式串t=”abcdeabcdefab”。
  2. 采用简单匹配算法求t在s中的位置
  3. 采用KMP算法求t在s中的位置

4. 实验记录:

    数据结构设计:

BF算法比较粗暴直观,它直接从第1字符开始一个一个字符地比较主串和子串的字符,如果不一样就回溯到开始的第2个字符(也就是i-j+2)开始比较,而子串是回到其第1个字符(即j=1),但其时间复杂度比较高。

KMP算法:开始对主串和子串进行匹配,当匹配过程中产生“失配”时,指针i不变,指针j退回至next[j]所指示位置重新进行比较,如果不匹配,则指针退回至next[next[j]]进行对比...直到指针j退至0时,指针i和指针j便需同时增1,也就是说如果主串的第i个字符和子串的第1个字符不等,则从主串的第i+1个字符起重新匹配。综上所述,可以发现KMP的关键点是next[j]的获取。

    函数功能:

 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。

KMP算法在匹配过程中主串中的第i个字符与模式中的第j个字符比较不等时(S[i]!=T[j]),仅需要将模式串向右滑动至模式中的第k个字符,与主串中的第i个字符对齐,此时的模式中的k-1个子串必然和主串满足关系式1,在从j=k位置依次与i对应位置的元素进行比较。(j回溯的位置即为k  j=k)

令next[j]=k为当在第j位比较失败时,模式中重新与此该主串中字符比较的字符位置。(模式串向右移动的位数为:已匹配的字符数-失配字符上一位字符所对应的前后缀公共元素的最大长度)

5. 实验体会:

KMP之所以比BF算法简单,是因为引入了一个next数组,降低查询时间,相比而言,增加了空间,通过数组的下标快速匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值