线性表-串:KMP模式匹配算法

时间:2021-08-15 03:22:08

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

二、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. &lbrack;从今天开始修炼数据结构&rsqb;串、KMP模式匹配算法

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

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

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

  6. 大话数据结构&lpar;8&rpar; 串的模式匹配算法(朴素、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. WPF 自定义雷达图

    自定义雷达图表如下: Git下载地址:https://github.com/Kybs0/RadarChartControl 1.创建UserControl,名为“RadarChartControl” ...

  2. 【BZOJ1060】&lbrack;ZJOI2007&rsqb;时态同步 树形DP

    [BZOJ1060][ZJOI2007]时态同步 Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3-.进行标号.电路 ...

  3. Hosts文件是什么?

    Hosts文件主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定.可以用文本文件打开!当用户在浏览器中输入一个需要登录的 网址时,系统会首先自动从Hosts文件中寻找对应的IP ...

  4. webdriver&lpar;python&rpar;学习笔记六——操作测试对象

    定位到具体对象后,就需要对其进行操作,比如点击.输入内容等. 一般来说,webdriver中比较常用的操作对象的方法有下面几个 click 点击对象 send_keys 在对象上模拟按键输入 clea ...

  5. 蓝桥杯 入门训练 Fibonacci数列

      入门训练 Fibonacci数列   时间限制:1.0s   内存限制:256.0MB        问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. ...

  6. Task-based Asynchronous Pattern &lpar;TAP&rpar;

    The Task-based Asynchronous Pattern (TAP) is based on the System.Threading.Tasks.Task and System.Thr ...

  7. Request 地址栏传值

    request页面 protected void btnSearch_Click(object sender, EventArgs e) { Response.Redirect("Reque ...

  8. java 简单程序

    public class a{ public static void main(String[] args) { System.out.println("Hello world") ...

  9. updateXML 注入 python 脚本

    用SLQMAP来跑updateXML注入发现拦截关键字,然后内联注入能绕,最后修改halfversionedmorekeywords.py脚本,结果SQLMAP还是跑不出来.>_< hal ...

  10. python dns