- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
蛮力法解决串匹配问题
算法分析实验报告
蛮力法-串匹配问题
学生姓名:
专 业:
班 级:
学 号:
指导教师:
2017年6月12日
目录
一、实验题目 2
二、实验目的 2
三、实验要求 2
四、实现过程 3
1、实验设计: 3
2、调试分析: 8
3、运行结果: 9
4、实验总结: 9
五、参考文献 10
一、实验题目
蛮力法-串匹配问题
二、实验目的
(1)深刻理解并掌握蛮力法的设计思想;
(2)提高应用蛮力法设计算法的技能;
(3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。
三、实验要求
1.[问题描述]:
给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配,T称为模式。
设主串S=“abcabcacb”,模式=“abcac”。
2.[算法]:
蛮力法:?蛮力法(也称穷举法或枚举法)是一种简单直接的解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法,例如,对于给定的整数a和非负整数n,计算an的值,最直接最简单的方法就是把1和a相乘n次,即:an=a*a*a*···*a。
蛮力法所依赖的基本技术是遍历(也称扫描),即采用一定的策略依次处理待求解问题的所有元素,从而找出问题的解。依次处理所有元素是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。用蛮力法设计的算法,一般来说,都可以对算法的第一个版本进行一定程度的改进,提高其时间性能,但只能减少系数,而数量级不会改变。
四、实现过程
1、实验设计:
想法一:BF算法
1 在串S中和串T中设比较的下标i=1和j=1;
2 循环直到S中所剩字符个数小于T的长度或T中所有字符均比较完
2.1 k=i
2.2 如果S[i]=T[j],则比较S和T的下一字符,否则
2.2 将i和j回溯(i=k+1; j=1)
3 如果T中所有字符均比较完,则匹配成功,返回k,否则匹配失败,返回0
时间复杂度:设匹配成功发生在si处,则在i-1趟不成功的匹配中比较了(i-1)*m次,第i趟成功匹配共比较了m次,所以总共比较了i*m次,因此平均比较次数是:
一般情况下,mn,因此最坏情况下时间复杂度是Ο(n*m)。
想法二:KMP算法
实现过程:在串S和串T中高比较的起始下标i和j;循环直到S中所剩字符小于T的长度或T的所有字符均比较完(如果S[i]=T[j],则继续比较S和T的下一个字符;否则将j向右滑动到next[j]位置,即j=next[j];如果j=0,则将i和j分别+1,准备下趟比较,至于其中的next在此不作详细讲解);如果T中所有字符均比较完,则匹配成功,返回匹配的起始下标;否则匹配失败,返回0。 时间复杂度:当mn时,KMP算法的时间复杂性是Ο(n)。
图解过程
主串S 本趟匹配开始位置
si
模式T
tj
回溯
第一趟匹配,i=4,j=4失败,i回溯到1,j回溯到0
a b c a b c a c b /0
0 1 2 3 4 5 6 7 8 9
a b c a c
第二趟匹配,i=1,j=0失败,i回溯到2,j回溯到0
a b c a b c a c b /0 0 1 2 3 4 5 6 7 8 9
a
第三趟匹配
0 1 2 3 4 5 6 7 8 9
A b c a b c a c b /0
a
第四趟匹配,i=8,j=5,T中全部字符都比较完毕,匹配成功
A b c a b c a c b /0
a b c a c
算法实现
1)BF
int BF(char S[],char T[],int index)
{
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;
}
2)KMP
void GetNext(char T[],int next[])
{
int i,j,len;
next[0]=-1;
for(j=1;T[j]!=\0;j++)
{
for(len=j-1;len=1;len--)
{
for(i=0;ilen;i++)
if(T[i] != T[j-len+i]) break;
if(i==len)
{
您可能关注的文档
最近下载
- 中医经方临床运用培训课件.ppt
- 汽车装配与调试技术课程标准.docx
- 毕业论文低频电涡流传感器测量电路设计.doc
- S2168001-社会计算导论-智算学部.pptx
- 《古建筑修缮工程施工规程》.pdf
- 对企业有利的劳动合同.docx
- 班主任带班育人方略《做有温度的班主任》宣讲演讲PPT课件.pptx
- 答案-国开电大(本科)《当代中国政治制度》在线形考(形考任务二)试题.docx
- 大学物理 II-(热学、振动和波、光学、量子)(北京交大)中国大学MOOC慕课 章节测验期末考试客观题答案.docx
- 【专项复习】2024年小学六年级下册小升初数学专题复习(8)比的性质求比值和化简比及比的应用(知识归纳+典例精析+拔高训练)(1).docx
文档评论(0)