主题:[原创]数据结构中的模式匹配问题
henryliuch
[专家分:290] 发布于 2006-05-14 19:40:00
大家好:
我这里想问的是,在数据结构中的模式匹配问题,即kmp那个算法,真的很难理解,而且后面紧跟一个失败连接值的知识点,我有些不明白。
我在想一般的匹配的方法是一个一个字符去比,这样时间虽然比较慢,但是很好理解,可是kmp那个算法,为什么可以跳过一段直接去比较呢?
谢谢各位的帮忙了!
回复列表 (共4个回复)
沙发
rickone [专家分:15390] 发布于 2006-05-15 17:28:00
书上原因说得很清楚,KMP对它的优化全放在T串在比较到不同时向前滑移,因为T串本身有前后相似的性质.所以对于T串比较小的时候,实际上没多大优化.
对于KMP算法其实不难理解,比较难理解的是求next[]值,实际上求next值是一个是自身对自身的匹配,可以比较一下求next的函数和KMP算法的函数.
板凳
euc [专家分:4310] 发布于 2006-05-15 21:11:00
就算你表面上理解了kmp算法,你也无法像学其他算法那样上升为直觉并举一反三的程度,因为这就是kmp,一个外星来的东东,算法世界里的金字塔(或百慕大)!*_*
#include <stdio.h>
void getnext (int next[], char *s)
{
int i = 0, j = -1;
next[0] = -1;
while (s[i])
if (j == -1 || s[i] == s[j]) {
++i; ++j;
if (s[i] == s[j])
next[i] = next[j];
else
next[i] = j;
}
else j = next[j];
}
int kmp (char *main, char *sub, int next[])
{
int i, j, subn;
subn = strlen (sub);
for (j = i = 0; j < subn && main[i];) {
if (j == -1 || main[i] == sub[j]) {
i++; j++;
}
else j = next[j];
/* printf ("i:%d j:%d\n", i, j);
*/
}
if (sub[j] == 0) return i - j;
else return -1;
}
3 楼
henryliuch [专家分:290] 发布于 2006-05-16 14:16:00
kmp真的有二楼说的那么难吗?我想一个算法肯定是有它的思想有它的内涵的,我知道了所以但是我更想知道所以然,不然这样也是表面的懂,不是真正意义上的理解,我想理解了才是记住的基础
我们在上模式匹配这一节的内容的时候,老师讲的有些快,而且我觉得老师也有点讲不清楚,所以自己就对这一概念朦胧,顺便说一下我们用的教材是比较老的复旦大学出版社的《数据结构》是蔡子经和施伯乐编的,书上的程序真的很精练,而且有点难懂。
但是我还是要谢谢以上帮我的两位朋友,谢谢你们,希望你们看到我的帖子后,能给我继续讲讲!
4 楼
morningbus [专家分:0] 发布于 2006-05-18 12:48:00
还有个KMP算法的改进版,能求出所有匹配子串
求出next[j]后,再求出new next
假设 j 1 2 3 4 5
模式 a b a c a
next[j] 0 1 1 2 1
new 0 1 0 2 0
我来回复