随机算法比较Word格式文档下载.docx
- 文档编号:17191550
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:14
- 大小:108.15KB
随机算法比较Word格式文档下载.docx
《随机算法比较Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《随机算法比较Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
#include<
iostream>
time.h>
stdlib.h>
sys/timeb.h>
usingnamespacestd;
constintCOUNT=100000;
//数的对数
constintMAXLEN=500;
intx[COUNT];
inty[COUNT];
intlenx[COUNT];
intleny[COUNT];
//素数的生成
intget_prime(intnum)
{
intm=(num*num)*2;
if(m<
=250)
{
return211;
}
elseif(m<
=500)
return461;
=1000)
return953;
=5000)
return1957;
=10000)
return9233;
else
return100003;
}
//获取已知长度的随机数
intgetrandom_num(intlen)
inttemp=0;
while(len>
16)
temp=temp<
<
16;
len=len-16;
temp+=rand();
temp=temp<
len;
temp=temp+rand()%(1<
len);
returntemp;
//获取一个二进制数串的第n位
intget_n_bit(intnum,intn,intlen)
num=num>
>
(len-n);
num=(num%2);
returnnum;
//初始化数据
voidinit()
srand((int)time(NULL));
for(inti=0;
i<
COUNT;
i++)
lenx[i]=rand()%MAXLEN;
//随机一个2进制长度
leny[i]=rand()%MAXLEN;
x[i]=getrandom_num(lenx[i]);
//随机该长度的数
y[i]=getrandom_num(leny[i]);
//获取i[x]mopp后的值get_len为获取的长度,all_len为总长,pos是开始的位置prime_num是素数
intget_ip(intnum,intget_len,intall_len,intpos,intprime_num)
(all_len-get_len+1-pos);
inta=1<
get_len;
--a;
//获得get_len长全为1的串
num=num&
a;
num=num%prime_num;
//获取子串
intget_string(intnum,intall_len,intget_len,intpos)
//KMP
voidgetNext(intnext[],inty,intlen)
intj,k;
next[0]=-1;
j=0;
k=-1;
while(j<
len-1)
if(k==-1||get_n_bit(y,j+1,len)==get_n_bit(y,k+1,len))//匹配的情况下,p[j]==p[k]
{
j++;
k++;
next[j]=k;
}
else//p[j]!
=p[k]
k=next[k];
boolKMP(intx,inty,intlenx,intleny)
if(leny==0)
returntrue;
intnext[64];
inti,j;
i=0;
getNext(next,y,leny);
while(i<
lenx)
if(j==-1||get_n_bit(x,i+1,lenx)==get_n_bit(y,j+1,leny))
i++;
else
j=next[j];
if(j==leny)
returntrue;
returnfalse;
//MonteCarlo算法
boolmontecarlo(intx,inty,intlx,intly)
if(leny==0)
intp=get_prime(lx);
//取随机数;
intj=1;
intipx=get_ip(x,ly,lx,1,p);
//算Ip[x]Ip[y]
intipy=get_ip(y,ly,ly,1,p);
while(j<
=lx-ly+1)
if(ipx==ipy)
else//算Ip[x+1]
ipx=((ipx<
1)-((1<
ly)%p)*get_n_bit(x,j,lx)+get_n_bit(x,j+ly,lx))%p;
ipx=ipx<
0?
ipx+p:
ipx;
ipx=ipx>
p?
ipx-p:
++j;
//LASVegas算法(找y是x的子串)
boollasvegas(intx,inty,intlx,intly)
if(get_string(x,lx,ly,j)==y)
{
returntrue;
}
voidmain()
init();
intCount1=0;
intCount2=0;
intCount3=0;
intsum=0;
struct_timebtstruct1;
//时间格式
struct_timebtstruct2;
inttime;
inti;
cout<
"
长度为"
MAXLEN<
位的"
COUNT<
对随机生成数据对的子串匹配结果的比较:
endl;
//KMP
_ftime(&
tstruct1);
//start
for(i=0;
i<
COUNT;
{
if(lenx[i]>
=leny[i])
/*montecarlo*/
if(KMP(x[i],y[i],lenx[i],leny[i]))
Count3++;
tstruct2);
//end
***************************************"
KMP算法"
子串的数:
Count3<
time=(tstruct2.time*1000+tstruct2.millitm)-(tstruct1.time*1000+tstruct1.millitm);
使用时间:
time<
ms"
//MonteCarlo算法
if(montecarlo(x[i],y[i],lenx[i],leny[i]))
Count1++;
MonteCarlo算法:
找子串的数:
Count1<
floatf=(float)(Count1-Count3)*100/COUNT;
出错比率为"
f<
%"
//LASvegas算法
if(lasvegas(x[i],y[i],lenx[i],leny[i]))
Count2++;
LasVegas算法"
cout<
Count2<
floatg=(float)(Count2-Count3)*100/COUNT;
g<
system("
pause"
);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 随机 算法 比较
![提示](https://static.bdocx.com/images/bang_tan.gif)