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

二、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. VC++创建、调用dll的方法步骤

    文章来源:http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有 ...

  2. [转载]MongoDB设置访问权限、设置用户

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...

  3. 注入攻击-SQL注入和代码注入

    注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...

  4. 分析函数调用关系图(call graph)的几种方法

    绘制函数调用关系图对理解大型程序大有帮助.我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历.如果运气好一点,借助调试器的单步跟踪功能和call sta ...

  5. HDU2896+AC自动机

    ac自动机 模板题 /* */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include&l ...

  6. Tomcat Java内存溢出 PermGen space 解决方案

    -Xms300m -Xmx400m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256M

  7. 【mysql的设计与优化专题(1)】ER图,数据建模与数据字典

    需求分析是做项目中的极为重要的一环,而作为整个项目中的'血液'--数据,更是重中之重.viso,workbench,phpmyadmin等软件可以帮我们更好的处理数据分析问题. ER图 E-R方法是& ...

  8. Ubuntu 12.04安装字体

    http://www.2cto.com/os/201210/160645.html 安装方法,终端输入:  $ sudo thunar /usr/share/fonts/truetype  待ture ...

  9. nginx做负载均衡配置文件

    nginx做负载均衡是在反向代理的基础上做的,代码如下: ## Basic reverse proxy server ## ## Apache backend for www.baidu.com ## ...

  10. Android:android:gravity 和 android:layout_Gravity 的区别

    LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity. android:gravity 属性是对该view中内容的限定 andro ...