幾何與代數演算法

禮品包裝法(gift-wrapping algorithm)

禮品包裝法(gift wrapping)建立凸包的方式,正如你徒手包禮物:先在一個確定的外側點別住包裝紙,再把紙拉緊到下一個能把其餘所有點都包住的點,再別住,如此繞一圈,直到回到起點。每一步找出一個新的凸包頂點,所以這個演算法名副其實地一次產生一條邊、依序產出凸包邊界。它是最直覺的凸包方法,即使不一定最快,也是很好的心智模型。

機制上,從一個保證在凸包上的點開始——比如最左點。要找下一個凸包頂點,掃過所有剩餘點,挑出最「順時針」的那個 C(等價地說,使得其他每個點都落在「從目前頂點到 C」這條有向邊的左側)。你用方向測試來判定:若三元組「目前點、B、C」為順時針(表示 C 包得更緊),候選 C 就勝過目前最佳的 B。把 C 設為下一個頂點,從那裡重複。當你包回起點時停止。每個新頂點需要對所有點做一次完整的 O(n) 掃描,而你每個凸包頂點做一次,故總時間為 O(n*h),其中 h 是凸包上的頂點數。

這個 O(n*h) 成本就道盡了何時該用它。若凸包只有少數頂點——比如點分散到邊界上只有 h = 5 個——禮品包裝法便宜得驚人,實際上接近線性,而且完全不需排序。但若幾乎所有 n 個點都坐落在凸包上(想想圓上的點),則 h 約等於 n,成本暴漲到 O(n^2),比葛立恆掃描或單調鏈的 O(n log n) 還差。所以禮品包裝法是「對輸出量敏感」的:輸出小時快,輸出大時慢。預期凸包很小時用它;否則偏好以排序為基礎的方法。

點集 {(0,0),(4,0),(4,4),(0,4),(2,2)},起點 (0,0)。掃描找最順時針的下一點 -> (0,4)(或 (4,0),視方向而定);假設逆時針走,得到 (4,0)。從 (4,0) 包得最緊的是 (4,4);從 (4,4) 是 (0,4);從 (0,4) 回到 (0,0)。四次掃描、四個頂點:h = 4,成本 4*n。

每次掃描包到下一個凸包頂點;成本 O(n*h),當 h 很小時很棒。

禮品包裝法對輸出量敏感:唯有凸包很小(h 很小)時 O(n*h) 才勝過 O(n log n);當多數點都在凸包上時退化為 O(n^2)。

又称
Jarvis marchJarvis's march賈維斯步進包裝禮物法