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


        与拉斯维加斯算法不同,蒙特卡罗算法可能会偶然地产生不正确的答案。假定解某个问题的蒙特卡罗算法,对该问题的任何实例得到正确解的概率为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<<"找不到主元素";
    }
  • 相关阅读:
    Windows下临界区的使用CRITICAL_SECTION
    MFC中消息映射的实现
    Oracle中提供的事件触发机制
    CreateEvent()详解
    内核参数优化之2-1 tcp/ip 标志位报文解析
    内核参数优化之1 keepalive解析
    python之7-3对象的信息/方法获取
    python之7-2类的继承与多态
    python之7-1类
    python之6-3嵌套函数
  • 原文地址:https://www.cnblogs.com/youxin/p/2530581.html
Copyright © 2020-2023  润新知