尋找最遠點對

2021-06-07 01:57:47 字數 1135 閱讀 2556

在乙個實際專案中遇到「尋找最遠點對」問題,猛然想起《程式設計之美》擴充套件問題提到過,開心地翻出來看,卻發現「最近點對」的思路套「最遠」貌似不合適。

然後開始查文獻、做實驗,改進演算法,困擾半天也發現了不少實際問題,寫出來大家參考。最後,演算法用到系統中,雖然沒有大幅提高遺傳演算法效率,但是系統評價功能明顯比原來快了n倍,可謂酣暢:)

找回昔日研究《程式設計之美》感覺~~

給定平面上n個點的座標,找出距離最遠的兩個點。

如果我們希望在城市道路網上設感測器,用以追蹤車輛。那麼這些感測器布應該設在**,布設多少?

首先來看看問題規模,例如:某城市二環內共有4210個路段,每個路段上有「設定/不設定」兩種可能,那麼所有可能的方案數為:

假設希望路網中不存在「行駛很遠而不被追蹤到的路徑」,那麼可以認為「用盡量少的感測器分割路網達到安全標準」的方案是優秀的。

對於這麼大規模的問題,可以採用遺傳演算法(ga)進行優化求解。而在ga中,需要對每乙個方案進行評估(按照一定的標準)。

那麼,評估過程中,為了找出「行駛很遠而不被追蹤到的路徑」,需要找到「最遠點對」。

類似於「最近點對問題」,這個問題也可以用列舉的方法求解,時間複雜度o(n^2)。

「尋找最近點對」是用到分治策略降低複雜度,而「尋找最遠點對」可利用幾何性質。注意到:對於平面上有n個點,這一對最遠點必然存在於這n個點所構成的乙個凸包上(證明略),那麼可以排除大量點,如下圖所示:

在得到凸包以後,可以只在頂點上面找最遠點了。同樣,如果不o(n^2)兩兩枚舉,可以想象有兩條平行線, 「卡」住這個凸包,然後卡緊的情況下旋轉一圈,肯定就能找到凸包直徑,也就找到了最遠的點對。或許這就是為啥叫「旋轉卡殼法」。(當然這個方法還能解決凸包很多別的問題  )

總結起來,問題解決步驟為:

1. 用graham's scanning求凸包

2. 用rotating calipers求凸包直徑,也就找到了最遠點對。

該演算法的平均複雜度為o(nlogn) 。最壞的情況下,如果這n個點本身就構成了乙個凸包,時間複雜度為o(n^2)。

尋找最遠點對

問題 給定平面上n個點的座標,找出距離最遠的兩個點。分析類似於 最近點對問題 這個問題也可以用列舉的方法求解,時間複雜度o n 2 尋找最近點對 是用到分治策略降低複雜度,而 尋找最遠點對 可利用幾何性質。注意到 對於平面上有n個點,這一對最遠點必然存在於這n個點所構成的乙個凸包上 證明略 那麼可以...

尋找最遠點對

問題 給定平面上n個點的座標,找出距離最遠的兩個點。分析類似於 最近點對問題 這個問題也可以用列舉的方法求解,時間複雜度o n 2 尋找最近點對 是用到分治策略降低複雜度,而 尋找最遠點對 可利用幾何性質。注意到 對於平面上有n個點,這一對最遠點必然存在於這n個點所構成的乙個凸包上 證明略 那麼可以...

尋找最遠點對

問題 給定平面上n個點的座標,找出距離最遠的兩個點。分析類似於 最近點對問題 這個問題也可以用列舉的方法求解,時間複雜度o n 2 尋找最近點對 是用到分治策略降低複雜度,而 尋找最遠點對 可利用幾何性質。注意到 對於平面上有n個點,這一對最遠點必然存在於這n個點所構成的乙個凸包上 證明略 那麼可以...