大資料演算法課程筆記2:2D Convex Hull
1. 題目簡介
Input:
Output: 包含所有點的最小凸多邊形的所有邊
2. 基本思想 :Divide and Conquer
先把點集一分為二,分別求取相應凸多邊形,然後對兩個凸多邊形合併。
3. 具體演算法
- sort
P={pi} fori=1⋯n , such thatx1<x2<⋯xn - divide
P intoPL andPR equally by picking the median ofX ,xmedian . ThenPL={pi} iff.x , andPR=P−PL - After division, do it recursively.
- Merge: that’s the difficult part and we will expand it in detail.
4. 融合兩個凸多邊形
這部分是對具體演算法第四部分的展開。
輸入是兩個點集以及包含相應點集的最小凸多邊形,且有兩個點集的
討論包含所有點的最小凸多邊形的性質。筆者能夠想到的最簡單的方法就是列舉任意三個點,然後對所有三個點所構成的三角形取並集。
但這個演算法明顯是
如下圖所示,黑色菱形為已經計算好的兩個凸多邊形。對兩者進行融合,其實是去尋找合理的兩條紅邊,只需要討論紅邊應該具有什麼性質即可。
這個性質很直接了,凸多邊形應該包含點集裡面的所有點,並且因為是凸多邊形,即所有角度數小於180°。
綜上所述,對於上面的紅邊,應該有點集裡面的所有點都比紅邊低,否則比紅邊高的點將不會被包含在以紅邊為邊的所有凸多邊形內。
形式化上訴結論有:
這是一個只有兩個變數的線性規劃問題,後面會解釋,求解此問題複雜性為
得到紅邊之後,逐一比較
5. 整體演算法的時間複雜度
如上所訴,有
6. 演算法複雜性與資料性質的關係
若N極大,則複雜性為
O(1) 。證明:因為推廣N到
inf ,則覆蓋全域,凸多邊形為包含全域的凸多邊形。若已知最終的凸多邊形的邊數一定,為
h 。則複雜性最終為O(Nlogh) 。證明:將求解凸多邊形問題轉換為求解凸多邊形所有邊的問題,進而可以將其轉換為求解凸多邊形上邊和下邊的問題。
易證凸多邊形的頂點中必然存在
(x1,y1) 和(xN,yN) ,其中x1=min(x),xN=max(x) 。 然後對凸多邊形的邊根據pmin 和pmax 進行劃分,分為上邊集和下邊集,上邊集和下邊集交集為NULL,並集為所有邊,上邊位於所有下邊上方。如下圖所示,紅邊為上邊,黑邊為下邊。
上邊和下邊的數目最多為
假設