蒙特卡洛算法—主元素问题
-
基本概念: 蒙特卡罗算法又称统计模拟法、随机抽样技术,是随机化算法的其中一类,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样。蒙特卡罗算法用于求解问题的准确解(比如问题的解是“是”,“否”这样二者必选其一的问题),但无法有效的判定得到的解是否正确。
-
基本思想:
(1)通过使用随机数(或伪随机数)来解决问题;
(2)使用计算机来实现随机抽样;
(3)采样越多,越有可能接近最优解,强调每一次随机抽样都是在进步的过程;
(4)算法的时间复杂性与采样的规模和错误解的可接受概率有关。 -
主元素问题:
设T[n]是有n个元素的数组,当|{i|T[i]=x}|>n/2,则称x为数组T的主元素。对于给定的数组T[]={8,7,6,8,8,8}。求T[]是否含有主元素。
求解过程分析:
(1)蒙特卡罗算法:在0—n-1之间生成一个随机数i,通过生成的随机数得到数组中的一个元素T[i],遍历数组看这个元素是否为主元素,是则返回True,否则返回False;
(2)若返回的结果是True,则说明这个数组中一定含有主元素;当返回的结果是False的时候,数组中也未必不含有主元素,可能数组中含有主元素,但随机选择的数x不是主元素;
(3)通过多次调用算法,来保证得到正确解的概率。 -
判断数组是否含有主元素过程:
-
判断数组是否含有主元素算法:
RandomNumber rnd;
template
bool Majority(Type *T,int n)
{
int i=rnd.Random(n)+1;
Type x=T[i];
int k=0;
for(int j=1;j<=n;j++)
if(T[j]==x)
k++;
return(k>n/2);
}
从上可看出,当得出的结果是错误的时候,说明非主元素的个数<n/2,因此,结果返回False的概率小于1/2,则返回True的概率>1/2。 存在50%的错误概率。很显然,50%的错误概率是不能接受的,因此,我们就需要通过多次进行抽样即多次调用该算法来降低错误解的概率。
RandomNumber rnd;
Temple
bool Majority(Type *T,int n){
int i=rnd.random(n)+1;
Type x=T[i]; /随机选择数组元素作为判别元素
int k=0;
for(int j=1;j<=n;j++)
if(T[j]==x)
k++;
return(k>n/2);
}
Temple
bool Majority2(Type *T,int n,double e){
int k=ceil(log(1/ ε)/log(2)); /调用MC次数
for(int i=1;i<=k;i++)
if(Majority(T,n))
return true;
return false;
}