线性表-串:KMP模式匹配算法
一、简单模式匹配算法(略,逐字符比较即可)
二、KMP模式匹配算法
next数组:j为字符序号,从1开始。
(1)当j=1时,next=0;
(2)当存在前缀=后缀情况,next=相同字符数+1;
(3)当前缀 != 后缀且j != 1时,next=1。
如下:
abcdex
next=011111
abcabx
next=011123
ababaaaba
next=011234223
说明:0位置为情况1;
1、2位置为情况3;
3-5位置一直有前缀对称,所以一直累加;
6位置前缀不对称,j=next[ j ]找对称子串开始位置;如果没有继续j= next[ j ]直到 j = 0,next为0;
此处 i = 6, j = 4;第一次找: j = next[4] = 3, T[3] != T[6] ,没找到;第二次找: j= next[ 3 ] =1, T[2] == T[6], 找到累加 j+1 =2;
7位置同上;
8位置在7位置基础累加得到。
aaaaaaaab
next=012345678
说明:0位置为情况1;
1位置为情况3;
2-8位置一直有前缀对称,所以一直累加。
代码如下:
1: void get_next(char T[], int * next)
2: {
3: int i = 1;
4: int j = 0;
5:
6: next[1] = 0;//条件(1)
7:
8: while(i < getlength(T))
9: {
10: if(j == 0 || T[i] == T[j])
11: {
12: ++j;
13: ++i;
14: next[i] = j;//如果前缀一直有对称,则对称性累加
15: }
16: else
17: {
18: j = next[j];//如果前缀不对称,则从对称性开始的地方开始累加;
19: //如果仍然不对称,则继续从子子对称开始的地方开始累加;
20: }
21: }
22: }
23:
三、KMP模式匹配算法改进
nextval数组:j为字符序号,从1开始。
(1)当j=1时,nextval=0;
(2)当存在前缀=后缀情况,nextval=相同字符数+1;如果该字符在后缀中,则nextval = 前缀中该字符的nextval值。
(3)当前缀 != 后缀且j != 1时,nextval=1。
如下:
ababaaaba
next= 011234223
nextval=010104210
aaaaaaaab
next= 012345678
nextval=000000008
ababaaaba
next= 011234223
nextval=010104210
代码如下:
1: void get_nextval(char T[], int * nextval)
2: {
3: int i = 1;
4: int j = 0;
5:
6: nextval[1] = 0;//条件(1)
7:
8: while(i < getlength(T))
9: {
10: if(j == 0 || T[i] == T[j])
11: {
12: ++j;
13: ++i;
14: if(T[i] != T[j])
15: nextval[i] = j;//条件(3),累加
16: else
17: nextval[i] = nextval[j];//条件(2)</strong>
18: }
19: else
20: {
21: j = nextval[j];//如果前缀不对称,则从对称性开始的地方开始累加;
22: //如果仍然不对称,则继续从子子对称开始的地方开始累加;
23: }
24: }
25:
26: }
27:
线性表-串:KMP模式匹配算法的更多相关文章
- 数据结构(三)串---KMP模式匹配算法
(一)定义 由于BF模式匹配算法的低效(有太多不必要的回溯和匹配),于是某三个前辈发表了一个模式匹配算法,可以大大避免重复遍历的情况,称之为克努特-莫里斯-普拉特算法,简称KMP算法 (二)KMP算法 ...
- 数据结构(三)串---KMP模式匹配算法实现及优化
KMP算法实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include ...
- 数据结构(三)串---KMP模式匹配算法之获取next数组
(一)获取模式串T的next数组值 1.回顾 我们所知道的KMP算法next数组的作用 next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目 ...
- [从今天开始修炼数据结构]串、KMP模式匹配算法
[从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...
- 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...
- 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
--喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...
- 《数据结构》之串的模式匹配算法——KMP算法
//串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 【算法】串的模式匹配算法(KMP)
串的模式匹配算法 问题: 求子串位置的定位函数如何写? int index(SString S,SString T,int pos); 给定串S,子串T,问T在 ...
随机推荐
- 1061: [Noi2008]志愿者招募 - BZOJ
Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...
- No qualifying bean of type [com.shyy.web.service.TreeMapper] found for dependency
异常信息: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.sp ...
- 如何使用PHP实现一个WebService
WSDL WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问.这种文 ...
- 在NEXUS中加入自己定义的第三方PROXIES代理库
就是要等会耐心,更新好之后,才能在PUBLIC库里进行操作. 下图是JBOSS的
- 推荐牛X的一本JS书
主要是看阮一峰的教程时,他参考书目里有这一本中文的, 找来一看,果然高.. 练习一下. function Base(name) { this.name = name; this.getName = f ...
- mysql查看表的结构
①mysql > show create table 表名; ②mysql > desc 表名; ③mysql > describe 表名;
- ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置
原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...
- SVN使用方法总结
SVN使用方法 SVN版本管理模式:http://www.cnblogs.com/newstar/archive/2011/01/04/svn.html (集中式-trunk和分散式-branch ...
- Flash Builder 4.6 基本设置
Flash Builder 4.6 字体修改 打开Flash Builder4.6 -> 窗口 -> 首选项 -> 左边目录选择常规 -> 外观 -> 颜色和字体 -&g ...
- 【HDOJ】1448 The Treasure
这就是个简单的bfs.真没什么好说的,三维的状态就可以了.每次预处理一下monster的位置,然后再恢复. /* 1924 */ #include <iostream> #include ...