最小圓覆蓋。神奇的隨機演算法。當點以隨機的順序加入時期望複雜度是線性的。
algorithm:
a、令ci表示為前i個點的最小覆蓋圓。當加入新點pi時如果pi不在ci-1裡那麼pi必定在ci的邊界上。
b、再從新考慮這樣乙個問題,ci為前i個點最小覆蓋圓且p在ci的的邊界上!同理加入新點pi時如果p
i不在ci-1裡那麼pi必定在ci的邊界上。這時我們就包含了兩個點在這個最小圓的邊界上。
c、再從新考慮這樣乙個問題,ci為前i個點最小覆蓋圓且有兩個確定點再邊界上!此時先讓
o(n)的方法能夠判定出最小圓。
analysis:
現在來分析為什麼是線性的。
c是線性的這是顯然的。
b<-c的過程中。考慮pi 他在園內的概率為 (i-1)/i 。在圓外的概率為 1/i 所以加入pi的期望複雜度為:(1-i)/i*o(1) +(1/i)*o(i) 這樣分析出來,複雜度實際上仍舊
是線性的。
a<-b的過程中。考慮方法相同,這樣a<-b仍舊是線性。於是難以置信的最小圓覆蓋的複雜度變成了線性的。
struct point
point[m];
double pow(double x)
double dist(point a,point b)
void circle(point p0,point p1,point p2,point &o)
void mincircle(point point,point &o,double &r,int n)//點集 圓心存於o,半徑r ,n點的個數}}
}
最小圓覆蓋
最小圓覆蓋問題 在乙個平面上,給出 n 個點,求包圍這些點的最小圓,輸出圓心及半徑。分析雖然可以用模擬退火或者三分套三分,這裡只講隨機增量法,隨機增量法是一種確定性演算法,隨機意義下均攤複雜度 o n 而且可以達到很高的精度 可達到 10 10 量級 有事實 如果點 p 不在集合 s 的最小圓覆蓋內...
最小圓覆蓋
本來不想學的 於是今天就碰到一道大裸題 例題 bzoj2823 求最小圓覆蓋n個點。偽 如下 把所有點隨機化,設為 x 1 y 1 x n y n 開始把圓心設為x 1 半徑設為0 for i 2ton 如果i號點在當前圓內則跳過 那麼i號點就在圓周上 把1號點和i號點作為直徑作乙個圓 for j ...
最小圓覆蓋
1.首先將所有點隨機排列 2.按順序依次將點加入已經建好的圓中,每新增乙個點就進入步驟3 3.如果點i在當前最小圓的外部,那麼說明點i一定在前i個點構成的最小圓的邊界上 因為要保證最小圓 進入步驟4處理 如果點i在當前最小圓的內部,則返回步驟2 4.此時已經確定點i一定在前i個點所構成的最小圓的邊界...