算法设计概率算法作业.docx
《算法设计概率算法作业.docx》由会员分享,可在线阅读,更多相关《算法设计概率算法作业.docx(12页珍藏版)》请在冰豆网上搜索。
算法设计概率算法作业
算法设计——概率算法作业
一.概率算法
二.源代码——概率算法
三.近似算法
一.概率算法
Ex1.假设将y←uniform(0,1)改成y←x,那么上述的算法估量的值是什么?
答:
k/n表示飞镖进入某一个区域内的概率,返回的值为4k/n。
因为:
x←uniform(0,1),y←x,在x和y知足x2+y2≤1时k++
因此:
当x<=√2/2时k++。
k/n表示在总的n次中k自加的概率,那个概率就等价为x<=√2/2的概率。
而x在[0,1]之间→x<=√2/2的概率就为√2/2,即k/n=√2/2。
因此:
现在返回值4k/n=2√2。
Ex2.在机械上用
估量π值,给出不同的n值及精度。
原理:
f(x)=√(1-x^2),先利用概率算法求数字积分,以后将积分结果乘以4即为PI值。
输入:
实验要利用的取值在[0,1]范围内的总点数
执行结果截图:
Ex3.设a,b,c和d是实数,且a≤b,c≤d,f:
[a,b]→[c,d]是一个持续函数,写一概率算法计算积分:
注意,函数的参数是a,b,c,d,n和f,其中f用函数指针实现,请选一持续函数做实验,并给出实验结果。
算法利用的持续函数为:
f(x)=x+
输入:
横坐标的范围[4,8],纵坐标的范围[0,12](产生的点的纵坐标是[0,12],函数值域为[8,12])。
执行结果截图:
EX4.用上述算法,估量整数子集1~n的大小,并分析n对估量值的阻碍。
算法分析:
不断从X={1,2,3,……n}中有放回的随机抽样,直到第一次抽出重复元素为止,现在已经抽到的元素数量为K,那么集合X的大小为:
2K^2/PI。
算法的执行结果:
分析:
在理论被骗集合n越大时,估量集合大小的误差应该越小。
可是可能是由于随机函数性能的问题,实验结果是随着n的增大,误差却愈来愈大。
Ex5.分析dlogRH的工作原理,指出该算法相应的u和v
解:
算法第一利用函数u(a,b)将a随机化为c,以后利用确信性算法dlog(g,p,c)计算出随机化后的输入实例的计算结果y,最后利用函数v(y,r)将y恢复为以a为输入实例的计算结果。
Steps:
1.产生一个随机值b
2.u(a,b)=bamodp=c
3.dlog(g,p,c)=logg,p(c)=y
4.v(y,r)=(y-r)mod(p-1)=s
s即为dlog(g,p,a)的值。
原理说明:
因为logg,p(c)=logg,p(abmodp)=[logg,p(a)+logg,p(b)]mod(p-1)
y=[logg,p(a)+logg,p(g^rmodp)]mod(p-1)
y=[logg,p(a)+r)]mod(p-1)(0<=r<=p-2)
logg,p(a)为输入实例为a的确信性算法的结果(即s):
s=logg,p(a)=(y-r)mod(p-1),而(y-r)mod(p-1)即为函数v(y,r)。
利用u(a,b)=bamodp将a随机化为c,以后利用v(y,r)=(y-r)mod(p-1)能够将y恢复为s,因此v和u能够实现:
将输入实例a随机化为c以后,把以c为输入的确信性算法的结果恢复为以a为输入时确信性算法的结果。
Ex6.写一Sherwood算法C,与算法A,B,D比较,给出实验结果。
算法C:
由于算法B是一个确信性算法(在[1,√n]中找小于等于x的最大的y),因此将算法B修改成一个随机算法。
修改方式为:
将从确信的区间[1,√n]中找y,更改成在[1,n]中随机掏出√n个值,在这√n值中找y。
以后再利用确信性算法Search(x,y)查找x。
修改方式的正确性说明:
因为“假设将val[1..n]中的n个整数看做是均匀随机散布的,那么在val[1..L]中求y值就相当于:
在n个整数中,随机地取L个整数,求这L个整数中不大于x的最大整数y。
”
因此在数组val的子区间[1,√n]中寻觅一个y就等价于在整个[1,n]中先选出√n个值、再在这些值中找一y。
因此将算法B中的在[1,√n]中找y--->在[1,n]中随机掏出√n个整数,在这√n个整数中找y,是正确的。
算法设计:
在一个已知的静态链表(其中每一个表项的含义是{data,rank})array[NUM]={{5,1},{7,8},{3,4},{0,2},{4,0},{11,7},{17,9},{14,6},{9,5},{20,10},{21,12},{25,13},{23,11},{30,15},{34,-1},{31,14}}中,别离利用A、B、C、D算法查找11的位置。
算法的执行结果:
Ex7.证明:
当放置(k+1)th皇后时,假设有多个位置是开放的,那么算法QueensLV选中其中任一名置的概率相等。
证:
设k+1行皇后共找到M个open位置,那么最后放入Mth位置的p=1/M;最后放入(M-1)的p为:
在Mth不取到1&&在(M-1)th取到1,p=1/(M-1)*(1-1/M)=1/M;最后放入(M-2)的p为:
在Mth不取到1&&在(M-1)th不取到1&&在(M-2)th取到1,p=1/(M-2)*(1-1/(M-1))*(1-1/M)=1/M,依次类推,可知关于找到的M个open位置,k+1皇后最终放置于哪个位置的概率都相等,均为1/M。
Ex8.写一算法,求n=12~20时最优的StepVegas值。
算法的执行结果:
Ex9.PrintPrimes{
源代码——概率算法
1.在机械上用
估量π值,给出不同的n值及精度。
()
#include<>
#include<>
#include<>
#include<>
doubleestimatePI(intn)
{
intk=0,times=n;doublex,y,temp;srand((int)time(0));
do
{
x=*rand())/*RAND_MAX);
y=*rand())/*RAND_MAX);
3.if((x*x+y*y)<=1)
#include<>
#include<>
#include<>
#include<>
#definePI
/*验证算法(输入大小为Exact_N的集合,运行算法,得出估量值N,将Exact_N与N进行比较),而且探讨集合的大小n与算法的成效(即估量值)的关系。
*/
intrandom_i(intN);
intlookup(intval,int*array,intlen);
intestimateSet(intExact_N)
{
int*S;写一Sherwood算法C,与算法A,B,D比较,给出实验结果。
(Ex6.)
#include<>
#include<>
#include<>
#include<>
#defineNUM16
structSLinklist{
intdata;
intn_index;
};
structSLinklistarray[NUM]={{5,1},{7,8},{3,4},{0,2},{4,0},{11,7},{17,9},{14,6},{9,5},{20,10},{21,12},{25,13},{23,11},{30,15},{34,-1},{31,14}};0]~[15]
#defineval(i)(array[i].data)
#defineptr(i)(array[i].n_index)
inthead=3;
srand((unsigned)time(0));
do{
random_index=rand()%NUM;
}while(val(random_index)>x);
intj=1;
for(;j<=sqrt(NUM);j++){n",count);
returnpos;
}
n",count);
returnpos;
}
intj=1;
for(;j<=sqrt(NUM);j++){
if(val(j)>max&&val(j)<=x){
max=val(j);
i=j;
}
}
intcount;
intpos=Search(x,j,&count);
printf("B算法比较了%d次.\n",count);
returnpos;
}
intmain()
{
intx=11;
intpos=C(x);
printf("C:
x=11'spositionis%d.\n",pos);
intcountA;
pos=Search(x,head,&countA);
printf("A算法比较了%d次.\n",countA);
printf("A:
x=11'spositionis%d.\n",pos);
intcountD,posD;
posD=D(x);
printf("D:
x=11'spositionis%d.\n",posD);
intcountB,posB;
posB=B(x);
printf("B:
x=11'spositionis%d.\n",posB);
exit(0);
}
/*
C算法解析:
B算法是一个确信性算法,将其的输入改成随机的sqt(NUM)个,也确实是将B改造成了shrewood算法。
*/
5.写一算法,求n=12~20时最优的StepVegas值(Ex8.)
#include<>
#include<>
#include<>
#include<>
#defineSUCCESS1
#defineFAIL0
#defineEMPTY-65536
intfailNodeNum,sumNodeNum,N;
int*try,*array135,*array45,*arrayCol;
voidalloc_array(intn)
{
try=(int*)malloc(sizeof(int)*(n+1));
array135=(int*)malloc(sizeof(int)*(n+1));
array45=(int*)malloc(sizeof(int)*(n+1));
arrayCol=(int*)malloc(sizeof(int)*(n+1));
}
voidfree_array()
{
free(try);
free(array135);
free(array45);
free(arrayCol);
}
voidinit(int*array,intn){
inti=0;
for(;i<=n;i++){
array[i]=EMPTY;
}
}
voidinit_all(intn)
{
init(try,n);
init(array135,n);
init(array45,n);
init(arrayCol,n);
failNodeNum=0,sumNodeNum=0;
}
alloc_array(N);
best_sv=-1,best_rate=;
tmp_sv=1;
for(;tmp_sv<=N;tmp_sv++){
init_all(N);
Obstinate(tmp_sv,N);
tmp_rate=(double)sumNodeNum;
if(tmp_ratebest_sv=tmp_sv;
best_rate=tmp_rate;
}
}
printf("当N=%d时,stepVages=%d.\n",N,best_sv);
free_array();
}
exit(0);
}
6.PrintPrimes{)
#include<>
#include<>
#include<>
externintBtest(inta,intn);
externintMillRab(intn);
externintRepeatMillRab(intn,intk);
externintPrintPrimes(intn);
externintPrintPrimesTotal();
externintget_exponent(inta,intb,intp);
i_float)*t);
if(get_exponent(a,temp,n)==(n-1))return1;
}
}
return0;
}
;;
似算法
1.G中最大团的size为α当且仅当G^m里最大团的size是m*α
证:
G^m是由各个G间彼此连接而成的
各个G中的最大团也彼此连通了
又
最大团即最大连通子图,各个G中的最大连通子图彼此连接便形成了G^m的最大连通子图
G^m的最大团==m个G的最大团相连
当G的团size(极点数)为a时,G^m的最大团大小就应该为m*a
当G^m的最大团大小为m*a时,断开在形成G^m时m个G彼此相连的边,易知m个G中的最大团大小就应该为a,因为每一个G都是一样的。