我们为什么要研究概率算法呢?其实在实际中我们会发现,有时候随机选择结果比花费时间去做最优选择的结果要好的多(即概率算法的期望时间非常的可观);且有时利用确定性算法求不出问题的解,而利用随机算法则总是可以求得问题的近似解,例如我们求f(x)=sin2((100)!πx),f(x)在[0,1]上的积分。所以概率算法也称随机决策算法,是基于概率论、统计学理论基础的。概率算法对同一输入实例的不同次执行会给出不同的解,即解的结果不可再现。所以可能会出现最坏的可能性,但是对于期望时间来说概率算法却具有重要意义。
总得来说其特点是:1)期望时间可观;2)结果不可再现性; 3)基于概率论、数理统计等;
概率算法包括:(1)Numerical概率算法;(2)Sherwood算法;(3)Las Vegas算法;(4)Monte Carlo算法;
以下在讲完随机数产生原理后我们再详细探讨这每一种算法的特点及应用。我们利用在C中rand()是怎么产生一个个不同的数的呢,这些数字是否有一定的规律呢?其实,是有的。因为现实中不可能真正的随机数发生器,因此我们用就通过一个数(来作为种子)利用某个公式来产生一个数,而这个新产生的数又会作为输入通过公式产生另一个数,如此,每次新产的的数都会作为下次计算的种子,从而产生新的数。所以,如果每次都采用相同的数作为种子的话,那么每次产生的新数就会一样。对于种子的选择在加密算法中要求较高,这里就不探讨了。
uniform(a,b){ //随机产生a~b之间的一个数
srand(time(NULL));
return ((b-a)*rand()/(double)RAND_MAX+a);
}
(一)Numerical概率算法
数字概率算法得到的是数字问题的近似解,但是随着算法执行时间的增加,解的精度就越高误差越小。不过也不可能无限执行,因为长时间运行会导致硬件产生错误。应用如;求积分;求集合大小(势);矩阵相乘、求逆、特征值和特征向量等等。
eg、集合X={x1,x2,.........,xn};求集合X的大小n值?(在X中随机均匀独立的取元素,直到第一次出现重复之前所选的元素为止,此时已选出的元素数为k,则有n=2*k*k/π)。
Count (X) {
k ← 0; S ← Ф;
a ← uniform(X);
do {
k++;
S ← S∪{a};