kmp//呵呵!看毛片算法
以前刚学的时候迷迷糊糊的,一看就懵圈,前几天捡起来的时候 发现还不会
于是研究了两天,自尊心严重受挫,今天的时候 突然一道灵光迸发,居然
感觉好像懂了,于是又琢磨起来 终于 我懂了 呵呵!
0 1 2 3 4 5 6 7 8 9
主串 : a b c d e a b c d f
i
0 1 2 3 4 5 6 7 8 9
模式串: c d f
j
i=4时 e!=f匹配失败 传统字符匹配是让i=3,j=0继续匹配,i++,j=0.
此种匹配方式虽然简单易懂,但是多了许多次无用的回溯比较(如 i=3,j=0)
因此kmp算法横空出世,讲真,我真心佩服发明这个算法的人,太屌。。。
看毛片算法采用滑动模式串的方式 ,有效的避免了无用回溯
------------------------------------------------------------------
-------------------------------------------------------------------
我对 kmp算法的理解
两个字符串
0 1 2 3 4 5 6 7
a b c a b a a b a e f(用i指向字符)
a b a e(用j指向字符)
i=3,4,5等于j=0,1,2 而i=6不等于j=3
这时传统思想是将j=0,i=4依次比较。而kmp算法是利用移动模式串的方式来解决字符匹配问题
因为 i=3,4,5 等于 j=0,1,2
所以i=5 等于 j=2
而 j=0 等于 j=2 则不需要匹配j=0与i=4的无效匹配,直接将模式串向右移动两位即可
//问题一:为什么j=0与i=4是无效匹配?
// 1.模式串已知 j=0不等于j=1
// 2.i=4等于j=1 而 j=0不等于j=1 所以 j=0指定不等于i=4
// 所以不用比较
//问题二:为什么向右移动两位?
// 距离 L=length(模式串)-next[j](减的始终是数组中最大的元素);
a b a e
next[j]= 0 1 1 2
看毛片算法的实现
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
int len(char *t)
{
int i=0,j=0;
char *m;
for(m=t;t[i]!='\0';i++)//m,t代表的都是首地址
{
j++;
}
return j;
}
void makenext(char *p,int next[])
{
int k=0,q;
int m=len(p);
next[0]=0;
for(k=0,q=1;q<m;q++)
{
while(k>0&&p[k]!=p[q])
k=next[k-1];
if(p[k]==p[q])
{
k++;
}
else
{
next[q]=k;
}
}
}
int kmp(char * t,char * p,int next[])
{
int i=0,q=0,k;
int pos;
int lent=len(t);
int lenp=len(p);
//t[0]=lent;//类型不一致可能用到强制转换;
//p[0]=lenp;
makenext(p,next);
for(i=0,q=0;i<lent;i++)
{
while(q>0&&t[i]!=p[q])
q=next[q-1];
if(t[i]==p[q])
{
q++;
}
if(q==lenp)
{
printf("在位置n匹配完成:%d",(i-lenp+1));
}
}
}
int main()
{
int i=0;
int lent,lenp,pos;
int next[]={0};
char *text="abcababeca";
char *patten="ababe";
printf("%s\n " ,text);
printf("%s\n " ,patten);
kmp(text,patten,next);
return 0;
}
参考大神的博客------http://www.cnblogs.com/c-cloud/p/3224788.html
kmp//呵呵!看毛片算法的更多相关文章
- KMP算法再解 (看毛片算法真是人如其名,哦不,法如其名。)
KMP算法主要解决字符串匹配问题,其中失配数组next很关键: 看毛片算法真是人如其名,哦不,法如其名. 看了这篇博客,转载过来看一波: 原博客地址:https://blog.csdn.net/sta ...
- SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解
数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
- 快速字符串匹配一: 看毛片算法(KMP)
前言 由于需要做一个快速匹配敏感关键词的服务,为了提供一个高效,准确,低能耗的关键词匹配服务,我进行了漫长的探索.这里把过程记录成系列博客,供大家参考. 在一开始,接收到快速敏感词匹配时,我就想到了 ...
- kmp(看毛片)算法
别人的两篇博客. 传送门1 传送门2 其中T为主串,P为模式串. 其实就是在T中找P. 其中next数组存的是"部分匹配值". "部分匹配值"就是"前 ...
- [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...
- BF、KMP、BM、Sunday算法讲解
BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...
- zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于当前参数的梯度: 根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...
随机推荐
- FileOutputStream字节输出流和FileInputStream输入流(切记:out是输出到本地中,in是输入到程序中)这里介绍大文件和小文件的读取方式
//FileOutputStream public class FileOutputStreamDemo { /**字节流:适用于任何文件,以字节为单位,进行读写操作 *字节流操作步骤: *1.创 ...
- strus2 action重复执行问题
近日做项目,有两个模块功能类似,就写到了一个action中,方法起名为getXXX1,getXXX2 最后在两个模块去调用的时候,分别调用DemoAction!getXXX1.action和DemoA ...
- Android学习笔记-Intent(一)
Intent对象在Android官方API这样描述:It is a passive data structure holding an abstract description of an opera ...
- 实现栈最小元素的min函数
#include<iostream> #include<stack> using namespace std; class min_stack { public: void p ...
- 在Netbeans上配置Android开发环境
在NetBeans下开发Android的所需要的基本条件:NetBeans(包含JDK)+Android SDK+NBAndroid(为Netbeans设计的Android 开发插件) 详情:http ...
- inet_aton()
两次技术面试都被让c语言实现inet_aton()函数 看来这个函数真的很重要. 我先贴上我自己的实现代码 #include <stdio.h> #include <math.h&g ...
- TCP为什么是个可靠的协议
一直以来,我们都被告知TCP是可靠的.但为什么是可靠的,很多人都会说“三次握手.四次挥手”.然后我们就进入一个误区:TCP可靠是因为它在建立链路时进行了“多次”地确认.然后又有人问,“多次确认就可靠了 ...
- WPF MVVM使用prism4.1搭建
WPF MVVM使用prism4.1搭建 MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和 ...
- java正则表达式去除html标签
当我们用ckeditor或其他一些在线文本编辑器的时候 内容里会有很多的标签 如下片段: <p><img alt="" src="/img/upload ...
- ubunt 命令行下链接VPN
Ubuntu命令行下VPN连接与使用 route add default dev ppp0 route add -net 192.168.2.0 netmask 255.255.255.0 ppp0 ...