许久之前的数据结构课上就已经学过大名鼎鼎的KMP算法,可是学一次忘一次,最近又要使用这个令人头疼的算法,于是打算把他记下来。
思考这样一个问题,给定了两个字符串:X=“bacbababababcaa”,Y="ababababca"。如何来判定Y是否是X的字串?
传统的朴素匹配方法,肯定是做一次双重循环,让Y中的每个字符与X中的每个字符一一匹配,如果刚好可以匹配上,那么Y就是X的字串了。可是这种方法有着很多的不必要的比较。于是,KMP算法的思想便是跳过这些不必要的操作。
KMP的关键问题是当循环中两个串当前的字符不匹配时,下一步应该比较那个字符?这个问题事实上也是算法改进的关键问题。
由当前不匹配字符到下一个被比较字符,我们可以看作一次“跳跃”,于是我们的问题便变成了-”跳跃“的规则是什么?
为了实现这种”跳跃“,我们引入了一个next数组,他的长度为匹配串pattern的长度,数组上的每个元素代表了匹配串当前字符不匹配时应该”跳跃“后进行下一次匹配的索引。
有了这些理论基础我们便可以写出KMP算法。
伪码参考算法导论,下面贴出详细代码。
/** * KMP算法,返回第一个字串的起始位置,如果pattern非s字串返回-1 * */ int kmpMatcher(char* s, char* pattern) { int m = strlen(pattern); int n = strlen(s); int* next = new int[m]; computeNext(pattern,next,m); int q=-1; for(int i=0; i<n ; ++i){ while(q>=0 && pattern[q+1]!=s[i]){ // 不匹配情况 q=next[q]; } if(pattern[q+1]==s[i]){ // 匹配情况下,继续 q=q+1; } if(q==m-1){ return i-m+1; } } return -1; // doesn't match }
接下来就是算法中的next数组获取问题。
假设当前我们要获取pattern串中i号位置的next值,即next[i]的值。我们知道,如果要实现”跳跃“k个元素,那么pattern串中i之前的k个元素要和pattern串中的前k个元素相同,即pattern[1...k]=pattern[i-k+1...i],此时的next[i]=k。
由上述逻辑可得到代码如下:
/** * 计算next函数 * */ void computeNext(char* pattern, int* &next, int m) { // 长度必须大于0 if(m<=0){ return; } next[0]=-1; for(int i=1; i<m; i++){ int j=next[i-1]; while(j>=0 && pattern[j+1]!=pattern[i]){ j=next[j]; } if(pattern[j+1]==pattern[i]){ next[i]=j+1; } else { next[i]=j; } } }
相关推荐
cnn-matching-master源码.zip
资源来自pypi官网。 资源全名:ucla-subgraph-matching-0.0.1.tar.gz
triton-2.0.0-cp310-cp310-win_amd64.whl
在Android模拟器上安装apk的时候出现install failed no matching abis,是由于使用了native libraries 。该native libraries 不支持当前的cpu的体系结构。 解决方法: 如果是6.0系统的,请将Genymotion-ARM-...
算法设计与分析:6-Lec10-Matching.pdf
cudnn windows适合cuda11.x cudnn为8.5.0
资源分类:Python库 所属语言:Python 资源全名:awesome-pattern-matching-0.10.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
离线安装包,亲测可用
LabVIEW图像处理例程,实现从图像中自己圈出目标,程序自己学习该目标特征(颜色、形状)后,在图片上找到并定位目标
RIFT-multimodal-image-matching-main.zip
这个程序是关于现有的3G系统中,采用TDOA和pattern matching的方法实现定位的仿真程序.(the procedure is available on the 3G system, using TDOA and pattern matching method of positioning the simulation ...
字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”...许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。
注意:pip目前不支持安装3.7版本的pyaudio,故在python3.7平台上直接用pip安装pyaudio会出错,需要先下载3.7的安装包再在本地安装 这里是下载后经测试可用的 PyAudio-0.2.11-cp37-cp37m-win_amd64.whl ...
两种改进的模式识别算法应用在字符识别上,改进以后精度增加
Android Studio Chipmunk 2021.2.1(android-studio-2021.2.1.15-windows.zip)花栗鼠 适用于Windows系统: Android Studio版本排序: Electric Eel | 2022.1.1 Dolphin | 2021.3.1 Chipmunk | 2021.2.1 Bumblebee ...
Redis Desktop Manager (aka RDM) — offers you an easy-to-use GUI to access your Redis databases and perform some basic operations: View keys as a tree ...Delete keys matching glob-pattern
利用共线准相位匹配光学参量产生器的折回特性实现宽带光源的理论研究,路洋,张百钢,首次在理论上以相位匹配宽度的概念为依据,确定了利用共线准相位匹配光学参量产生器的折回特性实现宽带光源的输出带宽。...
资源来自pypi官网。 资源全名:pulpcore-client-3.14.0.dev1624419840.tar.gz
This library provides the basic routines for allocating memory, searching directories, opening and closing files, reading and writing files, string handling, pattern matching, arithmetic, and so on.
基于分割的立体匹配及算法-Segment_Based_Stereo_Matching.part1.rar Segment-Based Stereo Matching Using Belief Propogation and a Self-Adapting Dissimilarity Measure 一文及所带程序,可以实现两幅图像的...