二:一个模式匹配算法
在上课时根据老师的提示,利用函数值来判断是否做进一步做字符串内的比较。假设子串的大小为n;我一开始设了两个整型变量Sum1和Sum2,Sum1用来计算子串的字母ascii之和,Sum2用来计算n个母串字母的ascii之和,后面Sum2的改变通过迭代的思想,就是减去前面一个,加上后面一个,所以这一块的时间花费为O(n)。当Sum1!=Sum2时,说明不可能匹配,可以避免很多的重复匹配,而当Sum1==Sum2时,在进入详细的匹配。后面我通过把两个文件的内容传进去进行测试和暴力算法比较,快了一点。但后面想了一想,这个算法还是具有偶然性,时间性能和子串和母串都有关系,当母串的n个字符的Sum2值刚好都等于Sum1时,时间性能又和暴力匹配算法相同了,甚至还要慢一点,因此是不稳定的。
具体算法如下:
nt PersonalPatternMatch(String s1,String s2)
{
int State=0;
int i,Sum2=0,Sum1=0;
for(i=0;i<s2->Length;i++)
{
Sum1=Sum1+s1->Array[i];//计算 模窜的ascii码之和 ,是不变化的
Sum2=Sum2+s2->Array[i];//计算模字符串相应的ascii码之和
}
i=0;
while(i<=s1->Length-s2->Length)
{
if(Sum2!=Sum1||State)//若assic码和 不同,则主串向右移移位
{
Sum1=Sum1-s1->Array[i]+s1->Array[s2->Length+i];//移位并计算移位后主串的assci码和
State=0;
i++;
}
else//若相同,详细比较
{
int j,k=i;
for(j=0;j<s2->Length;j++)
{
if(s1->Array[k]==s2->Array[j])
{
k++;
}
else
break;
}
if(j>=s2->Length)//是否匹配 成功
return i+1;//返回匹配的主串的位置
else
State=1;
}
}
return 0;//匹配不成功
}