线性表-串: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在 ...
随机推荐
- 简单的SQL Server在线查看和执行系统
在大的公司里面,往往数据库和表都非常的多,一张表的字段也是会有几十个.如果这么多的表和字段没有说明注释的话,查看起来会一头雾水,新来的或者别的部门的同事看到表和字段会完全不知道是干嘛的,只能靠名称来猜 ...
- 实时数据处理环境搭建flume+kafka+storm:2.flume 安装
1. 解压 tar -zxvf 2.配置 拷贝配置文件 :cp flume-conf.properties.template flume-conf.properties ...
- java第五课:方法
方法交换位置的三个步骤:1.把第一个盒子里的东西拿出来,放到一边2.把第二个盒子里的东西放到第一个盒子里3.捡起刚刚放到一边的东西,放到第二个盒子里 值传递:实际参数将内部保存的值,复制给方法的参数. ...
- Form表单学习网站
HTML表单 -- form标签 -- 与浏览者交互:http://www.dreamdu.com/xhtml/tag_form/
- JSON用法简介
[JSON简介] jsoncpp 主要包含三种类型的 class:Value.Reader.Writer.jsoncpp 中所有对象.类名都在 namespace Json 中,包含 json.h 即 ...
- 【leetcode】Dungeon Game (middle)
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...
- HDU 1031 Design T-Shirt
http://acm.hdu.edu.cn/showproblem.php?pid=1031 题意 :n个人,每个人对m件衣服打分,每个人对第 i 件衣服的打分要加起来,选取和前 k 高的输出他们的编 ...
- JavaScript 三种创建对象的方法
JavaScript中对象的创建有以下几种方式: (1)使用内置对象 (2)使用JSON符号 (3)自定义对象构造 一.使用内置对象 JavaScript可用的内置对象可分为两种: 1,JavaScr ...
- [itint5]区间相交
http://www.itint5.com/oj/#14 要记录原来的索引,所以用了额外的空间,新生成一个结构.如果要省空间,可以用指针来排序,最后拿指针减去索引0的位置就是index,见:http: ...
- Photoshop CS4 启动弹出许可协议
win7:删除 1.C:\Users\All Users\FLEXnet\adobe_00080000_tsf.data WinXP:(c:/Documents and Settings/All Us ...