凸包問題 (用分治演算法)

2021-09-30 00:04:57 字數 1045 閱讀 4151

問題描述:

在平面上有n個點,其中任何三個點都不在一條直線上,問如何尋找乙個點集,使得這些點構成的多邊形剛好能把所有點都包進。

基本思想:

我們採用分治演算法。首先算出這n個點的橫座標中位數,記為x0,畫出直線x=x0,將整個平面分成兩部分。我們要做的就是分別求兩部分的凸包,最後再合併即可。利用分治和遞迴的結合,該問題就迎刃而解了。

難點解析:

本問題最難的部分在於兩個凸包的合併過程。為此,我小小的翻了一下牆,在youtube上學習了mit的思想,現在和大家分享一下。假設直線左側的凸包外圍點按照順時針分別記為a1,a2,…,ai,右側凸包的外圍點按照順時針分別記為b1,b2,…,bj(如圖所示)

我們先將a1,b1連起來,在中線上的交點記為o1

接著,右側點順時針移動乙個點,變成a1,b2,交點為o2,但是我們發現o2比o1位置更低,因此右側點還是回到b1,接著左側點逆時針移動到a4,連線a4,b1,發現交點o3更高了

如法炮製,右側點順時針移動,發現交點又變低,於是左側點逆時針移動,也變低了,因此我們就可以確認,a4,b1就是合併後凸包的上邊沿了。同理,下邊沿也按照相同的操作完成。

最後合併時,只要沿a4或a3逆時針移動一圈,保留有用的點就可以了。

由於我也是第一次接觸這樣的做法,因此還未完全實現這種演算法合理性的證明和**的實現,還請大家見諒哈

分治演算法 凸包

凸包是正好包含所有點的凸邊形,之所以叫凸包,是因為凸中包含了凸多邊形包圍起來的所有點 我們要寫的是找出凸包的頂點集,使用分治演算法 首先,連線最左端和最右端的兩點。命名線上方的區域為上包,下方位下包,將兩點加入到頂點集合 然後,找到與直線距離最遠的兩點,與第一步中的兩點相連,劃分為上包和下包,新找出...

分治法 凸包問題

什麼是凸包?我的理解就是,圖形任意兩點的連線都沒有在圖形外部。問題 給定點集,怎麼求出凸包的邊界點呢?第一步 給這些點按照x的從大到小進行排序,如果x相同的按照y再排序。第二步 把x最小的和最大的連起來,他們必為凸包的邊界點。第三步 把平面區域分為兩個部分,分別在上面和下面去找面積最大的三角形 面積...

凸包問題之分治法

凸包 按橫座標排序,以最小點與最大點之間的連線為準,在直線一側找使三角形面積最大的點,此點必在凸包內,以找到點與最大點或最小點繼續遞迴以尋找最大三角形面積尋找凸包點,直至找不到符合條件的點。實現 如下 include include include define max size 10001 str...