版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
算法设计与分析
徐班
SA18011072
一、概率算法部分
1.求“近似值的算法:若将y-uniforms,1)改为y-x,则上述的算法估计的值是什么?
解:改为y-x,最终值为4Xt=2a.
2.在机器上用41广淳dx估计n值,给出不同的n值及精度。
解:运行代码:
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<iostream>
#defineN1000000
usingnamespacestd;
voidHitorMiss()
(
doublex,y,Jx;
intent=0;
srand((unsigned)time(NULL));
for(inti=0;i<N;i++)
(
x=(double)rand()/RAND_MAX;
y=(double)rand()/RAND_MAX;
f_x=sqrt(1-x*x);
if(y<Lx)cnt++;
}
cout«4.0*cnt/N«endl;
)
intmain()
HitorMiss();
systemCpause");
return0;
)
运行结果为:
n值结果精度
100003.17362
1000003.136763
10000003.141613
100000003.141084
1000000003.141634
10000000003.141575
3.设a,b,c和d是实数,且251),©8£1,£忸,0一©田是一个连续函数,写一概率算法计算积
分:/(x)dx-
解:运行代码:
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<iostream>
usingnamespacestd;
//MC积分函数
voidMC(doublea,doubleb,doublec,doubled,double(*func)(double));
//测试函数
doubletest(doublex);
intmain()
(
MC(0,4,-1,8,test);
system(npause");
return0;
)
voidMC(doublea,doubleb,doublec,doubled,double(*func)(double))
intent=0,n=100000000;
doublex,y,f_x;
srand((unsigned)time(NULL));
for(inti=0;i<n;i++)
(
x=a+(b-a)*(double)rand()/RAND_MAX;
y=c+(d-c)*(double)rand()/RAND_MAX;
Jx=func(x);
if(y<f_x&&y>0)cnt++;
if(y<0&&y>f_x)ent—;
)
cout«36.0*cnt/n«endl;
)
doubletest(doublex)
(
returnx*x-2*x;
)
运行结果为:
n值结果精度
100005.5081
1000005.296682
10000005.316122
100000005.335963
1000000005.336883
10000000005.333944
4.若I是的正确值,h是由HitorMiss算法返回的值,则当n2甯时,有:
Prob[|h-I|<e]>1—6.
解:任取n>空出,设H(n)为n次命中的次数,则H(n)=nh为一个二项分布E[H(n)]=nLD[H(n)]
=nl(l-l),利用切比雪夫不等式:
Prob[|h—I|<e]=Prob--------E(-------I<£>1-------------=1------——=1------------
n\n九£/
由于则爷因此Prob[|h-I]<旬二1一3.
5.用上述算法,估计整数子集1~11的大小,并分析n对估计值的影响。
解:运行代码:
#include<ctime>
#include<set>
#include<random>
#include<cstdlib>
#include<iostream>
usingnamespacestd;
#defineN1000000
#definePl3.1415926
intmain()
{
random_devicerd;
uniform_int_distribution<>dist(l,N);
longlongnumber=dist(rd);
doublecount=0;
set<int>myset;
for(inti=0;i<50;i++)
(
do
{
myset.insert(number);
count++;
number=dist(rd);
}while(myset.find(number)==myset.end());
myset.clear();
)
count/=50;
longlongresult=(longlong)(2.0*count*count/PI);
cout«result«endl;
cout«"err:\t"«1.0*abs(N-result)/N«endl;
system(Hpausen);
return0;
运行结果为:
n值估计值误差
1000096373.63%
10000011771017.71%
100000089498310.50%
1000000095605264.39%
1000000001070118497.01%
6.分析dlogRH的工作原理,指出该算法相应的u和v
解:dlogRH采用了SherWood算法进行随机化的预处理
该算法的C代码为:
intdlogRH(intg,inta,intp)
{
r=uniform(0..p-2);
b=ModularExponent(g,r,p);//^<g=brmodp,随机取其中一个元素
c=mod(b*a,p);//((grmodp)(gxmodp))modp=gr+xmodp=c,将实例x转化为实例y
y=logg,pc;〃实验确定性算法求logp,gc,y=r+x
return(y-r)mod(p-1);
)
在该算法中u为:((grmodp){gxmodp))modp=gr+xmodp=c
V为:(logp,g(st)modp)=(logp,gS+logpgt)mod(p-1)
7.写一Sherwood算法C,与算法A,B,D比较,给出实验结果。
解:运行代码:
#include<iostream>
#include<cmath>
#include<random>
#include<cstdlib>
#include<iostream>
usingnamespacestd;
#definetarget1
intn=15,head=7;
intval[15]={2,5,10,7,4,14,8,1,9,6,11,13,12,15,3);
intptr[15]={14,9,10,6,1,13,8,0,2,3,12,5,11,100,4};
intsearch(intx,inti);
intA(intx);〃确定性O(n)算法
intB(intx);〃确定性为O(W)的确定性算法
intC(intx);〃在算法B基础上改进的SherWood算法
intD(intx);〃时间为O(n)的概率算法
intmain()
(
cout«A(target)«endl;
cout«B(target)«endl;
cout«C(target)«endl;
cout«D(target)«endl;
systemCpause");
return0;
)
intsearch(intx,inti)
(
return0;
)
intA(intx)
{
returnsearch(x,head);
)
intB(intx)
(
inti二head;
intmax=val[i];
inty;
for(intj=0;j<sqrt(float(n));j++)
(
y=val[j];
if(max<y&&y<=x)
(
max=y;
i=j;
)
return(search(x,i)+(int)sqrt((float)n));
intC(intx)
random_devicerd;
uniform_int_distribution<>dist(O,n-1);
inti=dist(rd);
intmax=val[i];
inty;
for(intj=0;j<sqrt(float(n));j++)
(
inttemp=dist(rd);
y=val[temp];
if(max<y&&y<=x)
(
max=y;
i=temp;
)
)
returnsearch(x,i)+(int)sqrt((float)n);
)
intD(intx)
(
random_devicerd;
uniform_int_distribution<>dist(0,n-1);
inti=dist(rd);
inty=val[i];
if(x<y)
returnsearch(x,head);
elseif(x>y)
returnsearch(x,ptr[i]);
else
returni;
运行结果为:
查找对象A算法比较次数B算法比较次数C算法比较次数D算法比较次数
10330
21331
32431
43553
54334
65430
76336
87437
98538
109333
11104410
1211546
1312639
1413734
1514859
均值74.46673.44.7333
8.证明:当放置(k+l)th皇后时,若有多个位置是开放的,则算法QueensLV选中其中任一位
置的概率相等。
证明:假设放置k+1个皇后时,有nb个位置是开放的,分别极为a,b...i...nb
那么第a个位置被选到的概率为1*;*9…*匕*…*号=白
23Inbnb
第b个位置被选中的概率为;*|*...*—*...*独厂二白
23Inbnb
第i个位置被选中的概率为工*3*…*号=2
I1+1nbnb
第nb个位置被选到的概率为々
nb
所以算法QueensLV选中其中任一位置的概率为
9.写一算法,求n=12〜20时最优的StepVegas值。
解:运行代码:
#include<cmath>
#include<random>
#include<ctime>
#include<cstdlib>
#include<iostream>
usingnamespacestd;
#defineN12
#defineRUN_TIME100
intx[N+1]={0};
boolplace(intk);
voidbacktrace(intstep);
intQueenLV(intStepVegas);
intmain()
(
intStepVegas,time_now,time_end;
for(StepVegas=1;StepVegas<=N;StepVegas++)
(
intj=0,sucess=0;
time_now=clock();
do
(
while(!QueenLV(StepVegas));
backtrace(StepVegas+1);
if(x[N]!=0)
(
sucess++;
//cout«"sucess="«sucess«endl;
for(inti=1;i<=N;i++)
x[i]=0;
)
j++;
}while(j<RUN.TIME);
cout«"-------------StepVegas="«StepVegas«---------------"«endl;
cout«“Run”<<RUN.TIME«"times;';
cout«”sucess"«sucess«"times!,n;
cout«"sucessrateisn«100.0*sucess/RUN_TIME«end);
time_end=clock();
cout«"Ittakes"«(time_end-time_now)*1000/CLOCKS_PER_SEC/sucess;
cout«”tosolvethisproblem"«endl;
)
system("pausen);
return0;
)
boolplace(intk)
(
fbr(intj=l;j<k;j++)
{
if((abs(k-j)==abs(x[j]-x[k]))||x[j]==x[k])
returnfalse;
returntrue;
)
voidbacktrace(intstep)
(
if(step>N)return;
for(inti=1;i<=N;i++)
(
x[step]=i;
if(place(step))
backtrace(step+1);
)
)
intQueenLV(intStepVeags)
{
random_devicerd;
intline=1,nb=1,j=0;
while((line<=StepVeags)&&(nb>0))
(
nb=0;
j=0;
for(inti=1;i<=N;i++)
(
x[line]=i;
if(place(line))
(
nb++;
uniform_int_distribution<>dist(l,nb);
if(dist(rd)==l)j=i;
)
}
if(nb>0)x[line++]=j;
)
if(nb>0)
returntrue;
else
returnfalse;
运行结果为:
N=12时,
StepVegas运行时间/ms正确率
162.51100
26.82100
31.07100
40.2755198
50.16867583
60.16923165
70.2536
80.38461526
90.45161331
100.4418643
110.43100
121.54100
从运行结果来看,当StepVegas=5,6时运行时间最少,且正确率较高。
N=13时,
StepVegas运行时间/ms正确率
1352.19100
235.27100
34.63100
40.8100
50.2608792
60.15853782
70.2244949
80.33333333
90.41935531
100.38888936
110.57540
120.59100
131.9100
从运行结果来看,当StepVegas=6时运行时间最少,且正确率较高。
N=14时,
StepVegas运行时间/ms正确率
12044.94100
2187.77100
321.84100
43.099199
50.65656699
60.2790786
70.21126871
80.28571442
90.46428628
100.51612931
110.7225
120.85714342
130.58100
142.65100
从运行结果来看,当StepVegas=7时运行时间最少,且正确率较高。
N=15时,
StepVegas运行时间/ms正确率
113645.8100
21122.44100
3112.77100
416.03100
52.53100
60.61702194
70.27586287
80.28070257
90.435
100.61538526
110.56666730
120.61290331
130.71153852
140.75100
153.18100
从运行结果来看,当StepVegas=7,8时运行时间最少,为7时正确率较高。
当N大于15,运行时间较长,从上面几个可以看出,当StepVegas=N/4~N/2范围内,效果较
好。
10.PrintPrimes{//打印1万以内的素数
print2,3;
n—5;
repeat
ifRepeatMillRab(n,)thenprintn;
n<—n+2;
untiln=10000;
)
与确定性算法相比较,并给出10070000以内错误的比例。
解:运行代码:
#include<set>
#include<random>
#include<cmath>
#include<cstdlib>
#include<iostream>
usingnamespacestd;
#defineN100
#definePI3.1415926
boolBeast(inta,intn);〃判断强伪素数
boolMiller_Rabin(intn);//MR算法
boolRepeat_Miller_Rabin(intk,intn);//MR算法重复K次
boolsimple(intn);//简单确定算法
intmain()
(
set<int>myset;
for(inti=101;i<10000;i+=2)
(
if(simple(i))
myset.insert(i);
)
for(inti=101;i<10000;i+=2)
(
if(Repeat_Miller_Rabin((int)log((float)i),i))
{
if(myset.find(i)==myset.end())
cout«"MR算法找到的“wi«“不是素数”<<endl;
myset.erase(i);
)
)
if(myset.size()==0)cout«"MR算法完全正确!”<vendl;
else
(
set<int>::iteratorit;
cout«”MR算法没有找到的素数:n«endl;
for(it=myset.begin();it!=myset.end();it++)
cout«*it«n\t";
cout«endl;
)
system("pausen);
return0;
boolBeast(inta,intn)
ints=0,t=n-1,x=1;
do
(
S++;
t/=2;
}while(t%2==0);
for(inti=0;i<t;i++)
x=x*a%n;
if(x==1||x==n-1)
returntrue;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学暑假实习报告范文集合四篇
- 春季开学典礼校长演讲稿集合5篇
- 大学毕业生自我鉴定(8篇)
- 幼儿教师辞职申请书集锦9篇
- 地理教师教学工作计划范文
- 顺驰太阳城二期可行性研究报告
- 休闲食品的品牌战略比较
- 七年级语文下册教学工作总结
- 借款约束协议书(2篇)
- 2025年果蔬自动清选、分级设备合作协议书
- 2024年新进员工试用期考核标准3篇
- 《英美文化概况》课件
- 四川省2023年普通高中学业水平考试物理试卷 含解析
- 2024-2025学年人教版八年级上学期数学期末复习试题(含答案)
- 【MOOC】中级财务会计-北京交通大学 中国大学慕课MOOC答案
- 2024年医院康复科年度工作总结(4篇)
- 《园林政策与法规》课件
- 扬尘防治(治理)监理实施细则(范本)
- 五金耗材材料项目投标方案(技术方案)
- 读书分享《终身成长》课件
- GB/T 44843-2024在用自动扶梯和自动人行道安全评估规范
评论
0/150
提交评论