线性表-串: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在 ...
随机推荐
- why you write code so slow.
今天我们要写一个日历表,用以存储所有的节假日. 虽然这个表设计的并不是很妙.但是将就着继续了. 让小弟把该表数据初始化3-5年的,结果一上午还没有出来,着急了,自己写了一个初始化的工具. 分享出来. ...
- NOSQL Mongo入门学习笔记 - C++连接Mongodb(三)
OS环境: Centos 7.1 release X86_64 编译环境: G++ 4.8.3 已经成功搭建好了Mongodb,也初步在命令行中的查询与写入数据的基本方法,现在通过C++来连接Mong ...
- Recommender Systems协同过滤
第一部分是学习ID3时候积累的. 一.以前写的基础知识 1.信息:是用来消除不确定性的度量,信息量的大小,由所消除的不确定性的大小来计量(香农). 2.由于不确定性是由随机性引起的,所以用概率来描述和 ...
- uva 10271
DP 状态转移方程 dp[i][j] = min(dp[i-1][j], dp[i-2][j-1] + w)) dp[i][j] 指的是前i个筷子组成j组所花费的最小值 考虑第i个筷子是否参与第j组 ...
- 看几道JQuery试题后总结(下篇)
感谢圆友的提醒 昨天下午完成了9道试题中的前4道,之后好多园友存在些疑惑和建议,在这里我一并说一下吧.首先对于昨天第一题可能存在误导,在JQuery中并没有innerHTML这个属性,不过我们可以将J ...
- 极客范:如何使用 Cloud Insight 来监控闭路电视?
最近新上线支持 Windows 系统及其组件 监控功能的 Cloud Insight,在系统监控领域基本囊括了对所有主流和部分非主流平台的支持.但是这还不够,Cloud Insight 可不仅仅是一个 ...
- 跟随屏幕滚动层、遮罩层、获取Div相对定位、整个屏幕、html文档的jquery基本操作
一.层跟随屏幕滚动 <div style="width:120px;height:120px;border:1px solid red; position:absolute; left ...
- hdu 3853 LOOPS 概率DP
简单的概率DP入门题 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include ...
- windows中断与共享的连接(samba)
问题:window下当成功登录到samba服务器上的共享的目录的时候,若要是再系想登录此服务器上另外一个共享目录时,会弹出登录窗口. 但是不管输入的用户名和密码对错都会提示. “不允许一个用户使用一个 ...
- Android:控件ListView列表项与适配器结合使用
Listview是用来展示一些重复性的数据用的,比如一些列表集合数据展示到手机,需要适配器作为载体获取数据,最后将数据填充到布局. ListView里面的每个子项Item可以使一个字符串,也可以是一个 ...