一、简单模式匹配算法(略,逐字符比较即可)

二、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模式匹配算法的更多相关文章

  1. 数据结构(三)串---KMP模式匹配算法

    (一)定义 由于BF模式匹配算法的低效(有太多不必要的回溯和匹配),于是某三个前辈发表了一个模式匹配算法,可以大大避免重复遍历的情况,称之为克努特-莫里斯-普拉特算法,简称KMP算法 (二)KMP算法 ...

  2. 数据结构(三)串---KMP模式匹配算法实现及优化

    KMP算法实现 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include ...

  3. 数据结构(三)串---KMP模式匹配算法之获取next数组

    (一)获取模式串T的next数组值 1.回顾 我们所知道的KMP算法next数组的作用 next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目 ...

  4. [从今天开始修炼数据结构]串、KMP模式匹配算法

    [从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...

  5. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...

  6. 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    --喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...

  7. 《数据结构》之串的模式匹配算法——KMP算法

    //串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...

  8. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

  9. 【算法】串的模式匹配算法(KMP)

    串的模式匹配算法     问题:         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);         给定串S,子串T,问T在 ...

随机推荐

  1. 1061: [Noi2008]志愿者招募 - BZOJ

    Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...

  2. 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 ...

  3. 如何使用PHP实现一个WebService

    WSDL WSDL(网络服务描述语言,Web Services Description Language)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问.这种文 ...

  4. 在NEXUS中加入自己定义的第三方PROXIES代理库

    就是要等会耐心,更新好之后,才能在PUBLIC库里进行操作. 下图是JBOSS的

  5. 推荐牛X的一本JS书

    主要是看阮一峰的教程时,他参考书目里有这一本中文的, 找来一看,果然高.. 练习一下. function Base(name) { this.name = name; this.getName = f ...

  6. mysql查看表的结构

    ①mysql > show create table 表名; ②mysql > desc 表名; ③mysql > describe 表名;

  7. ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置

    原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...

  8. SVN使用方法总结

    SVN使用方法   SVN版本管理模式:http://www.cnblogs.com/newstar/archive/2011/01/04/svn.html (集中式-trunk和分散式-branch ...

  9. Flash Builder 4.6 基本设置

    Flash Builder 4.6 字体修改 打开Flash Builder4.6 -> 窗口 -> 首选项 -> 左边目录选择常规 -> 外观 -> 颜色和字体 -&g ...

  10. 【HDOJ】1448 The Treasure

    这就是个简单的bfs.真没什么好说的,三维的状态就可以了.每次预处理一下monster的位置,然后再恢复. /* 1924 */ #include <iostream> #include ...