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

时间: 2024-10-12 17:00:49

kmp//呵呵!看毛片算法的相关文章

从有限状态机的角度去理解Knuth-Morris-Pratt Algorithm(又叫KMP算法,”看毛片“算法)

转载请加上:http://www.cnblogs.com/courtier/p/4273193.html 在开始讲这个文章前的唠叨话: 1:首先,在阅读此篇文章之前,你至少要了解过,什么是有限状态机,什么是KMP算法,因为,本文是从KMP的源头,有限状态 机来讲起的,因为,KMP就是DFA(Deterministic Finite Automaton)上简化的. 2:很多KMP的文章(有限自动机去解释的很少),写得在我看来不够好,你如果,没有良好的数学基础就很难去理解他们(比如下图), 因为,你

看毛片(KMP)算法简析

看毛片算法又称KMP算法.该算法之所以得名无外乎如下原因. 每当涉及该算法都甚新鲜,极想把玩一番,经过一番琢磨,终于悟透其本质.遂将其束之高阁,数月之后,再相邂逅,新鲜如初,又是一番把玩.醒悟.遗忘,如此循环以至无穷.足见,该算法与看毛片的道理一脉相承.初看新鲜刺激,观摩研究,醒悟不过如此而已.遂撇下而顾其它,数月之后,复习之,依然新鲜激动如故.以致数年. KMP算法核心在于求匹配失败时模式串的后退数组,大多数都命名为next数组,感觉pre应该更符合直觉.假设在T[i] 和P[j]处失配,j必

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

字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP算算法 §5 KR算法 §6 AC自动机 §7 小结 §1 Boyer-Moore(BM)算法 Boyer-Moore算法原理 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到

要继续看Python写算法的内容请到那里去

因为在这里发文章的时候,莫名其妙的出现发布出去的问题,客服告知是因为链接或者敏感词. 能不能告诉我哪里出了问题?我可以修改,以便再发. 但是,没有人告诉我,只是告诉我不能发. 另外,能不能公布一下敏感词?以后我在遣词造句的时候,才可以避免. 但是,没有看到敏感词列表. 以后我的文章将发布在https://www.github.com/qiwsir/algorithm里面,有兴趣的可以到那里阅读. 要继续看Python写算法的内容请到那里去,布布扣,bubuko.com

再看最短路算法 1 —— 单源最短路

学了多年的算法,最短路问题相当之常见———— 好久没写过最短路的问题了,直到昨天闲的无聊来了一题——BZOJ3402(HansBug:额才发现我弱到只能刷水的地步了TT) 一看这不是明显的单源最短路么呵呵...于是直接上来来了个dijkstra,而且用的是邻接表存储图—— Submit之后,结果却是—— 我立刻被雷到了QAQ...于是立刻改写spfa,结果—— 4000ms+(估计还不止)和192ms究竟是怎样的差距啊QAQ,本人虽然早都听说过spfa的强大性,但是未曾想过差距会如此可怕,于是H

看电视(贪心算法)

问题 A: 看电视 时间限制: 1 Sec  内存限制: 32 MB提交: 927  解决: 432[提交][状态][讨论版][命题人:外部导入] 题目描述 暑假到了,小明终于可以开心的看电视了.但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目.现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗? 输入 输入包含多组测试数据.每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数.接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开

求助大神们看下这道算法题

时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高位数字不为0. 因此,符合我们定义的最小的有趣的数是2013.除此以外,4位的有趣的数还有两个:2031和2301. 请计算恰好有n位的有趣的数的个数.由于答案可能非常大,只需要输出答案除以1000000007的余数. 输入格式 输入只有

再看c语言-算法

通常一个程序包括算法.数据结构.程序设计方法及语言工具和环境这四个方面.其中算法是核心,算法就是解决“做什么”和“如何做”的问题.算法是程序的灵魂,项目中如果接到一个模块的设计,重要的就是考虑这个模块的算法,怎么去做,如何去做的问题. 算法的特性:(1)有穷性:一个算法必须在执行有穷步后结束,每一步都在有穷的时间内完成,避免出现死循环. (2)确定性:每一步都应该有确切的定义,对于每一个过程都不能有二义性,将要执行的每一个动作都必须做出严格而清楚的规定. (3)可行性:算法中的每一步都应该能有效

通过图片对比带给你不一样的KMP算法体验

KMP 算法,俗称“看毛片”算法,是字符串匹配中的很强大的一个算法,不过,对于初学者来说,要弄懂它确实不易. 笔者认为,KMP 算法之所以难懂,很大一部分原因是很多实现的方法在一些细节的差异.体现在几个方面: next 数组,有的叫做“失配函数”,其实是一个东西: next 数组中,有的是以下标为 0 开始的,有的是以 1 开始的: KMP 主算法中,当发生失配时,取的 next 数组的值也不一样!就这样,各说各的,乱的很! 所以,在阐述我的理解之前,我有必要说明一下,我是用 next 数组的,