实验时间 | 2024年 3 月27日19时至22时 | 学时数 | 3 | ||
1.实验名称 算法基础实验:数理基础与串匹配程序设计 | |||||
2.实验目的 以字符串匹配问题为例,结合C等编程语言和链表、堆、栈等数据结构知识,基于BF算法对字符串匹配问题进行求解,深刻理解数学知识在算法复杂度分析的使用方法,学会算法分析的技能,进一步增强代码的设计和工程化实现能力。 | |||||
3.实验内容 (1)给定两个字符串S和T,利用BF算法,在主串S中查找子串T,并输出查找结果,输出时需以文字形式对查找结果进行定性说明; (2)要求以C++/C/Java等编程语言进行实现; (3)建立算法时间复杂度分析模型,并利用计算机统计该算法的执行效率。 | |||||
4.实验原理 BF算法: 即暴力破解算法(Brute Force),属于模式匹配算法中的一种。 算法思想: ·从主串和模式串的第一个字符开始比较; ·若相等,继续逐个比较后续字符; ·若不等,从主串的下一个字符开始,与模式串的第一个字符重新比较; ·直到主串的一个连续子串字符与模式串相等,返回值为S与T匹配的子序列第一个字符的序号,即匹配成功; ·否则,匹配失败,返回值为0。 | |||||
5.实验源代码和伪代码 伪代码:
源代码: #include<stdio.h> int BF(char S[],char T[]) { int index=0; int i=0,j=0; while((S[i]!='\0')&&(T[j]!='\0')) { if(S[i]==T[j]) { i++; j++; } else { index++; i=index; j=0; } } if(T[j]=='\0') return index+1;//返回本趟匹配的开始位置(不是下标) else return 0; } int main(){ char S[100], T[100]; printf("请输入主串S(不超过100个字符):"); scanf("%s",S); printf("请输入子串T(不超过100个字符):"); scanf("%s",T); int index = BF(S, T); if(index == 0){ printf("模式匹配失败!"); } else{ printf("模式匹配成功,子串%s在主串%s中首次匹配的位置是%d", T, S, index); } return 0; } 时间复杂度分析: 最好的情况下: 比较m次就够了,因为m是子串的长度,所以最少也需要把子串里的字符都匹配成功才行,所以时间复杂度为O(m)。 最坏情况下: 每次都要比较到子串的最后一个字符1才发现匹配不成功(进行了4次匹配),直到最后才匹配成功,所以除了后m位以外,主串中前面的字符(n-m个字符)都要一一和子串进行m次匹配,然后发现匹配不成功,所以就是(n-m)*m,再去加上最后m个字符进行m次匹配才发现匹配成功,即(n-m+1)*m。 (n-m+1)*m:(由于子串长度不可能大于主串的长度,所以存在以下两种情况) 1. 当m<<n时: m和1都可以省略,即为n*m,所以时间复杂度为O(n*m)。 2.当m和n差不多大时: 可以近似等于(n+n+!)*m,即可以近似等于(2n)*m,所以时间复杂度还是O(n*m)。 平均情况下(有最好也有最坏): (m(最好情况下)+(n*m)(最坏情况下))/2=( (n+1)/2 )*m,数量级还为(n*m),所以时间复杂度为O(n*m)。 | |||||
代码运行截图: 心得: BF 算法的实现过程很 "无脑",不包含任何技巧。实际上,我们可以对 BF 算法的实现过程进行改进,称为 KMP 算法。 |
中北大学算法基础实验:数理基础与串匹配程序设计实验报告
于 2024-04-06 21:09:56 首次发布