字符串匹配算法报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告题目:字符串匹配算法实测分析
课程名称:数据结构
专业班级:计科XX
学号:UXXXXX XX
姓名:FSH
指导教师:xxx
报告日期:2015.9.13
计算机科学与技术学院
数据结构课程组
2015年5月
题目字符串匹配算法实测分析
☐设计目的:掌握线性结构中的字符串的物理存储结构与基本算法,通过查询阅读文献资料,拓广知识面以及培养学生科研能力。
☐设计内容:结合教材上的字符串匹配算法,查询文献资料检索4种以上的有关精确匹配算法,掌握算法原理并实现。
☐设计要求:
(1)查阅相关的文献资料,特别是留意年近些年发表的文献资料;
(2)要求对各种算法进行理论分析,同时也对实测结果进行统计分析。测试数据要求有一定规模,比如一本书或不少于50篇的中英文文献。
(3)要求界面整洁、美观,操作方便;
报告内容:
(一), 运行界面,及运行结果截图
(二),各算法的具体分析,包括起源,基本思路,实例分析,具体实现,和本算法代码。
(三),总程序源代码。
(四),课程设计心得
(一), 运行界面,运行结果说明:
运行代码显示界面:
对于S串可以手动输入字符串检索,也可以选择在计算机里建好的TXT文件,按任意键退出。
按2确认,键入一本书的TXT文件,运行如下
输入待搜索子串“史记”得到运行结果,各算法均返回子串在母串出现的位置
执行算法得运行结果,返回子串在母串所有出现位置。
结果显示运行时间用以统计时间效率:
另一段检索结果的时间截图结果显示如下:
(二),各算法的具体分析
一.穷举算法(Brute force)算法:
.
1.算法起源:
此算法思路简单,容易想到,没有确定的提出者‘
2.算法基本思想:
之所以成为穷举法,即如名字所言,逐个比较直至穷尽/结束,基本思路为:假设S 为母字符串,长度为lengthS,T为子字符串,长度为lengthT. 则从母串第i位元素(从第一位i=1元素开始)开始一次提取长度为lengthT的一串字符挨个与S字符串比较是否相等,若相等,则匹配成功并输出i ,然后在S上后移一位继续比较,直至比较完整个S.
sliding window:
3.案例分析:
假设母串S : edgoodbnbqgoodewuopimmxccaluhfui
子串T : goodboy
N= lengthS–length+1
) . . . . . .
(i! 字符不等,结束i; 4.算法具体实现: 字符串的物理存储实现—malloc函数申请空间返回unsigned char 型指针,线性结构; 设置参数: i, 用以表示检测位,范围为(1,N)用for循环语句判断是否遍历S字符串。其中N= lengthS–length+1 ; 辅助函数: Substring(S , i,n)作用为提取S字符串里从第i位起长度为n 的字符串,其返回值为unsigned char型指针。 Substring算法: status substring( string s,int pose ,intlen )// 子字符串提取函数substring;返回值为子str字符串 { unsigned char* sub; sub=malloc(10000*sizeof(unsigned char)); inti=strlen(s); int k=pose+len-1; if(i<0||pose>i||k>i) return NULL; int a; for( a=0;a sub[a]=s[pose-1]; sub[a]='\0'; return sub; } 5 .算法源码: void index(string s, string t) { intm,n,i; string test; test=malloc(10000*sizeof(unsigned char)); n=strlen(s);m=strlen(t); i=1; int a=0; intjishu[1000];//数组用来计数匹配成功的位置 printf("\n穷举算法运行得:\n"); while(i<=n-m+1){ strcpy(test,substring(s,i,m)); if(strcmp(test,t)!=0) ++i; else { jishu[a]=i; printf(" 匹配成功输出:%d\n",jishu[a]); ++i;++a; }// 返回子串在主串中的位置 }//while //S中不存在与T相等的子串 }//Index 6. 效率分析: 穷举算法虽然易于理解,也容易实现,但是效率却比较低下,因为该算法对于S字符串上的前N位元素,每个元素都提取字符串并进行挨个比较,比较完全匹配或者出现失配时后移一位继续比较,若S长度m,T长度n,则找到所有匹配位置的时间O(mn) 。 二.Sundy算法: 1.起源: Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。 2.算法基本思想: 从母串S提取比较字符串,用T字符串的最后一位元素t[n-1]与s[i-1]比较,出现不相时运用sundy核心算法,即坏字符算法。坏字符即为s[i-1],然后再在T中找有无坏字符,方向为从前往后,若找到则把该位移到和S的坏字符对齐,若没找到,则后移长度为T串长,在提取比较是否相等,若相等输出在S上的位置i,若不等但t[n-1]与s[i-1],则后移一位继续比较,直至走完S串。 3.案例分析: 假设母串S : edgoodbnbqgoodadecmnkdewuopimmxccaluhfui 若子串为T1 : akideb假设已经比较到第3位 若子串为T2 :adulgnd假设已比较到第19位 (T1未找到坏字符n,后移6个字符) (在T中找到坏字符U,平移7 – 2—1=4)