首页 > 编程语言 >KMP算法(串的模式匹配算法)(未完待续......)

KMP算法(串的模式匹配算法)(未完待续......)

时间:2023-04-10 20:27:27浏览次数:51  
标签:主串 匹配 字符 后缀 ...... next 未完待续 算法

KMP算法的实现

1.基本原理

  在暴力破解算法(BF算法)中,模式串需要一个一个来跟主串进行对比,若有一个不相同,则主串前进一位,继续从头开始进行比较,这样比较的最坏时间复杂度为O(mn),例:‘aaaaaaaaab’和‘aaab’,需要比较到最后一个才能成功,效率太过低下。

  KMP算法的原理是,找到模式串的最大相等前后缀(所以与主串无关),再次进行比较时,相等的部分就可以跳过比较,从下一位开始进行比较。(如下图4.4)

2.部分匹配值 (参考:阮一峰的网络日志

  

   部分匹配值即串的最大前后缀个数

  部分匹配值跟next数组是不同的,部分匹配值是包含本元素所组成的字符串的最大前后缀个数,例:‘ABCDA’的最大前后缀个数为1,所以上表中第五个A的部分匹配值是1。

  (已匹配正确的字符 - 最后一个匹配正确的字符的部分匹配值)

例:

  

  

  

3.next数组

  

  因为每次匹配错误时,都要去寻找前一位的部分匹配值,所以,为了方便,将部分匹配表全部进行右移即可得到

  

     此时每一位对应的即是前一位的部分匹配值,所以如果当前字符匹配错误,直接调用当前的next[j]即可。

   上式就变为了:

    

    

    为了使公式更加简洁,计算简单,将next数组整体加一得到: 

   

    next[j]的含义是:在子串的第j个字符与主串发生失配时,则跳到子串的next[j]位置重新与主串当前位置进行比较。

     所以此时若失配,子串的比较指针回退到 j = next[j]

4.next数组的计算

   

   (1)当模式串第一个位置就失配时,next[1]=0,即将模式串整体向右移一位。

   (2)当模式串已匹配相等序列中不存在满足上述条件的子串时,应该将模式串右移j-1位,让主串第i个字符和模式串第一个字符进行比较。

    综上得到next函数的公式:

             

重点:手动求next函数

    

    next[j+1]中存储的是前面的字符串的部分匹配值(最长前后缀)+1

    所以若P(k)=P(j),则next[j+1]=next[j]+1

尚未搞懂:

    

  总结next数组的求法:前两位是固定的,分别是0和1,后边的求法:假设模式串为‘abcdacd’,则next[3]=‘ab’的最大前后缀大小+1,next[4]=‘abc’的最大前后缀大小+1,......

5.KMP算法的进一步优化(nextval())

  原理:倘若模式串中失配的字符与他next[j]所指向的字符相同,则会进行一次无意义的匹配,所以应继续寻找他next[j]指向的字符的next[j]值,如果还是跟失配的字符相等就继续寻找,一直到nextval[j]=0

  

参考视频:

        <iframe allowfullscreen="allowfullscreen" frameborder="no" height="450" scrolling="no" src="//player.bilibili.com/player.html?aid=642197522&bvid=BV1AY4y157yL&cid=744834924&page=1" style="width: 900px; height: 450px" width="900"> </iframe>

标签:主串,匹配,字符,后缀,......,next,未完待续,算法
From: https://www.cnblogs.com/ryuichi-ssk/p/17294201.html

相关文章

  • 基于FastICA算法的混合信号解混合信号恢复仿真
    1.算法描述       独立成分分析(IndependentComponentAnalysis,ICA)是近年来提出的非常有效的数据分析工具,它主要用来从混合数据中提取出原始的独立信号。它作为信号分离的一种有效方法而受到广泛的关注。近几年出现了一种快速ICA算法(FastICA),该算法是基于定点递推算法......
  • R语言关联规则挖掘apriori算法挖掘评估汽车性能数据
    全文链接:http://tecdat.cn/?p=32092原文出处:拓端数据部落公众号我们一般把一件事情发生,对另一件事情也会产生影响的关系叫做关联。而关联分析就是在大量数据中发现项集之间有趣的关联和相关联系(形如“由于某些事件的发生而引起另外一些事件的发生”)。我们的生活中有许多关联,一......
  • opencv-python 4.16. 基于GrabCut算法的交互式前景提取
    理论GrabCut算法由英国剑桥微软研究院的CarstenRother,VladimirKolmogorov和AndrewBlake设计。在他们的论文:"GrabCut":interactiveforegroundextractionusingiteratedgraphcuts中提出了一种基于最小用户交互的前景提取算法,其结果为GrabCut。从用户的角度来看,它是如何工......
  • 关于滑动窗口算法的应用场景
    算法原理滑动窗口算法是一种基于双指针(又称滑动窗口)的算法,是一种常用的数据处理算法,通常用于解决数组或字符串中的子数组或子串问题。滑动窗口算法的基本思想是使用两个指针left和right来定义一个窗口,窗口内包含满足特定条件的元素子序列,然后不断移动指针left和right来滑动窗口,......
  • 【贪心算法】NO134 加油站
    134.加油站在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以绕环路行驶一周,则返......
  • 2023-04-09 有向图及相关算法
    有向图及相关算法1有向图的实现有向图的的应用场景社交网络中的关注互联网连接程序模块的引用任务调度学习计划食物链论文引用无向图是特殊的有向图,即每条边都是双向的改进Graph和WeightedGraph类使之支持有向图Graph类的改动WeightedGraph类的改动2有向图算......
  • 优先级队列PriorityQueue在算法问题中的使用
    文章目录优先级队列介绍与优先级队列有关的习题[179.最大数][918.环形子数组的最大和][1094.拼车][264.丑数II]前k个出现频率最高的数字用优先级队列合并k个有序链表滑动窗口的最大值其他:对二维数组自定义排序优先级队列介绍优先队列一般基于二叉堆实现,二叉堆:堆的根节点的优......
  • 算法类问题
    木棒三角形(枚举)#include<iostream>#include<stdlib.h>usingnamespacestd;intmain()//木棒三角形有n根木棍挑出其中三根构成直角三角形输出面积最大的三角形面积输入n再输入每根三角形长度,n<100{ intn;//输入n根木棍再分别输入每根木棍的长度限制了n数量小于100 i......
  • AES算法
     (一)设计思路(可包含部分关键代码说明)  /*通过密钥计算规则计算余下数组         *         *1.如果i不是4的倍数,那么第i列由如下等式确定:         *W[i]=W[i-4]⨁W[i-1]         *2.如果i是4的倍数,那么第i列由如下等式确定:    ......
  • 几种常用的Java 算法
    packagejsh.mg.msg.service.msg.test;importjava.util.Arrays;importstaticjava.util.Arrays.binarySearch;/****几种常用的Java算法*/publicclassTestClass{/****二分查找算法*/publicstaticintbinarySearch(int[]arr,inttarge......