数据结构学习: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算法 ...
随机推荐
- metasploit快速入门
今天没上班,在小黑屋里看了一个一百多页的书<metasploit新手指南>,在此将笔记分享给大家.欢迎大家批评指正,共同学习进步. metasploit新手指南 笔记 kali 0 ...
- python实战第一天-paramiko模块并练习
操作系统 Ubuntu 15.10 IDE & editor JetBrains PyCharm 5.0.2 ipython3 Python版本 python-3.4.3 安装paramiko ...
- C++ Socket学习记录 -1
1.IP的转换 1)正转换 结构 sockaddr_in 在C++ 中表明一个IP地址结构,包含地址家,端口以及IP地址等信息 如: sockaddr_in addr; addr.sin_family ...
- MYSQL报错注入方法整理
1.通过floor暴错 /*数据库版本*/ SQL http://www.hackblog.cn/sql.php?id=1 and(select 1 from(select count(*),conc ...
- 玩转JS系列之代码加载篇
从前我们这样写js <script type="text/javascript"> function a(){ console.log('a init');}funct ...
- dom作业
<body> <select size="7" style="width: 200px;" id="slt"> &l ...
- Elastic Stack
Elastic Stack 开发人员不能登陆线上服务器查看详细日志 各个系统都有日志,日志数据分散难以查找 日志数据量大,查询速度慢,或者数据不够实时 官网地址:https://www.elastic ...
- thinkphp 中英文网站详解
thinkphp 制作中英文网站的两种方法 一,在网站程序里增加语言脚本,设置整站自动翻译. 二,在原有的页面制作新的模板,在新的页面编辑网站, 优缺点: 一:优点.........就是不用多次添加内 ...
- VS2015 安装nuget离线包nupkg文件
最近在做项目进度管理时,想通过安装net.sf.mpxj-for-csharp包读取.mpp格式文件,通过Nuget在线安装时,出现以下情况,无法安装,故开启离线安装道路. 离线安装步骤如下: 一.下 ...
- 【渗透笔记】拿下某小H网的全过程
自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下, ...