rectangle

minimum enclosing rectangle

二維平面的矩形,包圍所有點。可令面積最小、令周長最小。

凸包,旋轉卡尺。O(NlogN)。

UVa 819 10173 ICPC 5138

UVa 12307

minimum enclosing box / minimum bounding box

三維空間的長方體,包圍所有點,體積最小。

三維旋轉卡尺?正確性不明。O(N³)。

UVa 12308

maximum empty rectangle

Largest Empty Rectangle among a Point Set. Jeet Chaudhuri, Subhas C. Nandy. 1999.

O(N³)。

maximum empty axis-parallel rectangle

二維平面的矩形,不含任何點,矩形擺正,面積最大。

平面邊界四個角落補點,窮舉每一點當作矩形左(與右)邊界,然後依序掃描右方(與左方)的點作為右(左)邊界,掃描過程中隨時更新上下邊界。另外,矩形的左右邊界可能是平面的左右邊界。O(N²)。

divide-and-conquer method。O(Nlog³N)。

UVa 10043

minimum enclosing square annulus

二維平面的方環,包圍所有點。可令寬度最小、令面積最小。

ICPC 6121

maximum weight axis-aligned rectangle

二維平面上有許多點,每個點有權重,有正有負。找到一個擺正的矩形,內部所有點的權重總和最大。

O(N²)。

circle

minimum enclosing circle

二維平面的圓,包圍所有點,面積暨周長暨半徑最小。

一個圓包圍所有點,半徑相對伸縮後,一個點歸屬所有圓。

【待補圖片】

最佳化。coordinate descent改良版。O(Nlog²R)。

固定參數,問題簡化為圓心X座標未知、Y座標已知。觀察每種X座標的半徑,恰是單峰函數(谷形)。Y座標微調,仍是單峰函數。未知已知對調,仍是單峰函數。兩者皆未知,形成二維單峰函數。兩層trisection method,X座標逐步走到最低處,Y座標總是走到最低處。求X座標O(logR)回合,求Y座標O(logR)回合,每回合枚舉所有點以求得半徑。總時間複雜度O(Nlog²R)。

圓心位於farthest point Voronoi diagram頂點。O(NlogN)。

randomized incremental method。平均O(N),最差O(N²)。

以遞增法求最小包圍圓,逐次添加一點,並且調整最小包圍圓。若新點在圓內,不做任何事;若新點在圓外,則新點一定在新圓上,但是本來的點就不一定在新圓上了。於是得到新問題:已知一點在圓上,求最小包圍圓。接著又得到新問題:已知兩點在圓上,求最小包圍圓。已知兩點時,以枚舉法掃描所有點,找到最遠的點。

添加一點的時間複雜度分成兩種情況:圓不變、圓變動。因為無法預測變動,所以窮舉各種結果、反推變動機率。各種結果是新圓上有兩點、有三點。現有i點、已知一點在圓上,因此新點導致新圓的機率是(2-1)/i、(3-1)/i。添加一點的平均時間複雜度是O(1),添加N點的平均時間複雜度是O(N)。原始問題以此類推,平均時間複雜度O(N)。

UVa 10005 11681

minimum enclosing ball / minimum bounding sphere

三維空間的球,包圍所有點,體積暨表面積暨半徑最小。

最佳化。coordinate descent改良版。O(Nlog³R)。

Welzl's algorithm。平均O(N)。

UVa 10095

minimum k enclosing circle

二維平面的圓,包圍k個點,面積暨周長暨半徑最小。

order k Voronoi diagram。O(NlogN + k²N)。

二元搜尋半徑r。窮舉每個點,作為圓邊界,顯然圓心與該點相距r。旋轉的掃描線,圓繞該點一圈。O(logR ⋅ N ⋅ NlogN)。

承上,只取鄰點來掃描,以該點為中心,取正方形邊長4r之內所有點,確保點數低於k(16r²)/(πr²) < 5.1k。range tree。O(logR ⋅ N ⋅ (klogk + log²N))。

ICPC 7488

maximum empty circle / maximum inscribed circle

二維平面的圓,不含所有點和邊,面積暨周長暨半徑最大。

一群點最大空圓:圓心位於Voronoi diagram的頂點上。如果平面有邊界,那麼圓心也可能在邊上。O(NlogN)。

凸多邊形最大內切圓:每條邊同時往垂直方向等速內縮。每條邊配合左右鄰邊的角平分線,就可求得消失所需距離。換個觀點,不內縮了,改為預測最快消失的邊,刪除此邊,左右鄰邊延長銜接於一點,就縮小問題範疇了。所有邊放入二元樹,按照消失順序排序,每當刪除一條邊就更新二元樹。O(NlogN)。

凸多邊形最大內切圓:二元搜尋內切圓半徑,以半平面交集驗證。O(NlogR)。

UVa 11257 ICPC 3890

簡單多邊形最大內接圓。【待補文字】

正交多邊形最大內接圓。【待補文字】

ICPC 2994

minimum enclosing annulus

二維平面的環,內圍外圍圓心相同,包圍所有點。可令寬度最小、令面積最小。

建立Voronoi diagram與farthest point Voronoi diagram,窮舉三種情況。O(N²)。

一外三內:窮舉外點;窮舉圓心,即Voronoi diagram的點。O(N²)。
兩外兩內:窮舉Voronoi diagram的邊,
     窮舉farthest point Voronoi diagram的邊,
     兩邊求交點,作為圓心。O(N²)。
三外一內:窮舉內點;窮舉圓心,即farthest point Voronoi diagram的點。O(N²)。

maximum empty annulus

triangle

minimum enclosing triangle

二維平面的三角形,包圍所有點。可令面積最小、令周長最小。

maximum empty triangle

二維平面的三角形,不含任何點,面積最大。

當平面沒有邊界,這個問題沒有討論意義;把三角形壓扁、拉長,即不含任何點、面積無限大。

如果設定了三角形的角度範圍,那麼就有討論意義了。

如果給定的平面擁有一個長方形邊界,然後多邊形是凸的呢?
這個時候就不會有面積無限大的多邊形了吧?

不是凸的形狀,就只能採用「頂點屬於給定的點集合」。
若是凸的形狀(如三角形、長方形、凸多邊形、圓形),
除了可以採用「頂點屬於給定的點集合」,
也可以採用「邊界碰到給定的點集合」。

這種時候就不知道如何命名了。

UVa 10112

convex polygon

minimum enclosing convex polygon = convex hull

凸多邊形,包圍所有點,面積暨周長最小。

即「convex hull」。

maximum empty convex polygon
(largest empty convex subset)

凸多邊形,不含任何點,一群點挑幾個點作為頂點。可令頂點最多、令面積最大、令周長最大。

頂點最多:點線對偶,掃描線。O(N³)。

minimum enclosing convex k-gon

凸k邊形,包圍所有點,可令面積最小、令周長最小。

extremum empty convex k-gon
(largest empty convex subset)

凸k邊形,不含任何點,一群點挑k個點作為頂點,可判斷是否存在、令面積最小最大、令周長最小最大。

判斷是否存在:NP-hard。

面積周長最小最大:O(kN³)。

面積周長最大:O((kN + NlogN) ⋅ logN)。運用「SMAWK algorithm」得加速到O(kN + NlogN)。

ICPC 2674

extremum convex k-gon

凸k邊形,一群點挑k個點作為頂點。可判斷是否存在、令面積最小最大、周長最小最大。

判斷是否存在,即「Erdős–Szekeres conjecture」。

演算法同上。

extremum convex hull of k points

凸多邊形,邊界暨內部恰有k個點。可判斷是否存在、令面積最小最大、周長最小最大。

演算法同上。

polygon

minimum simple polygon

簡單多邊形,所有點作為頂點,可令面積最小、令邊長最小。

NP-hard。

UVa 12386

longest segment in simple polygon

簡單多邊形,內部最長線段。

最長線段:必然碰到其中兩個頂點,否則可以旋轉線段變得更長。窮舉兩頂點,計算線段與多邊形交點。O(N³)。

最長對角線:O(N(logN)³)。

ICPC 4756

maximum convex polygon in simple polygon
(potato peeling)

簡單多邊形,內部最大凸多邊形。把凹凹凸凸削平。

O(N⁷)。