蒙特卡罗算法 求数组主元素

    与拉斯维加斯算法不同,蒙特卡罗算法可能会偶然地产生不正确的答案。假定解某个问题的蒙特卡罗算法,对该问题的任何实例得到正确解的概率为p,并且有1/2<p<1,则称该蒙特卡罗算法是p正确的,该算法的优势为p-1/2;如果对同一个实例,该蒙特卡罗算法不会给出两个不同的正确答案,就称该算法是一致的,第一个一致的p正确的蒙特卡罗算法,如果重复第运行,每一次运行都独立地进行随机的选择,就可以使产生不正确答案的概率变得任意小。

  用蒙特卡罗算法求数组主元素,随机地选择一个元素进行测试,如果它是主元素,就返回true,否则返回false,然后再对这个算法进行进一步的处理。

  

#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
using namespace std;

/*
求数组主元素
输入:n个元素的数组A[]
输出:数组A的主元素
算法检测不出主元素的错误概率小于E
*/
bool majority(int a[],int &x,int n,double e)
{
    int t,s,i,j,k;
    bool flag=false;
    srand(time(NULL));
    s=log(1/e);
    for(t=1;t<=s;t++)
    {
        i=rand()%n;  //i [0,n-1]
        k=0;
        for(j=0;j<n;j++)
            if(a[i]==a[j])
                k++;
        if(k>n/2)
        {
            x=a[i]; 
            flag=true; 
            break;
        }
    }
    return flag;
}

int main()
{
    int n;
    
    cout<<"请输入数组大小";
    cin>>n;
    int *a=new  int[n];
    cout<<"请输入数组各元素"<<endl;
    for(int i=0;i<n;i++)
    {
        int tmp=rand()%4;
        a[i]=tmp;
    }
    for(int i=0;i<n;i++)
        cout<<a[i]<<ends;
    cout<<endl;
    double e;
    cout<<"请输入检测不出主元素的错误概率e";
    cin>>e;
    int x;
    if(majority(a,x,n,e))
        cout<<"主元素为 "<<x;
    else 
        cout<<"找不到主元素";
}
原文地址:https://www.cnblogs.com/youxin/p/2530581.html