社区
数据结构与算法
帖子详情
看不懂KMP算法,谁能给我简单通俗的讲一下它的思想....?
YanYin
2007-03-22 05:54:52
谢谢了......
...全文
515
5
打赏
收藏
看不懂KMP算法,谁能给我简单通俗的讲一下它的思想....?
谢谢了......
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xlt1984
2007-03-27
打赏
举报
回复
仔细看严蔚敏的数据结构。里面有详细介绍
Buchanan
2007-03-25
打赏
举报
回复
关键是next函数的编写
shunan
2007-03-23
打赏
举报
回复
一句当时自己看了后总结的话
对模式串如何进行初始化:next【j】为字符串0,...,j-1的最长前缀的字符个数(这个前缀必须也是此字符串的后缀),具体实现可以参见算法书。
pomiox
2007-03-22
打赏
举报
回复
KMP:在一个长字符串中匹配一个短子串的无回溯算法。
先看看最“朴素”的算法:
///find a template in a string.
int Index(char *S, char *T, int pos)
{
int i=pos,j=1;
while(i <= S[0] && j<=T[0])
{
if (S == T[j]) { ++i; ++j;} \\如果相同,则继续向后比较
else {i = i-j+2; j =1;} \\如果不同,就回溯,重新查找
}
if (j>T[0]) return i-T[0];
else return 0;
}
需要注意的是,这里的两个字符串的第一个字节存放的是字符串的长度,所以,无论在任何情况下,请不要忘记,这种写法只能匹配最长255的字符串. 希望比较更长的字符串,请自行更换类型就可以了。或者干脆自己传2个size_t的参数进去.
------------------------------------------------------------------------------------------------------------------------
KMP算法是通过分析子串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,整理出来一个next数组,然后再上面的算法中使用。
讲解一下:
当我们分析一个子串时,例如:abcabcddes. 需要分析一下,每个字符前面最多有多少个字符和字符串从初始位置开始的字符匹配。然后+1就行了(别忘了,我们的字符串都是从索引1开始的)当然,不要相同位置自己匹配,默认第一个字符的匹配数是0。
举例如下:
abcabcddes
0111234111
^-------------------默认是0
^^^----------------不能自己相同字符匹配,所以这里者能认为是没有所以是0+1 =1
^^^------------前面的字符和开始位置的字符相同,所以是2,3,4
^^^-------不匹配只能取1。
希望能明白的是,如果开始字符是 Ch1的话,那么我们就是要在串中第2个Ch1后面的位置开始自己和自己匹配,计算最大的吻合度。
程序写出来就是:
void GetNext(char* T, int *next)
{
int i=1,j=0;
next[1]=0;
while( i〈 T[0] ){
if (j ==0 || T == T[j])
{
++i;
++j;
next = j;
}
else j= next[j];
}
}
但是这个不是最优的,因为他没有考虑aaaaaaaaaaaaaaaaaaab的情况,这样前面会出现大量的1,这样的算法复杂度已经和最初的朴素算法没有区别了。所以稍微改动一下:
void GetNextEx(char *T, char *next)
{
int i=1,j=0; next[1] = 0;
while(i < T[0])
{
if (j == 0 || T == T[j])
{
++i; ++j;
if (T == T[j])
next = next[j];
else
next = j;
}
else j = next[j];
}
}
现在我们已经可以得到这个next字符串的值了,接下来就是KMP算法的本体了:
相当简单:
int KMP(char* S, char* T, int pos)
{
int i=pos, j=1;
while (i){
if (S == T[j]){ ++i; ++j; }
else j = next[j]
}
if (j>T[0]) return i-T[0];
else return 0;
}
和朴素算法相比,只是修改一句话而已,但是算法复杂度从O(m*n) 变成了:O(m)
trunjun
2007-03-22
打赏
举报
回复
多找些练习做下就明白了,
最主要的是返回到什么位置,
算法文档,来看看吧
[原网页] 六之再续:
KMP算法
之总结篇(12.09修订,必懂KMP) [原网页] Nginx源码剖析之内存池,与内存管理 [原网页] 程序员编程艺术第一~二十二章集锦与总结(教你如何编程) [原网页] 从Trie树(字典树)谈到...
c语言数据结构字符串模式匹配算法.zip
KMP算法
的核心
思想
是利用已经得到的部分匹配信息来进行后面的匹配过程。看前面的例子。为什么T[5]==’d’的模式函数值等于2(next[5]=2),其实这个2表示T[5]==’d’的前面有2个字符和开始的两个字符相同,且T[5]==...
(算法)
通俗
易懂的字符串匹配
KMP算法
及求next值算法
大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、
KMP算法
及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了
一下
午时间,感觉挺有意思的,把一些思考的...
如果你
看不懂
KMP算法
,那就看一看这篇文章( 绝对原创,绝对
通俗
易懂)
KMP算法
,俗称“看毛片”算法,是字符串匹配中的很强大的一个算法,不过,对于初学者来说,要弄懂它确实不易。整个寒假,因为家里没有网,为了理解这个算法,那可是花了九牛二虎之力!不过,现在我基本上对这个算法...
一文搞懂
kmp算法
KMP算法
是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特一莫里斯一普拉特操作(简称
KMP算法
)。
KMP算法
的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配...
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章