最大三角形的問題已經回答了,但我現在面臨的主要問題是在理解一個答案..在凸包
從 https://stackoverflow.com/a/1621913/2673063
如何算法O(n)
以下?通過首先對點/計算凸包(在O(n log n)時間內)進行排序(如果有必要),我們可以假設我們有凸多邊形/船體,點以它們的順序循環排序出現在多邊形中。調用點1,2,3 ...,n。讓(可變的)點A,B和C分別以1,2和3開始(以循環順序)。我們將移動A,B,C直到ABC是最大面積三角形。 (這個想法類似於計算直徑(最遠對)時使用的旋轉卡尺方法。)在A和B固定的情況下,前進C(例如最初,其中A = 1,B = 2,C是隻要區域(A,B,C)≤區域(A,B,C + 1),只要三角形的面積增加,即通過C = 3,C = 4,...)。此點C將是那些使固定的A和B的面積(ABC)最大化的點(換句話說,作爲C的函數,功能面積(ABC)是單峯的。)改變A和C),如果這增加了面積。如果是這樣,再次推進C如上。如果可能,再次提前B等。這將給出與A最大的區域三角形作爲其中一個頂點。 (到這裏的部分應該很容易證明,並且簡單地爲每個A單獨做這個會給O(n2),但繼續閱讀。)現在再次提前A,如果它改善了面積等等。 雖然這有三個「嵌套」循環,注意B和C總是前進,並且它們總共最多前進2n次(同樣A最多前進n次),所以整個事件都運行在O(n)時間。
對於A的一個值,這不正確嗎?我認爲B和C可以再次迭代另一個A的值? – aiccha
@aiccha - 隨着代碼被呈現在那裏,這聽起來可能,因爲'B'和'C'環繞數組。然而,根據描述,這種包裝並不是必要的:在看代碼之前,我想到了阻止'B'和'C'前進'n'的方法。在那種情況下,肯定會是'O(n)'。隨着代碼的提出,我不確定。由於某些數學原因,「B」和「C」仍然可以在整個算法中僅迭代「O(n)」次,但我無法證明這一點。我也不能證明不環繞是正確的。 – IVlad