最小圓覆蓋問題

2021-08-19 18:43:22 字數 1863 閱讀 8039

最小圓覆蓋問題-乙個很經典的問題。

題目大概是,平面上n個點,求乙個半徑最小的圓,能夠覆蓋所有的點。

首先,我們可以從乙個空集r開始,不斷把平面上的點加入到r中,同時維護r的外接圓最小,就可以得到乙個簡單的解法。

另外一種想法是,先任意選取兩個點,以這兩個點的連線為直徑作圓。再以此判斷剩餘的點,看它們是否都在圓內(或圓上),如果都在,說明這個圓已經找到。如果沒有都在:假設我們用的最開始的兩個點為p[1],p[2],並且找到的第乙個不在圓內(或圓上)的點為p[i],於是我們用這個點p[i]去尋找覆蓋p[1]到p[i-1]的最小覆蓋圓。

要想求過確定點p[i]的從p[1]到p[i-1]的最小覆蓋圓,我們可以先用p[1]和p[i]做圓,再從2到i-1判斷是否有點不在這個圓上,如果都在,則說明已經找到覆蓋1到i-1的圓。如果沒有都在:假設我們找到第乙個不在這個圓上的點為p[j],於是我們用兩個已知點p[j]與p[i]去找覆蓋1到j-1的最小覆蓋圓。

而對於兩個已知點p[j]與p[i]求最小覆蓋圓,只要從1到j-1中,第k個點求過p[k],p[j],p[i]三個點的圓,再判斷k+1到j-1是否都在圓上,若都在,說明找到圓;若有不在的,則再用新的點p[k]更新圓即可。

於是,這個問題就被轉化為若干個子問題來求解了。

由於三個點確定乙個圓,我們的過程大致上做的是從沒有確定點,到有乙個確定點,再到有兩個確定點,再到有三個確定點來求圓的工作。

關於正確性的證明以及複雜度的計算這裡就不介紹了,可以去看完整的演算法介紹:

相關問題1:

海面上有一些船需要與陸地進行通訊,需要在海岸線上布置一些基站。現將問題抽象為,在x周上方,給出n條船的座標p1,p2,…,pn,pi=(xi,yi),xi>=0,yi<=d, 1<=i<=n,在x軸安防的基站可以覆蓋半徑為d的區域內所有點,問在x軸上至少要安放幾個點才可以將x軸上方的點都覆蓋起來。試設計乙個演算法求解該問題

設計思路:

首先將所有的點按橫座標從小到大進行排序。當點集不空的時候,每次取出最左邊的點,將該點視做圓周上的點,以該點到x軸上距離為d的點作為圓心,以d作為半徑,畫出乙個圓,然後去除掉包含在該圓內的點。然後繼續選出乙個最左的點,重複以上操作,直至點集為空,表示所有點都被覆蓋,此時得出的圓的個數就是所求答案.

相關問題2:

給定平面上n個點的座標,求能夠覆蓋所有這些點的最小矩形面積。

首先我們思考這樣乙個問題,給定平面上的n個矩形(座標為整數,矩形與矩形之間可能有重疊的部分),求其覆蓋的總面積。平常的想法就是開乙個與二維座標規模相當的二維boolean陣列模擬矩形的「覆蓋」(把矩形所在的位置填上true)。可惜這個想法在這裡有些問題,因為這個題目中座標範圍相當大(座標範圍為-10^8到10^8之間的整數)。但我們發現,矩形的數量n<=100遠遠小於座標範圍。每個矩形會在橫縱座標上各「使用」兩個值(矩形的上下、左右邊界), 100個矩形的座標也不過用了橫(縱)座標中-10^8到10^8之間的200個值。也就是說,實際有用的值其實只有這麼幾個。這些值將作為新的座標值重新劃分整個平面,省去中間的若干座標值沒有影響。我們可以將座標範圍「離散化」到1到200之間的數,於是乙個200*200的二維陣列就足夠了。實現方法正如本文開頭所說的「排序後處理」。對橫座標(或縱座標)進行一次排序並對映為1到2n的整數,同時記錄新座標的每兩個相鄰座標之間在離散化前實際的距離是多少(在離散化以後,實際上整個圖形空間變小了,這樣便於計算,但是對於每條線一定要有對應於原圖的對映,這樣才能計算出正確的面積,如下圖離散後的圖形中每個格對應的實際長寬都不同,實際面積也有不同)。

上述思想是離散化的乙個例項,可以看出離散化大大降低了空間開銷,在某些難以處理的問題上可以有效降低演算法時間複雜度,值得學習與借鑑。

最後,這些演算法和思想參考了很多的技術部落格,在此感謝原作者!

最小圓覆蓋

最小圓覆蓋。神奇的隨機演算法。當點以隨機的順序加入時期望複雜度是線性的。algorithm a 令ci表示為前i個點的最小覆蓋圓。當加入新點pi時如果pi不在ci 1裡那麼pi必定在ci的邊界上。b 再從新考慮這樣乙個問題,ci為前i個點最小覆蓋圓且p在ci的的邊界上!同理加入新點pi時如果p i不...

最小圓覆蓋

最小圓覆蓋問題 在乙個平面上,給出 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 ...