二維幾何 點集直徑

2021-08-29 20:33:53 字數 1128 閱讀 9772

點集直徑,即給定點之間的最大距離。兩兩枚舉的方法需要o(n^2)時間,並不是很優秀。

有乙個辦法可以更快的求出點集的直徑。首先求點集的凸包,則最大距離一定來自於凸包上的兩個頂點。由於凸包上的點的個數往往比原始點少很多,就算還是兩兩枚舉,速度也比直接列舉快很多,當然最壞情況下時間複雜度仍是o(n^2),需要繼續改進。

假設我們已經找到了直徑,端點為pi和pj,現在我們分別從pi和pj出發各作一條垂直於pipj的直線。

可以證明,整個凸包都被夾在了這兩條直線中間。如果不然,不妨設pi的下方有乙個凸包的點p『,則連線p』pj,假設和下面那條直線交於q,則p『pj>pjq>pipj與 pipj是直徑矛盾,為了方便,我們把兩條直線看成是有向直線,使得凸包位於兩條直線的左側。

像pipj這樣存在兩條分別穿過這兩個點的平行直線,把凸包夾在中間的點被稱為對踵點對。給定乙個角,有無數條以它為傾角的平行直線,但其中只有兩條能把凸包緊緊的夾在中間,因此對踵點最多只有四對(一邊兩個點),這樣,我們可以用一種稱為旋轉卡殼的方式找出所有對踵點對。

初始時,有兩條有向直線把凸包夾在中間,一條水平向右,一條水平向左,這是可以求出初始對踵點為pi和pj(就是y座標最小和最大點)。接下來,逆時針旋轉兩條直線,看看對踵點對是如何變化的。假設穿過pi的有向直線還需要逆時針旋轉

如果大於180度時終止。由於每次旋轉至少會有一條直線貼出新的邊,旋轉過程的時間複雜度為o(n)

既然最遠點對只會在對踵點中取到,只需在上述過程中每找到一對新的對踵點對時更新答案,就可以求出最遠點對。

注意,上述演算法知識乙個概念描述,下面的**是實用的寫法。

首先給出輔助函式:

兩點距離的平方.

int dist(point a, point b)

求點集直徑,返回點集直徑的平方

int diameter(point *p, int n)

v = (v+1) % n; //面積峰值也隨著u的移動而移動

}return ans;

}

二維幾何模板 二維幾何基礎

二維幾何模板 include include include include include include include include include using namespace std 二維幾何基礎 struct point typedef point vector const doub...

二維幾何 點類,常量設定

這些 未經過測試,存在安全隱患。const double eps 1e 8 const double dnf 1e20 const double pi acos 1.0 const int maxp 1010 浮點型數值是否為0 intsgn double x 返回x的平方 double sqr d...

二維幾何 平面最近點對

存個模板 是用分治寫的時間複雜度 nlogn 但是本題好像還有一種玄學做題法 我們充分發揚人類智慧型 將所有點全部繞原點旋轉同乙個角度,然後按x座標排序 根據數學直覺,在隨機旋轉後,答案中的兩個點在陣列中肯定不會離得太遠 所以我們只取每個點向後的5個點來計算答案 這樣速度快得飛起,在n 100000...