




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
三种模式匹配算法工作要求:使用KMP、MonteCarlo、LasVegs算法创建三个程序,随机生成长度不小于5,000的01列(三个程序使用相同的列),统计算法的执行时间和MonteCarlo算法的错误比率1 .算法的思路KMP算法的主要特征在于,如果指向主字符串的指针仅向右移动而不需要返回,即模式字符串与主字符串不匹配,则返回的主字符串的指针不与模式字符串重新匹配,而是向已经获得的匹配信息返回滑动距离的大小表示,在图案列的故障函数next,nextk(0=k=m-1 )的值为图案列在下标k的文字中与主列不一致的情况下,向右移动到下标nextk的文字并与主列重合。 算法首先要求模式列的失效函数next,根据next的值进行模式匹配,最坏情况下时间复杂度为O(m*n ),m是模式列的长度,n是主列的长度,当模式列含有很多相同字符时,时间复杂度通常达到O(m n )MonteCarlo随机算法主要通过比较模式列和主列中长度与模式列相等的列的“指纹”来匹配,如果两者的指纹相等,则概率上认为两者相等,算法要求使用随机生成的素数进行模型运算,该素数的但是,即使在选择主列中的比较列的指纹与图案列相等的情况下,比较列不等于图案列的概率理论上为1/n,仅关于主列的长度,与图案列的长度无关,但实际上仅选择素数错误率远小于1/n。LasVegas算法改进了MonteCarlo算法,在模式列的指纹与主列中的比较列相等的情况下,此时不返回直接一致的位置,而是判断两个字符串是否真的相等,相等的情况下继续一致。 算法因此可以始终获得正确位置,但是该算法的执行时间稍长于MonteCarlo算法(判断字符串是否相等的成本),而期望的时间复杂度不超过O(m n )。为了完成上述三种模式匹配算法的比较,需要0/1列的随机生成器和素数生成器。 程序中头文件“randstr.h”中包含的RandomString类用于生成MAXSIZE对的主字符串和模式字符串,0/1字符串的长度和内容是随机的,为了便于比较,主字符串的长度必须是模式“Random.h”包含封装了生成随机数的函数的random类。 素数生成器首先生成MAXSIZE个随机数,将其存储在prime数组中,并在随机算法中使用。 在本程序中随机生成10000比0/1列作为测试数据,MAXSIZE=10000。 defs.h定义要使用的常量。2 .算法分析与比较运行PatternMatching时,您可以看到1)3个算法的执行时间处于相同的数级。 其中,蒙特卡罗算法比KMP和LasVegas算法快,理论上分析蒙特卡罗算法的平均时间复杂度优于KMP算法,通常蒙特卡罗时间复杂度为o(mnn ),但在KMP的情况下为o(mnn ),而在KMP的情况下为o(mnn ) LasVegs预计比MonteCarlo慢一点。 因为判断字符串相等需要时间。 KMP和LasVegs算法的平均时间复杂度大致相等。2 )随机选择的素数的大小直接影响蒙特卡罗算法的错误率。 模式列不太长的情况下,像素数比某个个数大时,可知错误率下降到0。 若将图案列的最长设为m,则随机产生的像素数p2m时,将y和X(j )的p模型化的“指纹”Ip小于p,此时,p为|Y X(j)|,因此,在Ip(X(j)=Ip(y )时,不会误判定为X(j)Y,因此,在该情况下montt3 )当素数恒定时,MonteCarlo算法的错误率远小于理论值的1/n,即当Ip(X(j)=Ip(y )时,很少存在X(j)Y。 相反,像素数较小时,不同的0/1序列与对像素数进行模拟运算的结果相同的可能性变高,相应地错误率变大。4 )阵列的长度比主阵列小得多时,3个算法的执行时间明显快,KMP和蒙特卡罗算法的执行时间大致相等。 这也是容易理解的,模式列短意味着与主列的匹配成功的可能性高,算法能够在主列之前找到匹配列的位置,而且,模式列的长度小, 执行算法的时间较少,并且KMP时间的复杂度接近于O(m n ),与MonteCarlo算法等同。为了更好地解释问题,对p的大小和图案列的长度选择一些不同的测试数据,以下显示不同数据的执行结果(其中m、n分别是主列和图案列的长度,m、n、p都是在规定区间内随机取值)。1 )第一组:素数p2m经过测试,发现蒙特卡罗算法的错误率达到20%以上,这是不可接受的。 p越小,蒙特卡罗算法的错误率越大。2 )第二组:此时随机选择的素数p可能小也可能大,蒙特卡罗方法的错误率只有0.03%3 )第三组:取而代之的是,此时随机选择的素数必然大,MonteCarlo算法的错误率下降到04 )第四组: KMP算法和MonteCarlo算法的执行时间大致相同,MonteCarlo算法的错误率小,大致接近0。5 )第五组:取而代之,素数p表示16比特机器的最大整数和32位计算机表示最大整数时,MonteCarlo算法的错误率为0.07% 1/n3 .算法实现代码(程序中MAXSIZE=10000 )/文件名: PatternMatching.cpp/功能:实现并比较KMP、MonteCarlo、LasVegas三种模式匹配算法#include random.h #include randstr.h #include defs.h #include#include#include#include#include#include#include使用名称空间STD;一个人,一个人,一个人,一个人,一个人,一个人,一个人,一个人,一个人,一个人,一个人,一个人,一个人,一个人判断bool isprime(int n) /n是否为素数随机生成int random_prime(int min,int max) /1minmax-1之间的素数int KMP(char* s,char* t,int位置)/KMP算法获取int getIP(char *x,int len,int prime) x0xlen-1的指纹int MonteCarlo(char* x,char* y,int position,int prime) /MonteCarlo演算法int LasVegas(char* x,char* y,int位置,int prime) /LasVegas算法一个或多个网站,包括一个或多个网站,包括一个或多个网站/我想要的是/函数名称: isprime/功能:测试整数是否为质数/输出:如果n是素数,则返回true;否则返回falsebool isprime(int n )装模作样for(int i=2; I=sqrt (双精度) n ) I )if(n % i=0)return false;return true;以下称为/函数名称: random_prime/功能:随机生成1个min,max-1区间的素数int random_prime(int min,int max )装模作样int i;srand(int)time(0) )i=rand() % (max - min) min;for (; i=min; i- )if(isprime(i) break;return i;以下称为实现了三种模式匹配算法,包括:/ enterprise matching algority (模式匹配算法)/I、KMP算法/函数名称: KMP/功能:利用KMP算法匹配模式列/输入:主列s和样式列t/输出:图案列出现在主列的pos字符后面的位置int KMP(char* s,char* t,int pos )装模作样int i,j;int s_len=(int)strlen(s )int t_len=(int)strlen(t )/先求模式列t的nextint *next=new intt_len;i=0;j=-1;next0=-1;while(i t_len )装模作样if(j=-1 ) i; j; nexti=j; 以下称为else装模作样if(ti=tj) i; j; nexti=j; 以下称为else j=nextj;以下称为以下称为/重新匹配模式列,求出主列中的位置i=pos - 1;j=0;while(i s_len j t_len )装模作样if(j=-1 | si=tj) i; j; /继续比较后续字符else j=nextj; /图案列向右移动/delete next;if(j=t_len) return (i - t_len) 1;else return 0;以下称为/II,蒙特卡罗算法/函数名称: getIP/功能:求出数组x的指纹/输入: 01系列x、长度len输出: X(i)=xixi 1.xi len-1 mod p的指纹int getIP(char *x,int len,int p )装模作样int ip=0;for(int k=0; k=len -1; k )ip=(2 * ip xk - 0) % p;return ip;以下称为/函数名称:蒙特卡洛/功能:基于随机算法蒙特卡罗的模式匹配/输入:主列s和图案列t、随机素数p/输出:图案列出现在主列的pos字符后面的位置int MonteCarlo(char* x,char* y,int pos,int p )装模作样int j=0;int Ipx,Ipy,wp;int x_len=(int)strlen(x )int y_len=(int)strlen(y )/取指纹Ipx=getIP(x pos - 1,y_len,p )Ipy=getIP(y,y_len,p )计算2m mod pwp=1;for(int i=0; i y_len; I )wp=(wp * 2) % p;/开始匹配模式列while(j=x_len - y_len - pos 1)装模作样if(Ipx=Ipy) return j 1;else装模作样IPX=(2* IPX-WP * (x j -0 ) (x jy _ len -0 ) ) % p;if(Ipx 0) Ipx =p;if(Ipx=p) Ipx -=p;j;以下称为以下称为return 0;以下称为/III,LasVegas算法/函数名称: LasVegas/功能: MonteCarlo算法的改进,对于Ip(X(j)=Ip(Y ),比较X(j )和y是否相等,如果相等则返回/子字符串在主字符串中的位置。 否则,继续循环。 该算法总是给出正确的位置/输入:主列s和图案列t、随机素数p/输出:图案列出现在主列的pos字符后面的位置int LasVegas(char* x,char* y,int pos,int p )装模作样int j=0;int Ipx,Ipy,wp;int x_len=(int)strlen(x )int y_len=(int)strlen(y )/取指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 传统醋发酵工艺技术分析
- 绍兴文理学院元培学院《跨文化商务交际导论》2024-2025学年第一学期期末试卷
- 福建林业职业技术学院《微生物学基础及药用技术》2024-2025学年第一学期期末试卷
- 重庆三峡学院《制药工艺学》2024-2025学年第一学期期末试卷
- 湖南环境生物职业技术学院《界面设计导论》2024-2025学年第一学期期末试卷
- 安徽师范大学《电子资源的检索与利用》2024-2025学年第一学期期末试卷
- 广州康大职业技术学院《室内软装设计》2024-2025学年第一学期期末试卷
- 威海海洋职业学院《新媒体设计》2024-2025学年第一学期期末试卷
- 南昌航空大学科技学院《画法几何与工程制图》2024-2025学年第一学期期末试卷
- 天津医科大学《生态会展》2024-2025学年第一学期期末试卷
- 2025安徽龙亢控股集团有限公司招聘招聘21人笔试参考题库附带答案详解析集合
- T/CNCA 048-2023矿用防爆永磁同步伺服电动机通用技术条件
- 安装家具合同协议书范本
- 购买肉牛合同协议书
- 2025小学道德与法治教师课标考试模拟试卷附参考答案 (三套)
- 中国卒中患者高血压管理专家共识(2024)解读
- 小艇行业跨境出海战略研究报告
- 三会一课培训内容
- GB/T 45309-2025企业采购物资分类编码指南
- 膜性肾病护理进展
- 销售过程管理培训课件
评论
0/150
提交评论