数据结构学习:KMP模式匹配算法
有关KMP的算法具体的实现网上有很多,不具体阐述。这里附上c的实现。
谈谈我自己的理解。KMP相较于朴素算法,其主要目的是为了使主串中的遍历参数i不回溯,而直接改变目标串中的遍历参数j。
比如说要是目标串中没有一个重复的字符,那么当遍历到主串中的i与目标串的j不想等时,只需要把目标串的遍历参数j归1(在这里字符串的首字符用来保存该串的长度),从主串中i的位置从头比对目标串。然后继续向后比较、遍历主串即可。
但是对于大部分的目标串,并不是所有的字符都不同。那么就引入了重复度这个概念。创建next数组,用next数组保存重复度。重复度即为从头开始,第一次出现相同的字符的位置。(如 abaabx 中,第6位的x之前为ab,第一次出现ab且和现在不同的位置是3,那么我就直接回到3继续对比)
遍历到主串,发生不相等时间,目标串中的j自动匹配到next数组中保存的位置,从而主串参数不回溯的目的。
网上还有很多人说strstr比自己写的kmp要快,我觉得大概是strstr其实也用了kmp,但是语句更精简,直接用汇编语言,底层优化之类的(blablabla也是瞎说没有考证)。总之kmp的自动匹配的思维,是非常具有启发意义的。(当然还牵扯到算重复度的思维)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1000
typedef char* string;
void get_String(string a){
string b = (string) malloc (sizeof(char)*N);
gets(b);
a[0] = strlen(b),a[1] = '\0';
strcat( a , b );
}
void get_next(string T,int *next){
int i = 1,j = 0;
next[1] = 0;
while(i<(int)T[0]){
if(j == 0||T[i] == T[j]){
++i,++j;
if(T[i] != T[j]) next[i] = j;
else next[i] = next[j];
}else j = next[j];
}
}
int index_KMP(string S,string T,int pos){
int i = pos,j = 1,*next;
next = (int *)malloc(sizeof(int)*strlen(T));
get_next(T,next);
while(i <= S[0]&&j <= T[0]){
if(j == 0||S[i] == T[j]) i++,j++;
else j = next[j];
}
if(j >T[0]) return i - T[0];
else return 0;
}
int main(){
string S,T;
int ans;
//初始化字符串S 和 T
S = (string) malloc (sizeof(char)*N);
T = (string) malloc (sizeof(char)*N);
//输入串S 和 T
//其中S[0]和T[0]分别保存了该串中一共有多少个字符
get_String(S);
get_String(T);
ans = index_KMP(S,T,1);
if(ans!=0) printf("目标串在母串中出现的位置是 %d \n",ans);
else printf("子串不在目标串中出现\n");
return 0;
}
数据结构学习:KMP模式匹配算法的更多相关文章
- 数据结构学习之字符串匹配算法(BF||KMP)
数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 编写出BF暴力匹配.KM ...
- [从今天开始修炼数据结构]串、KMP模式匹配算法
[从今天开始修炼数据结构]基本概念 [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList [从今天开始修炼数据结构]栈.斐波那契数列.逆波兰四则运 ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
- 串、KMP模式匹配算法
串是由0个或者多个字符组成的有限序列,又名叫字符串. 串的比较: 串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号. 计算机中常用的ASCII编码,由8位二进制 ...
- KMP模式匹配算法
KMP模式匹配算法 相信很多人对于这个还有点不了解,或者说是不懂,下面,通过一道题,来解决软考中的这个问题! 正题: aaabaaa,其next函数值为多少? 对于这个问题,我们应该怎么做呢? 1.整 ...
- 线性表-串:KMP模式匹配算法
一.简单模式匹配算法(略,逐字符比较即可) 二.KMP模式匹配算法 next数组:j为字符序号,从1开始. (1)当j=1时,next=0: (2)当存在前缀=后缀情况,next=相同字符数+1: ( ...
- C++编程练习(7)----“KMP模式匹配算法“字符串匹配
子串在主串中的定位操作通常称做串的模式匹配. KMP模式匹配算法实现: /* Index_KMP.h头文件 */ #include<string> #include<sstream& ...
- 详细解读KMP模式匹配算法
转载请注明出处:http://blog.csdn.net/fightlei/article/details/52712461 首先我们需要了解什么是模式匹配? 子串定位运算又称为模式匹配(Patter ...
- 字符串的模式匹配算法——KMP模式匹配算法
朴素的模式匹配算法(C++) 朴素的模式匹配算法,暴力,容易理解 #include<iostream> using namespace std; int main() { string m ...
- 数据结构(三)串---KMP模式匹配算法
(一)定义 由于BF模式匹配算法的低效(有太多不必要的回溯和匹配),于是某三个前辈发表了一个模式匹配算法,可以大大避免重复遍历的情况,称之为克努特-莫里斯-普拉特算法,简称KMP算法 (二)KMP算法 ...
随机推荐
- Redis主从复制(Master/Slave)
Redis主从复制(Master/Slave) 修改配置文件 拷贝多个redis.conf文件分别配置如下参数: 开启daemonize yes pidfile port logfile dbfile ...
- Python3常用网络编程模块介绍
一.socket模块 网络服务都是建立在socket基础之上的,socket是网络连接端点,是网络的基础:每个socket都被绑定到指定的IP和端口上: 1.首先使用socket(family=AF_ ...
- Git时光机穿梭之版本回退
现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control system. ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第二节--数据库脚本
第一点,上一篇文章中我们讲到codefirst中一些问题包括如图 1,codefirst在执行的数据库迁移过程中产生了很多文件,对于强迫症的我而言特别不爽,这些是可以不用生成的啊 2,在codefir ...
- 【head first python】2.共享你的代码 函数模块
#coding:utf-8 #注释代码! #添加两个注释,一个描述模块,一个描述函数 '''这是nester.py模块,提供了一个名为print_lol()的函数, 这个函数的作用是打印列表,其中可能 ...
- [bzoj4832]抵制克苏恩 概率dp
考试的时候打了个搜索,时间比较短,样例又非常的弱,实在不太清楚他这个到底是什么意思. 不过lc大神好腻害,讲解了一下非常的清楚了. f[i][j][k][l]表示第i次伤害(啊),一滴血j个,两滴血k ...
- Android -- 自定义view实现keep欢迎页倒计时效果
1,最近打开keep的app的时候,发现它的欢迎页面的倒计时效果还不错,所以打算自己来写写,然后就有了这篇文章. 2,还是老规矩,先看一下我们今天实现的效果 相较于我们常见的倒计时,这次实现的效果是多 ...
- Luogu P3367 【模板】并查集
题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入输出格式 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1 ...
- GitLab Development Kit 环境搭建
在公司内网服务器上面搭建gdk环境,踩了很多坑,历时四五天(中间涉及申请开通固定外网),整理如下: 总览: 操作系统:redhat 6.3 参考文档:https://gitlab.com/gitlab ...
- HTML5的三种存储方式以及区别
首先将存储方式前要先知道为什么要使用他:一是利用本地数据,介绍网络请求:二是弱网环境下,高延迟,低带宽,要把数据本地化: 1.本地存储localStorage和sessionStorage 介绍: 存 ...