以前刚学的时候迷迷糊糊的,一看就懵圈,前几天捡起来的时候 发现还不会

于是研究了两天,自尊心严重受挫,今天的时候  突然一道灵光迸发,居然

感觉好像懂了,于是又琢磨起来  终于  我懂了  呵呵!  

     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//呵呵!看毛片算法的更多相关文章

  1. KMP算法再解 (看毛片算法真是人如其名,哦不,法如其名。)

    KMP算法主要解决字符串匹配问题,其中失配数组next很关键: 看毛片算法真是人如其名,哦不,法如其名. 看了这篇博客,转载过来看一波: 原博客地址:https://blog.csdn.net/sta ...

  2. SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解

    数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  3. 快速字符串匹配一: 看毛片算法(KMP)

    前言 由于需要做一个快速匹配敏感关键词的服务,为了提供一个高效,准确,低能耗的关键词匹配服务,我进行了漫长的探索.这里把过程记录成系列博客,供大家参考. 在一开始,接收到快速敏感词匹配时,我就想到了 ...

  4. kmp(看毛片)算法

    别人的两篇博客. 传送门1 传送门2 其中T为主串,P为模式串. 其实就是在T中找P. 其中next数组存的是"部分匹配值". "部分匹配值"就是"前 ...

  5. [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...

  6. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...

  7. BF、KMP、BM、Sunday算法讲解

    BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...

  8. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法

    ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...

  9. zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    首先定义:待优化参数:  ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch  : 计算目标函数关于当前参数的梯度:  根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...

随机推荐

  1. Angularjs 与Ckeditor

    Angularjs 与Ckeditor Angularjs 诞生于Google是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVC.模块 ...

  2. Remoting接口测试工具

    动手写一个Remoting接口测试工具 基于.NET开发分布式系统,经常用到Remoting技术.在测试驱动开发流行的今天,如果针对分布式系统中的每个Remoting接口的每个方法都要写详细的测试脚本 ...

  3. .NET源码

    值得珍藏的.NET源码,不保存就没机会了 很早以前,我们通过http://referencesource.microsoft.com/netframework.aspx可以下载到.NET的各版本公开源 ...

  4. [置顶] Hibernate从入门到精通(十)多对多单向关联映射

    上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...

  5. 一个快速找第k+1小的算法

    public static int randomSelect(int[] A, int k)         {             return randomSelectDo(A, 0, A.L ...

  6. .NET:线程本地存储、调用上下文、逻辑调用上下文

    .NET:线程本地存储.调用上下文.逻辑调用上下文 目录 背景线程本地存储调用上下文逻辑调用上下文备注 背景返回目录 在多线程环境,如果需要将实例的生命周期控制在某个操作的执行期间,该如何设计?经典的 ...

  7. Linux Shell脚本攻略

    -Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...

  8. c# 使用Codosys.dll(CDO)发送邮件

    准备工作: 从C:\Windows\System32将Codosys.dll拷到你的项目里,然后引用,或者直接引用Com组件也可以 然后看代码 ///<summary> /// 构造函数 ...

  9. sql 数据库的备份还原问题

    今天工作中犯了一个严重的错误,就是在sql中写了一个update语句,还没写条件呢,结果误按了F5,唉,太佩服自己啦...这个脑子怎么不管用了呢?? 唉不说了,我在网上翻来覆去的找资料,最终想是不是可 ...

  10. Xml转化为DataTable

    /// <summary> /// XML转换为DataTable /// </summary> /// <param name="fileName" ...