字符串匹配算法报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档