今天看了一下数据结构中串的相关知识,着重看了一下BF算法和KMP算法,虽然说是看,但是对于KMP算法中next的值的怎么得来的,还是没有看懂只记得当初学的时候,大家说是离散数学上的知识,唉,现在又忘光光了
,还是先说一下BF算法。
看书的时候才知道,原来BF算法又称蛮力匹配算法,不啰唆了,先描述一下该算法。
从主串S的第pos位置开始,与模式串T比较,比较的策略是 从前到后依次比较,主串中设置指示器i表示S中当前比较的字符位置,模式串中设置指示器j表示模式串T中当前比较的字符的位置。如果相等,则依次向后比较,否则回溯到主串的pos+1的位置重新开始与模式串进行比较。直至模式串中的每一个字符与主串中的连续字符相等,这就是模式匹配成功,返回模式串T的第一个字符在主串S中的位置。没有匹配的,就称模式匹配不成功。
我建议大家看懂思想后,自己先写一下,再对照上面的代码,看自己哪里没有理解好,开始的时候我把回溯时i的值写错了,最后才理解了那个 i = i-j+2;我来解释一下,
j是多少,就代表i相对第一个比较的地方前进了多少,所以,i-j+1就是主串中正在比较比较的连续字符串中的第一个,因为现在不匹配,它就要回到它的下一个,下一个用i,j表示就是 i-j+2;关于这里大家可以拿个例子,自己画一下比较过程就懂了。
这个算法的时间复杂度为O(n*m) n和m分别为主串和模式串的长度。
还是想提一下 KMP算法,和BF算法不同的是 KMP算法消除了BF算法中主串S指针回溯的现象。就是当他出现字符不相等时,主串的指针i不回溯,而是利用已经得到的“部分匹配”结果将模式向右一段距离后,继续比较。KMP算法的时间复杂度为O(n+m)。
真的没有看懂KMP的 next那块是怎么弄的,让我再研究研究,如果有人懂请告诉我啊。
看书的时候才知道,原来BF算法又称蛮力匹配算法,不啰唆了,先描述一下该算法。
从主串S的第pos位置开始,与模式串T比较,比较的策略是 从前到后依次比较,主串中设置指示器i表示S中当前比较的字符位置,模式串中设置指示器j表示模式串T中当前比较的字符的位置。如果相等,则依次向后比较,否则回溯到主串的pos+1的位置重新开始与模式串进行比较。直至模式串中的每一个字符与主串中的连续字符相等,这就是模式匹配成功,返回模式串T的第一个字符在主串S中的位置。没有匹配的,就称模式匹配不成功。
核心代码:
int Index(String S,int pos,int T)
{
int i = pos;
int j = 1;
while(i<=S.len && j <= T.len)
{
if(S.ch[i] == T.ch[j])
{
i++;
j++;
}
else
{
i = i-j+2;
j = 1;
}
}
if(j > T.len)
return i-T.len;
else
return 0;
}
我建议大家看懂思想后,自己先写一下,再对照上面的代码,看自己哪里没有理解好,开始的时候我把回溯时i的值写错了,最后才理解了那个 i = i-j+2;我来解释一下,
j是多少,就代表i相对第一个比较的地方前进了多少,所以,i-j+1就是主串中正在比较比较的连续字符串中的第一个,因为现在不匹配,它就要回到它的下一个,下一个用i,j表示就是 i-j+2;关于这里大家可以拿个例子,自己画一下比较过程就懂了。
这个算法的时间复杂度为O(n*m) n和m分别为主串和模式串的长度。
还是想提一下 KMP算法,和BF算法不同的是 KMP算法消除了BF算法中主串S指针回溯的现象。就是当他出现字符不相等时,主串的指针i不回溯,而是利用已经得到的“部分匹配”结果将模式向右一段距离后,继续比较。KMP算法的时间复杂度为O(n+m)。
真的没有看懂KMP的 next那块是怎么弄的,让我再研究研究,如果有人懂请告诉我啊。