主元素問題(蒙特卡洛法和分治法)

2021-10-25 18:13:04 字數 2292 閱讀 3051

主元素問題描述

設t為乙個有n個元素的陣列,當t中某個元素x的個數大於n/2時,稱x為t的主元素。

蒙特卡洛演算法簡介

蒙特卡洛演算法(monte carlo),是一種不確定性化演算法,並無法保證一定能夠得到正確的答案。

設p是乙個實數,且1

2<

p<

1\frac21

​<

p<

1,如果乙個蒙特卡羅演算法對於問題的任一例項得到正確解的概率不小於p, 則稱該蒙特卡羅演算法是p正確的,且稱p−1

2p-\frac

p−21

​是該演算法的優勢。

設mc(x)是解某個判定問題d的蒙特卡羅演算法,若

(1)當mc(x)返回true時,解總是正確的;

(2)當mc(x)返回false時,解有可能是錯的。

稱這類蒙特卡羅演算法為偏真演算法。

設y 0y_

y0​是所求解問題的乙個特殊解答,如判定問題的 true。對於乙個解給定問題的蒙特卡羅演算法mc(x),如果存在問題例項的子集x使得: (1)當x∈x

x\in x

x∈x時,mc(x)返回的解是正確的; (2)當x∉x

x\notin x

x∈/​

x時,正確解是y0y_

y0​,但mc(x)返回的解未必是y0y_

y0​。稱上述演算法 mc(x)是偏y0y_

y0​的演算法。

蒙特卡洛演算法解主元素問題

演算法隨機選擇陣列元素x,由於陣列t的非主元素個數小於n/2,所以,x不為主元素的概率小於1/2。因此判定陣列t的主元素存在性的演算法是乙個偏真1/2正確的演算法。50%的錯誤概率是不可容忍的,利用重複呼叫技術將錯誤概率降低到任何可接受的範圍內。對於任何給定的ϵ

>

0\epsilon>0

ϵ>

0,重複呼叫log

(1/ϵ

)log(1/\epsilon)

log(1/

ϵ)次演算法majority。它是乙個偏真蒙特卡羅演算法,且其錯誤概率小於ϵ

\epsilon

ϵ。所需的計算時間顯然是o(n

log(

1/ϵ)

)o(nlog(1/\epsilon))

o(nlog

(1/ϵ

))。**如下:

#include #include #include #include #include using namespace std;

#define n 10

bool majority(int *t, int len, int &num)

bool majoritymc(int *t, int len, double e, int &num)

n1​,n2n_

n2​,若n1=

n2

n_=n_

n1​=n2

​,則陣列t的主元素為n1n_

n1​,若n1≠

n2

n_\neq n_

n1​​=

n2​,則分別驗證n1n_

n1​,n2n_

n2​在陣列**現的個數是否大於n/2,滿足者即為陣列t的主元素,若都不滿足則陣列t沒有主元素。

**如下:

#include #include #include #include using namespace std;

#define n 10

int partition(int *t, int l, int r)

int m = (l+r)/2;

int n1 = partition(t, l, m);

int n2 = partition(t, m+1, r);

if(n1 == n2)

return n1;

else

int half = (l+r)/2;

if(cnt1 > half)

return n1;

else if(cnt2 > half)

return n2;

else

return int_max;

}}int main()

; cout<<"陣列t的元素如下:"

cout << "該陣列的主元素為:" << partition(t, 0, n-1) << endl;

else

cout << "該陣列沒有主元素" << endl;

return 0;

}

蒙特卡洛法

蒙特卡洛 monte carlo 方法,或稱計算機隨機模擬方法,是一種基於 隨機數 的計算方法。這一方法源於 美國在第二次世界大戰進研製原子彈的 曼哈頓計畫 該計畫的 主持人之 一 數學家馮 諾伊曼用馳名世界的賭城 摩納哥的monte carlo 來命名這種方法,為它蒙上了一層神秘色彩。monte ...

民科解釋蒙特卡洛法

蒙特卡羅方法於20世紀40年代美國在第二次世界大戰中研製原子彈的 曼哈頓計畫 計畫的成員s.m.烏拉姆和j.馮 諾伊曼首先提出。數學家馮 諾伊曼用馳名世界的賭城 摩納哥的monte carlo 來命名這種方法,為它蒙上了一層神秘色彩。先看看wiki的解釋 蒙特卡羅方法 英語 monte carlo ...

蒙特卡洛法求圓周率

利用蒙特卡洛演算法求圓周率是乙個概率的方法,關於這方面的內容很多,而且也很容易理解,更多具體分析過程可以參考如下文章 下面是我的理解和 蒙特卡洛演算法是通過概率來計算pi的值的。對於乙個單位為1的正方形,以其某乙個頂點為圓心,邊為半徑在正方形內畫扇形 乙個1 4的圓形的扇形 那麼扇形的面積就是pi ...